Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 21 additions & 32 deletions src/api/diag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export class DiagAPI implements DiagLogger {
function _logProxy(funcName: keyof DiagLogger): DiagLogFunction {
return function () {
const orgArguments = arguments as unknown;
const theLogger = getGlobal('filteredDiagLogger') || _noopLogger;
const theLogger = self.getLogger();
const theFunc = theLogger[funcName];
if (typeof theFunc === 'function') {
return theFunc.apply(
Expand All @@ -64,44 +64,28 @@ export class DiagAPI implements DiagLogger {
};
}

function getLevel(): DiagLogLevel {
return getGlobal('diagLogLevel') ?? DiagLogLevel.INFO;
}

// Using self local variable for minification purposes as 'this' cannot be minified
const self = this;

// DiagAPI specific functions

self.getLogger = (): DiagLogger => {
return getGlobal('diagLogger') || _noopLogger;
return getGlobal('diag') || _noopLogger;
};

self.setLogger = (logger?: DiagLogger): DiagLogger => {
const previous = getGlobal('diagLogger') || _noopLogger;

unregisterGlobal('diagLogger');
unregisterGlobal('filteredDiagLogger');

const newLogger = logger || _noopLogger;
registerGlobal('diagLogger', newLogger);
registerGlobal(
'filteredDiagLogger',
createLogLevelDiagLogger(getLevel(), newLogger)
);
self.getLoggingDestination = () => {
return getGlobal('diag')?.getLoggingDestination() ?? _noopLogger;
};

return previous;
self.setLogger = (
logger: DiagLogger = _noopLogger,
logLevel: DiagLogLevel = DiagLogLevel.INFO
) => {
registerGlobal('diag', createLogLevelDiagLogger(logLevel, logger));
};

self.setLogLevel = (maxLogLevel: DiagLogLevel) => {
const logger = self.getLogger();
unregisterGlobal('diagLogLevel');
unregisterGlobal('filteredDiagLogger');
registerGlobal('diagLogLevel', maxLogLevel);
registerGlobal(
'filteredDiagLogger',
createLogLevelDiagLogger(maxLogLevel, logger)
);
self.disable = () => {
unregisterGlobal('diag');
};

for (let i = 0; i < diagLoggerFunctions.length; i++) {
Expand All @@ -119,17 +103,22 @@ export class DiagAPI implements DiagLogger {
/**
* Set the DiagLogger instance
* @param logger - [Optional] The DiagLogger instance to set as the default logger, if not provided it will set it back as a noop
* @param logLevel - [Optional] The DiagLogLevel used to filter logs sent to the logger, if not provided it will default to INFO
* @returns The previously registered DiagLogger
*/
public setLogger!: (logger?: DiagLogger) => DiagLogger;

/** Set the default maximum diagnostic logging level */
public setLogLevel!: (maxLogLevel: DiagLogLevel) => void;
public setLogger!: (logger?: DiagLogger, logLevel?: DiagLogLevel) => void;

// DiagLogger implementation
public verbose!: DiagLogFunction;
public debug!: DiagLogFunction;
public info!: DiagLogFunction;
public warn!: DiagLogFunction;
public error!: DiagLogFunction;

/**
* Unregister the global logger and return to Noop
*/
public disable!: () => void;

public getLoggingDestination!: () => DiagLogger;
}
16 changes: 7 additions & 9 deletions src/diag/logLevel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
* limitations under the License.
*/

import { DiagAPI } from '../api/diag';
import { DiagLogger, DiagLogFunction, createNoopDiagLogger } from './logger';
import { diag } from '..';
import { DiagLogger, DiagLogFunction, FilteredDiagLogger } from './logger';

/**
* Defines the available internal logging levels for the diagnostic logger, the numeric values
Expand Down Expand Up @@ -81,19 +81,15 @@ const levelMap: { n: keyof DiagLogger; l: DiagLogLevel }[] = [
export function createLogLevelDiagLogger(
maxLevel: DiagLogLevel,
logger?: DiagLogger | null
): DiagLogger {
): FilteredDiagLogger {
if (maxLevel < DiagLogLevel.NONE) {
maxLevel = DiagLogLevel.NONE;
} else if (maxLevel > DiagLogLevel.ALL) {
maxLevel = DiagLogLevel.ALL;
}

if (maxLevel === DiagLogLevel.NONE) {
return createNoopDiagLogger();
}

if (!logger) {
logger = DiagAPI.instance();
logger = diag.getLoggingDestination();
}

function _filterFunc(
Expand All @@ -116,11 +112,13 @@ export function createLogLevelDiagLogger(
return function () {};
}

const newLogger = {} as DiagLogger;
const newLogger = {} as FilteredDiagLogger;
for (let i = 0; i < levelMap.length; i++) {
const name = levelMap[i].n;
newLogger[name] = _filterFunc(logger, name, levelMap[i].l);
}

newLogger.getLoggingDestination = () => logger!;

return newLogger;
}
10 changes: 8 additions & 2 deletions src/diag/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ export interface DiagLogger {
verbose: DiagLogFunction;
}

export interface FilteredDiagLogger extends DiagLogger {
getLoggingDestination(): DiagLogger;
}

// DiagLogger implementation
export const diagLoggerFunctions: Array<keyof DiagLogger> = [
'verbose',
Expand All @@ -75,12 +79,14 @@ function noopLogFunction() {}
* @implements {@link DiagLogger}
* @returns {DiagLogger}
*/
export function createNoopDiagLogger(): DiagLogger {
const diagLogger = {} as DiagLogger;
export function createNoopDiagLogger(): FilteredDiagLogger {
const diagLogger = {} as FilteredDiagLogger;

for (let i = 0; i < diagLoggerFunctions.length; i++) {
diagLogger[diagLoggerFunctions[i]] = noopLogFunction;
}

diagLogger.getLoggingDestination = () => diagLogger;

return diagLogger;
}
8 changes: 2 additions & 6 deletions src/internal/global-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@

import { diag } from '..';
import { ContextManager } from '../context/types';
import { DiagLogger } from '../diag/logger';
import { DiagLogLevel } from '../diag/logLevel';
import { FilteredDiagLogger } from '../diag/logger';
import { _globalThis } from '../platform';
import { TextMapPropagator } from '../propagation/TextMapPropagator';
import type { TracerProvider } from '../trace/tracer_provider';
Expand Down Expand Up @@ -91,10 +90,7 @@ type OTelGlobal = {
type OTelGlobalAPI = {
version: string;

diagLogger?: DiagLogger;
filteredDiagLogger?: DiagLogger;
diagLogLevel?: DiagLogLevel;

diag?: FilteredDiagLogger;
trace?: TracerProvider;
context?: ContextManager;
propagation?: TextMapPropagator;
Expand Down
23 changes: 8 additions & 15 deletions test/diag/logLevel.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ describe('LogLevelFilter DiagLogger', () => {

beforeEach(() => {
// Set no logger so that sinon doesn't complain about TypeError: Attempted to wrap xxxx which is already wrapped
diag.setLogger();
diag.setLogLevel(DiagLogLevel.INFO);
diag.disable();

// mock
dummyLogger = {} as DiagLogger;
Expand Down Expand Up @@ -164,8 +163,7 @@ describe('LogLevelFilter DiagLogger', () => {
});

it('should use default logger for undefined and log', () => {
diag.setLogger(dummyLogger);
diag.setLogLevel(DiagLogLevel.ALL);
diag.setLogger(dummyLogger, DiagLogLevel.ALL);
const testLogger = createLogLevelDiagLogger(map.level, undefined);
testLogger[fName](`${fName} called %s`, 'param1');
diagLoggerFunctions.forEach(lName => {
Expand All @@ -181,8 +179,7 @@ describe('LogLevelFilter DiagLogger', () => {
});

it('should use default logger for null and log', () => {
diag.setLogger(dummyLogger);
diag.setLogLevel(DiagLogLevel.ALL);
diag.setLogger(dummyLogger, DiagLogLevel.ALL);
const testLogger = createLogLevelDiagLogger(map.level, null);
testLogger[fName](`${fName} called %s`, 'param1');
diagLoggerFunctions.forEach(lName => {
Expand All @@ -200,16 +197,14 @@ describe('LogLevelFilter DiagLogger', () => {
levelMap.forEach(masterLevelMap => {
describe(`when diag logger is set to ${masterLevelMap.message}`, () => {
it('diag setLogLevel is not ignored and using default logger', () => {
diag.setLogger(dummyLogger);
diag.setLogLevel(masterLevelMap.level);
diag.setLogger(dummyLogger, masterLevelMap.level);

const testLogger = createLogLevelDiagLogger(map.level);
testLogger[fName](`${fName} called %s`, 'param1');
diagLoggerFunctions.forEach(lName => {
if (
fName === lName &&
map.ignoreFuncs.indexOf(lName) === -1 &&
masterLevelMap.ignoreFuncs.indexOf(lName) === -1
map.ignoreFuncs.indexOf(lName) === -1
) {
assert.deepStrictEqual(calledArgs[lName], [
`${fName} called %s`,
Expand All @@ -222,12 +217,11 @@ describe('LogLevelFilter DiagLogger', () => {
});

it('diag setLogLevel is ignored when using a specific logger', () => {
diag.setLogger(dummyLogger);
diag.setLogLevel(masterLevelMap.level);
diag.setLogger(dummyLogger, masterLevelMap.level);

const testLogger = createLogLevelDiagLogger(
map.level,
diag.getLogger()
diag.getLoggingDestination()
);
testLogger[fName](`${fName} called %s`, 'param1');
diagLoggerFunctions.forEach(lName => {
Expand All @@ -248,8 +242,7 @@ describe('LogLevelFilter DiagLogger', () => {
});

it('diag setLogLevel and logger should log', () => {
diag.setLogger(dummyLogger);
diag.setLogLevel(map.level);
diag.setLogger(dummyLogger, map.level);
diag[fName](`${fName} called %s`, 'param1');
diagLoggerFunctions.forEach(lName => {
if (fName === lName && map.ignoreFuncs.indexOf(lName) === -1) {
Expand Down
4 changes: 2 additions & 2 deletions test/diag/logger.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ describe('DiagLogger functions', () => {
diagLoggerFunctions.forEach(fName => {
calledArgs[fName] = null;
});
diag.disable();
});

describe('constructor', () => {
Expand All @@ -68,8 +69,7 @@ describe('DiagLogger functions', () => {
});

it(`diag should log with ${fName} message`, () => {
diag.setLogger(dummyLogger);
diag.setLogLevel(DiagLogLevel.ALL);
diag.setLogger(dummyLogger, DiagLogLevel.ALL);
diag[fName](`${fName} called %s`, 'param1');
diagLoggerFunctions.forEach(lName => {
if (fName === lName) {
Expand Down