Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(api): Optionally suppress warning about logger being overwritten #3366

Merged
Merged
6 changes: 6 additions & 0 deletions api/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

All notable changes to this project will be documented in this file.

## Unreleased

### Features

* Optionally suppress warning about logger being overwritten ([#3366](https://www.github.com/open-telemetry/opentelemetry-js-api/pull/3366))

## [1.2.0](https://www.github.com/open-telemetry/opentelemetry-js-api/compare/v1.1.0...v1.2.0) (2022-08-09)

### Features
Expand Down
31 changes: 16 additions & 15 deletions api/src/api/diag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
ComponentLoggerOptions,
DiagLogFunction,
DiagLogger,
DiagLoggerApi,
DiagLogLevel,
} from '../diag/types';
import {
Expand All @@ -34,7 +35,7 @@ const API_NAME = 'diag';
* Singleton object which represents the entry point to the OpenTelemetry internal
* diagnostic API
*/
export class DiagAPI implements DiagLogger {
export class DiagAPI implements DiagLogger, DiagLoggerApi {
private static _instance?: DiagAPI;

/** Get the singleton instance of the DiagAPI API */
Expand Down Expand Up @@ -65,9 +66,9 @@ export class DiagAPI implements DiagLogger {

// DiagAPI specific functions

self.setLogger = (
logger: DiagLogger,
logLevel: DiagLogLevel = DiagLogLevel.INFO
const setLogger: DiagLoggerApi['setLogger'] = (
logger,
optionsOrLogLevel = { logLevel: DiagLogLevel.INFO },
) => {
if (logger === self) {
// There isn't much we can do here.
Expand All @@ -80,10 +81,16 @@ export class DiagAPI implements DiagLogger {
return false;
}

if (typeof optionsOrLogLevel === 'number') {
optionsOrLogLevel = {
logLevel: optionsOrLogLevel,
};
}

const oldLogger = getGlobal('diag');
const newLogger = createLogLevelDiagLogger(logLevel, logger);
const newLogger = createLogLevelDiagLogger(optionsOrLogLevel.logLevel ?? DiagLogLevel.INFO, logger);
// There already is an logger registered. We'll let it know before overwriting it.
if (oldLogger) {
if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {
const stack = new Error().stack ?? '<failed to generate stacktrace>';
oldLogger.warn(`Current logger will be overwritten from ${stack}`);
newLogger.warn(
Expand All @@ -94,6 +101,8 @@ export class DiagAPI implements DiagLogger {
return registerGlobal('diag', newLogger, self, true);
};

self.setLogger = setLogger;

self.disable = () => {
unregisterGlobal(API_NAME, self);
};
Expand All @@ -109,15 +118,7 @@ export class DiagAPI implements DiagLogger {
self.error = _logProxy('error');
}

/**
* Set the global DiagLogger and DiagLogLevel.
* If a global diag logger is already set, this will override it.
*
* @param logger - [Optional] The DiagLogger instance to set as the default logger.
* @param logLevel - [Optional] The DiagLogLevel used to filter logs sent to the logger. If not provided it will default to INFO.
* @returns true if the logger was successfully registered, else false
*/
public setLogger!: (logger: DiagLogger, logLevel?: DiagLogLevel) => boolean;
public setLogger!: DiagLoggerApi['setLogger'];
/**
*
*/
Expand Down
25 changes: 25 additions & 0 deletions api/src/diag/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,28 @@ export enum DiagLogLevel {
export interface ComponentLoggerOptions {
namespace: string;
}

export interface LoggerOptions {
logLevel?: DiagLogLevel;
suppressOverrideMessage?: boolean;
}

export interface DiagLoggerApi {
/**
* Set the global DiagLogger and DiagLogLevel.
* If a global diag logger is already set, this will override it.
*
* @param logger - [Optional] The DiagLogger instance to set as the default logger.
* @param options - [Optional] And object which can contain `logLevel: DiagLogLevel` used to filter logs sent to the logger. If not provided it will default to INFO. The object may also contain `suppressOverrideMessage: boolean` which will suppress the warning normally logged when a logger is already registered.
* @returns true if the logger was successfully registered, else false
*/
setLogger(logger: DiagLogger, options?: LoggerOptions): boolean;

/**
*
* @param logger - [Optional] The DiagLogger instance to set as the default logger.
* @param logLevel - [Optional] The DiagLogLevel used to filter logs sent to the logger. If not provided it will default to INFO.
* @returns true if the logger was successfully registered, else false
*/
setLogger(logger: DiagLogger, logLevel?: DiagLogLevel): boolean;
}