diff --git a/experimental/packages/opentelemetry-instrumentation/package.json b/experimental/packages/opentelemetry-instrumentation/package.json index da40052d0b..9337482762 100644 --- a/experimental/packages/opentelemetry-instrumentation/package.json +++ b/experimental/packages/opentelemetry-instrumentation/package.json @@ -78,11 +78,13 @@ "shimmer": "^1.2.1" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.3.0", + "@opentelemetry/api-logs": "^0.45.1" }, "devDependencies": { "@babel/core": "7.23.3", "@opentelemetry/api": "1.7.0", + "@opentelemetry/api-logs": "0.45.1", "@opentelemetry/sdk-metrics": "1.18.1", "@types/mocha": "10.0.4", "@types/node": "18.6.5", diff --git a/experimental/packages/opentelemetry-instrumentation/src/autoLoader.ts b/experimental/packages/opentelemetry-instrumentation/src/autoLoader.ts index c6a052c6c9..5473d28917 100644 --- a/experimental/packages/opentelemetry-instrumentation/src/autoLoader.ts +++ b/experimental/packages/opentelemetry-instrumentation/src/autoLoader.ts @@ -15,6 +15,7 @@ */ import { trace, metrics } from '@opentelemetry/api'; +import { logs } from '@opentelemetry/api-logs'; import { disableInstrumentations, enableInstrumentations, @@ -36,10 +37,16 @@ export function registerInstrumentations( ); const tracerProvider = options.tracerProvider || trace.getTracerProvider(); const meterProvider = options.meterProvider || metrics.getMeterProvider(); + const loggerProvider = options.loggerProvider || logs.getLoggerProvider(); - enableInstrumentations(instrumentations, tracerProvider, meterProvider); + enableInstrumentations( + instrumentations, + tracerProvider, + meterProvider, + loggerProvider + ); return () => { disableInstrumentations(instrumentations); }; -} +} \ No newline at end of file diff --git a/experimental/packages/opentelemetry-instrumentation/src/autoLoaderUtils.ts b/experimental/packages/opentelemetry-instrumentation/src/autoLoaderUtils.ts index 3dc1927214..3337925595 100644 --- a/experimental/packages/opentelemetry-instrumentation/src/autoLoaderUtils.ts +++ b/experimental/packages/opentelemetry-instrumentation/src/autoLoaderUtils.ts @@ -17,6 +17,7 @@ import { TracerProvider, MeterProvider } from '@opentelemetry/api'; import { Instrumentation } from './types'; import { AutoLoaderResult, InstrumentationOption } from './types_internal'; +import { LoggerProvider } from '@opentelemetry/api-logs'; /** * Parses the options and returns instrumentations, node plugins and @@ -52,7 +53,8 @@ export function parseInstrumentationOptions( export function enableInstrumentations( instrumentations: Instrumentation[], tracerProvider?: TracerProvider, - meterProvider?: MeterProvider + meterProvider?: MeterProvider, + loggerProvider?: LoggerProvider ): void { for (let i = 0, j = instrumentations.length; i < j; i++) { const instrumentation = instrumentations[i]; @@ -62,6 +64,9 @@ export function enableInstrumentations( if (meterProvider) { instrumentation.setMeterProvider(meterProvider); } + if (loggerProvider) { + instrumentation.setLoggerProvider(loggerProvider); + } // instrumentations have been already enabled during creation // so enable only if user prevented that by setting enabled to false // this is to prevent double enabling but when calling register all @@ -80,4 +85,4 @@ export function disableInstrumentations( instrumentations: Instrumentation[] ): void { instrumentations.forEach(instrumentation => instrumentation.disable()); -} +} \ No newline at end of file diff --git a/experimental/packages/opentelemetry-instrumentation/src/instrumentation.ts b/experimental/packages/opentelemetry-instrumentation/src/instrumentation.ts index 4b729fd439..5be75d208a 100644 --- a/experimental/packages/opentelemetry-instrumentation/src/instrumentation.ts +++ b/experimental/packages/opentelemetry-instrumentation/src/instrumentation.ts @@ -24,6 +24,7 @@ import { Tracer, TracerProvider, } from '@opentelemetry/api'; +import { Logger, LoggerProvider, logs } from '@opentelemetry/api-logs'; import * as shimmer from 'shimmer'; import { InstrumentationModuleDefinition } from './platform/node'; import * as types from './types'; @@ -38,6 +39,7 @@ export abstract class InstrumentationAbstract private _tracer: Tracer; private _meter: Meter; + private _logger: Logger; protected _diag: DiagLogger; constructor( @@ -55,8 +57,8 @@ export abstract class InstrumentationAbstract }); this._tracer = trace.getTracer(instrumentationName, instrumentationVersion); - this._meter = metrics.getMeter(instrumentationName, instrumentationVersion); + this._logger = logs.getLogger(instrumentationName, instrumentationVersion); this._updateMetricInstruments(); } @@ -87,6 +89,22 @@ export abstract class InstrumentationAbstract this._updateMetricInstruments(); } + /* Returns logger */ + protected get logger(): Logger { + return this._logger; + } + + /** + * Sets LoggerProvider to this plugin + * @param loggerProvider + */ + public setLoggerProvider(loggerProvider: LoggerProvider): void { + this._logger = loggerProvider.getLogger( + this.instrumentationName, + this.instrumentationVersion + ); + } + /** * Sets the new metric instruments with the current Meter. */ @@ -137,4 +155,4 @@ export abstract class InstrumentationAbstract | InstrumentationModuleDefinition | InstrumentationModuleDefinition[] | void; -} +} \ No newline at end of file diff --git a/experimental/packages/opentelemetry-instrumentation/src/types.ts b/experimental/packages/opentelemetry-instrumentation/src/types.ts index 837f096792..41074ca214 100644 --- a/experimental/packages/opentelemetry-instrumentation/src/types.ts +++ b/experimental/packages/opentelemetry-instrumentation/src/types.ts @@ -15,6 +15,7 @@ */ import { TracerProvider, MeterProvider } from '@opentelemetry/api'; +import { LoggerProvider } from '@opentelemetry/api-logs'; /** Interface Instrumentation to apply patch. */ export interface Instrumentation { @@ -43,6 +44,9 @@ export interface Instrumentation { /** Method to set meter provider */ setMeterProvider(meterProvider: MeterProvider): void; + /** Method to set logger provider */ + setLoggerProvider(loggerProvider: LoggerProvider): void; + /** Method to set instrumentation config */ setConfig(config: InstrumentationConfig): void; @@ -76,4 +80,4 @@ export interface ShimWrapped extends Function { __unwrap: Function; // eslint-disable-next-line @typescript-eslint/ban-types __original: Function; -} +} \ No newline at end of file diff --git a/experimental/packages/opentelemetry-instrumentation/src/types_internal.ts b/experimental/packages/opentelemetry-instrumentation/src/types_internal.ts index 2cff387711..f4829f4801 100644 --- a/experimental/packages/opentelemetry-instrumentation/src/types_internal.ts +++ b/experimental/packages/opentelemetry-instrumentation/src/types_internal.ts @@ -17,6 +17,7 @@ import { TracerProvider, MeterProvider } from '@opentelemetry/api'; import { InstrumentationBase } from './platform'; import { Instrumentation } from './types'; +import { LoggerProvider } from '@opentelemetry/api-logs'; export type InstrumentationOption = | typeof InstrumentationBase @@ -32,4 +33,5 @@ export interface AutoLoaderOptions { instrumentations?: InstrumentationOption[]; tracerProvider?: TracerProvider; meterProvider?: MeterProvider; -} + loggerProvider?: LoggerProvider; +} \ No newline at end of file diff --git a/experimental/packages/opentelemetry-instrumentation/test/common/autoLoader.test.ts b/experimental/packages/opentelemetry-instrumentation/test/common/autoLoader.test.ts index aa8c5582a3..27dcbb83b5 100644 --- a/experimental/packages/opentelemetry-instrumentation/test/common/autoLoader.test.ts +++ b/experimental/packages/opentelemetry-instrumentation/test/common/autoLoader.test.ts @@ -24,6 +24,7 @@ import { import * as assert from 'assert'; import * as sinon from 'sinon'; import { InstrumentationBase, registerInstrumentations } from '../../src'; +import { Logger, LoggerOptions, LoggerProvider } from '@opentelemetry/api-logs'; class DummyTracerProvider implements TracerProvider { getTracer(name: string, version?: string): Tracer { @@ -37,6 +38,12 @@ class DummyMeterProvider implements MeterProvider { } } +class DummyLoggerProvider implements LoggerProvider { + getLogger(name: string, version?: string, options?: LoggerOptions): Logger { + throw new Error('not implemented'); + } +} + class FooInstrumentation extends InstrumentationBase { init() { return []; @@ -63,17 +70,21 @@ describe('autoLoader', () => { let enableSpy: sinon.SinonSpy; let setTracerProviderSpy: sinon.SinonSpy; let setMeterProviderSpy: sinon.SinonSpy; + let setLoggerProviderSpy: sinon.SinonSpy; const tracerProvider = new DummyTracerProvider(); const meterProvider = new DummyMeterProvider(); + const loggerProvider = new DummyLoggerProvider(); beforeEach(() => { instrumentation = new FooInstrumentation('foo', '1', {}); enableSpy = sinon.spy(instrumentation, 'enable'); setTracerProviderSpy = sinon.stub(instrumentation, 'setTracerProvider'); setMeterProviderSpy = sinon.stub(instrumentation, 'setMeterProvider'); + setLoggerProviderSpy = sinon.stub(instrumentation, 'setLoggerProvider'); unload = registerInstrumentations({ instrumentations: [instrumentation], tracerProvider, meterProvider, + loggerProvider, }); }); @@ -96,10 +107,12 @@ describe('autoLoader', () => { enableSpy = sinon.spy(instrumentation, 'enable'); setTracerProviderSpy = sinon.stub(instrumentation, 'setTracerProvider'); setMeterProviderSpy = sinon.stub(instrumentation, 'setMeterProvider'); + setLoggerProviderSpy = sinon.stub(instrumentation, 'setLoggerProvider'); unload = registerInstrumentations({ instrumentations: [instrumentation], tracerProvider, meterProvider, + loggerProvider, }); assert.strictEqual(enableSpy.callCount, 1); }); @@ -119,6 +132,12 @@ describe('autoLoader', () => { assert.ok(setMeterProviderSpy.lastCall.args[0] === meterProvider); assert.strictEqual(setMeterProviderSpy.lastCall.args.length, 1); }); + + it('should set LoggerProvider', () => { + assert.strictEqual(setLoggerProviderSpy.callCount, 1); + assert.ok(setLoggerProviderSpy.lastCall.args[0] === loggerProvider); + assert.strictEqual(setLoggerProviderSpy.lastCall.args.length, 1); + }); }); }); -}); +}); \ No newline at end of file