Skip to content

Commit 07ff097

Browse files
hectorhdzgZirak
authored andcommitted
Allow LoggerProvider to be specified in Instrumentations (open-telemetry#4314)
* Allow LoggerProvider to be specified in Instrumentations * Update * Lint * Add test * npm i * Update changelog * npm i * marking setLoggerProvider as optional * Add check for possible undefined method * npm i
1 parent 6622916 commit 07ff097

13 files changed

+114
-5
lines changed

experimental/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ All notable changes to experimental packages in this project will be documented
88

99
### :rocket: (Enhancement)
1010

11+
* feat(instrumentation): allow LoggerProvider to be specified in Instrumentations [#4314](https://github.com/open-telemetry/opentelemetry-js/pull/4314) @hectorhdzg
1112
* feat(instrumentation): Make `init()` method public [#4418](https://github.com/open-telemetry/opentelemetry-js/pull/4418)
1213
* feat(exporter-metrics-otlp-http): add option to set the exporter aggregation preference [#4409](https://github.com/open-telemetry/opentelemetry-js/pull/4409) @AkselAllas
1314
* feat(node-sdk): add spanProcessors option [#4454](https://github.com/open-telemetry/opentelemetry-js/pull/4454) @naseemkullah

experimental/packages/opentelemetry-instrumentation/package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,14 @@
7878
"shimmer": "^1.2.1"
7979
},
8080
"peerDependencies": {
81-
"@opentelemetry/api": "^1.3.0"
81+
"@opentelemetry/api": "^1.3.0",
82+
"@opentelemetry/api-logs": "^0.46.0"
8283
},
8384
"devDependencies": {
8485
"@babel/core": "7.23.6",
8586
"@babel/preset-env": "7.22.20",
8687
"@opentelemetry/api": "1.7.0",
88+
"@opentelemetry/api-logs": "0.47.0",
8789
"@opentelemetry/sdk-metrics": "1.21.0",
8890
"@types/mocha": "10.0.6",
8991
"@types/node": "18.6.5",

experimental/packages/opentelemetry-instrumentation/src/autoLoader.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
import { trace, metrics } from '@opentelemetry/api';
18+
import { logs } from '@opentelemetry/api-logs';
1819
import {
1920
disableInstrumentations,
2021
enableInstrumentations,
@@ -36,8 +37,14 @@ export function registerInstrumentations(
3637
);
3738
const tracerProvider = options.tracerProvider || trace.getTracerProvider();
3839
const meterProvider = options.meterProvider || metrics.getMeterProvider();
40+
const loggerProvider = options.loggerProvider || logs.getLoggerProvider();
3941

40-
enableInstrumentations(instrumentations, tracerProvider, meterProvider);
42+
enableInstrumentations(
43+
instrumentations,
44+
tracerProvider,
45+
meterProvider,
46+
loggerProvider
47+
);
4148

4249
return () => {
4350
disableInstrumentations(instrumentations);

experimental/packages/opentelemetry-instrumentation/src/autoLoaderUtils.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import { TracerProvider, MeterProvider } from '@opentelemetry/api';
1818
import { Instrumentation } from './types';
1919
import { AutoLoaderResult, InstrumentationOption } from './types_internal';
20+
import { LoggerProvider } from '@opentelemetry/api-logs';
2021

2122
/**
2223
* Parses the options and returns instrumentations, node plugins and
@@ -52,7 +53,8 @@ export function parseInstrumentationOptions(
5253
export function enableInstrumentations(
5354
instrumentations: Instrumentation[],
5455
tracerProvider?: TracerProvider,
55-
meterProvider?: MeterProvider
56+
meterProvider?: MeterProvider,
57+
loggerProvider?: LoggerProvider
5658
): void {
5759
for (let i = 0, j = instrumentations.length; i < j; i++) {
5860
const instrumentation = instrumentations[i];
@@ -62,6 +64,9 @@ export function enableInstrumentations(
6264
if (meterProvider) {
6365
instrumentation.setMeterProvider(meterProvider);
6466
}
67+
if (loggerProvider && instrumentation.setLoggerProvider) {
68+
instrumentation.setLoggerProvider(loggerProvider);
69+
}
6570
// instrumentations have been already enabled during creation
6671
// so enable only if user prevented that by setting enabled to false
6772
// this is to prevent double enabling but when calling register all

experimental/packages/opentelemetry-instrumentation/src/instrumentation.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
Tracer,
2525
TracerProvider,
2626
} from '@opentelemetry/api';
27+
import { Logger, LoggerProvider, logs } from '@opentelemetry/api-logs';
2728
import * as shimmer from 'shimmer';
2829
import {
2930
InstrumentationModuleDefinition,
@@ -41,6 +42,7 @@ export abstract class InstrumentationAbstract<T = any>
4142

4243
private _tracer: Tracer;
4344
private _meter: Meter;
45+
private _logger: Logger;
4446
protected _diag: DiagLogger;
4547

4648
constructor(
@@ -58,8 +60,8 @@ export abstract class InstrumentationAbstract<T = any>
5860
});
5961

6062
this._tracer = trace.getTracer(instrumentationName, instrumentationVersion);
61-
6263
this._meter = metrics.getMeter(instrumentationName, instrumentationVersion);
64+
this._logger = logs.getLogger(instrumentationName, instrumentationVersion);
6365
this._updateMetricInstruments();
6466
}
6567

@@ -90,6 +92,22 @@ export abstract class InstrumentationAbstract<T = any>
9092
this._updateMetricInstruments();
9193
}
9294

95+
/* Returns logger */
96+
protected get logger(): Logger {
97+
return this._logger;
98+
}
99+
100+
/**
101+
* Sets LoggerProvider to this plugin
102+
* @param loggerProvider
103+
*/
104+
public setLoggerProvider(loggerProvider: LoggerProvider): void {
105+
this._logger = loggerProvider.getLogger(
106+
this.instrumentationName,
107+
this.instrumentationVersion
108+
);
109+
}
110+
93111
/**
94112
* Sets the new metric instruments with the current Meter.
95113
*/

experimental/packages/opentelemetry-instrumentation/src/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
import { TracerProvider, MeterProvider } from '@opentelemetry/api';
18+
import { LoggerProvider } from '@opentelemetry/api-logs';
1819

1920
/** Interface Instrumentation to apply patch. */
2021
export interface Instrumentation {
@@ -43,6 +44,9 @@ export interface Instrumentation {
4344
/** Method to set meter provider */
4445
setMeterProvider(meterProvider: MeterProvider): void;
4546

47+
/** Method to set logger provider */
48+
setLoggerProvider?(loggerProvider: LoggerProvider): void;
49+
4650
/** Method to set instrumentation config */
4751
setConfig(config: InstrumentationConfig): void;
4852

experimental/packages/opentelemetry-instrumentation/src/types_internal.ts

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import { TracerProvider, MeterProvider } from '@opentelemetry/api';
1818
import { InstrumentationBase } from './platform';
1919
import { Instrumentation } from './types';
20+
import { LoggerProvider } from '@opentelemetry/api-logs';
2021

2122
export type InstrumentationOption =
2223
| typeof InstrumentationBase
@@ -32,4 +33,5 @@ export interface AutoLoaderOptions {
3233
instrumentations?: InstrumentationOption[];
3334
tracerProvider?: TracerProvider;
3435
meterProvider?: MeterProvider;
36+
loggerProvider?: LoggerProvider;
3537
}

experimental/packages/opentelemetry-instrumentation/test/common/Instrumentation.test.ts

+18
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
} from '../../src';
2323

2424
import { MeterProvider } from '@opentelemetry/sdk-metrics';
25+
import { LoggerProvider } from '@opentelemetry/sdk-logs';
2526

2627
interface TestInstrumentationConfig extends InstrumentationConfig {
2728
isActive?: boolean;
@@ -90,6 +91,23 @@ describe('BaseInstrumentation', () => {
9091
});
9192
});
9293

94+
describe('setLoggerProvider', () => {
95+
it('should get a logger from provider', () => {
96+
let called = true;
97+
class TestLoggerProvider extends LoggerProvider {
98+
override getLogger(name: any, version?: any, options?: any) {
99+
called = true;
100+
return super.getLogger(name, version, options);
101+
}
102+
}
103+
instrumentation = new TestInstrumentation();
104+
if (instrumentation.setLoggerProvider) {
105+
instrumentation.setLoggerProvider(new TestLoggerProvider());
106+
}
107+
assert.strictEqual(called, true);
108+
});
109+
});
110+
93111
describe('getConfig', () => {
94112
it('should return instrumentation config', () => {
95113
const instrumentation: Instrumentation = new TestInstrumentation({

experimental/packages/opentelemetry-instrumentation/test/common/autoLoader.test.ts

+19
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
import * as assert from 'assert';
2525
import * as sinon from 'sinon';
2626
import { InstrumentationBase, registerInstrumentations } from '../../src';
27+
import { Logger, LoggerOptions, LoggerProvider } from '@opentelemetry/api-logs';
2728

2829
class DummyTracerProvider implements TracerProvider {
2930
getTracer(name: string, version?: string): Tracer {
@@ -37,6 +38,12 @@ class DummyMeterProvider implements MeterProvider {
3738
}
3839
}
3940

41+
class DummyLoggerProvider implements LoggerProvider {
42+
getLogger(name: string, version?: string, options?: LoggerOptions): Logger {
43+
throw new Error('not implemented');
44+
}
45+
}
46+
4047
class FooInstrumentation extends InstrumentationBase {
4148
init() {
4249
return [];
@@ -63,17 +70,21 @@ describe('autoLoader', () => {
6370
let enableSpy: sinon.SinonSpy;
6471
let setTracerProviderSpy: sinon.SinonSpy;
6572
let setMeterProviderSpy: sinon.SinonSpy;
73+
let setLoggerProviderSpy: sinon.SinonSpy;
6674
const tracerProvider = new DummyTracerProvider();
6775
const meterProvider = new DummyMeterProvider();
76+
const loggerProvider = new DummyLoggerProvider();
6877
beforeEach(() => {
6978
instrumentation = new FooInstrumentation('foo', '1', {});
7079
enableSpy = sinon.spy(instrumentation, 'enable');
7180
setTracerProviderSpy = sinon.stub(instrumentation, 'setTracerProvider');
7281
setMeterProviderSpy = sinon.stub(instrumentation, 'setMeterProvider');
82+
setLoggerProviderSpy = sinon.stub(instrumentation, 'setLoggerProvider');
7383
unload = registerInstrumentations({
7484
instrumentations: [instrumentation],
7585
tracerProvider,
7686
meterProvider,
87+
loggerProvider,
7788
});
7889
});
7990

@@ -96,10 +107,12 @@ describe('autoLoader', () => {
96107
enableSpy = sinon.spy(instrumentation, 'enable');
97108
setTracerProviderSpy = sinon.stub(instrumentation, 'setTracerProvider');
98109
setMeterProviderSpy = sinon.stub(instrumentation, 'setMeterProvider');
110+
setLoggerProviderSpy = sinon.stub(instrumentation, 'setLoggerProvider');
99111
unload = registerInstrumentations({
100112
instrumentations: [instrumentation],
101113
tracerProvider,
102114
meterProvider,
115+
loggerProvider,
103116
});
104117
assert.strictEqual(enableSpy.callCount, 1);
105118
});
@@ -119,6 +132,12 @@ describe('autoLoader', () => {
119132
assert.ok(setMeterProviderSpy.lastCall.args[0] === meterProvider);
120133
assert.strictEqual(setMeterProviderSpy.lastCall.args.length, 1);
121134
});
135+
136+
it('should set LoggerProvider', () => {
137+
assert.strictEqual(setLoggerProviderSpy.callCount, 1);
138+
assert.ok(setLoggerProviderSpy.lastCall.args[0] === loggerProvider);
139+
assert.strictEqual(setLoggerProviderSpy.lastCall.args.length, 1);
140+
});
122141
});
123142
});
124143
});

experimental/packages/opentelemetry-instrumentation/tsconfig.esm.json

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
},
1515
{
1616
"path": "../../../packages/sdk-metrics"
17+
},
18+
{
19+
"path": "../api-logs"
1720
}
1821
]
1922
}

experimental/packages/opentelemetry-instrumentation/tsconfig.esnext.json

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
},
1515
{
1616
"path": "../../../packages/sdk-metrics"
17+
},
18+
{
19+
"path": "../api-logs"
1720
}
1821
]
1922
}

experimental/packages/opentelemetry-instrumentation/tsconfig.json

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
},
1616
{
1717
"path": "../../../packages/sdk-metrics"
18+
},
19+
{
20+
"path": "../api-logs"
1821
}
1922
]
2023
}

package-lock.json

+25-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)