@@ -3,12 +3,11 @@ import {
3
3
diag ,
4
4
DiagConsoleLogger ,
5
5
DiagLogLevel ,
6
- metrics ,
7
6
propagation ,
8
7
TextMapPropagator ,
9
8
trace ,
9
+ TracerProvider ,
10
10
} from '@opentelemetry/api' ;
11
- import { logs } from '@opentelemetry/api-logs' ;
12
11
import {
13
12
CompositePropagator ,
14
13
getEnv ,
@@ -23,26 +22,14 @@ import {
23
22
SimpleSpanProcessor ,
24
23
TracerConfig ,
25
24
} from '@opentelemetry/sdk-trace-base' ;
26
- import {
27
- MeterProvider ,
28
- MeterProviderOptions ,
29
- PeriodicExportingMetricReader ,
30
- } from '@opentelemetry/sdk-metrics' ;
31
- import {
32
- LoggerProvider ,
33
- SimpleLogRecordProcessor ,
34
- ConsoleLogRecordExporter ,
35
- LoggerProviderConfig ,
36
- } from '@opentelemetry/sdk-logs' ;
37
25
import {
38
26
detectResourcesSync ,
39
27
envDetector ,
28
+ IResource ,
40
29
processDetector ,
41
30
} from '@opentelemetry/resources' ;
42
31
import { awsLambdaDetector } from '@opentelemetry/resource-detector-aws' ;
43
32
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http' ;
44
- import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http' ;
45
- import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http' ;
46
33
import {
47
34
Instrumentation ,
48
35
registerInstrumentations ,
@@ -85,24 +72,27 @@ const propagatorMap = new Map<string, () => TextMapPropagator>([
85
72
86
73
declare global {
87
74
// In case of downstream configuring span processors etc
75
+ function configureLambdaInstrumentation (
76
+ config : AwsLambdaInstrumentationConfig ,
77
+ ) : AwsLambdaInstrumentationConfig ;
88
78
function configureAwsInstrumentation (
89
79
defaultConfig : AwsSdkInstrumentationConfig ,
90
80
) : AwsSdkInstrumentationConfig ;
91
- function configureTracerProvider ( tracerProvider : BasicTracerProvider ) : void ;
92
- function configureTracer ( defaultConfig : TracerConfig ) : TracerConfig ;
81
+ function configureInstrumentations ( ) : Instrumentation [ ] ;
93
82
function configureSdkRegistration (
94
83
defaultSdkRegistration : SDKRegistrationConfig ,
95
84
) : SDKRegistrationConfig ;
96
- function configureInstrumentations ( ) : Instrumentation [ ] ;
97
- function configureLoggerProvider ( loggerProvider : LoggerProvider ) : void ;
98
- function configureMeter (
99
- defaultConfig : MeterProviderOptions ,
100
- ) : MeterProviderOptions ;
101
- function configureMeterProvider ( meterProvider : MeterProvider ) : void ;
102
- function configureLambdaInstrumentation (
103
- config : AwsLambdaInstrumentationConfig ,
104
- ) : AwsLambdaInstrumentationConfig ;
105
- function configureInstrumentations ( ) : Instrumentation [ ] ;
85
+ function configureTracer ( defaultConfig : TracerConfig ) : TracerConfig ;
86
+ function configureTracerProvider ( tracerProvider : BasicTracerProvider ) : void ;
87
+
88
+ // No explicit metric type here, but "unknown" type.
89
+ // Because metric packages are important dynamically.
90
+ function configureMeter ( defaultConfig : unknown ) : unknown ;
91
+ function configureMeterProvider ( meterProvider : unknown ) : void ;
92
+
93
+ // No explicit log type here, but "unknown" type.
94
+ // Because log packages are important dynamically.
95
+ function configureLoggerProvider ( loggerProvider : unknown ) : void ;
106
96
}
107
97
108
98
function getActiveInstumentations ( ) : Set < string > {
@@ -264,11 +254,9 @@ function getPropagator(): TextMapPropagator {
264
254
return new CompositePropagator ( { propagators } ) ;
265
255
}
266
256
267
- async function initializeProvider ( ) {
268
- const resource = detectResourcesSync ( {
269
- detectors : [ awsLambdaDetector , envDetector , processDetector ] ,
270
- } ) ;
271
-
257
+ async function initializeTracerProvider (
258
+ resource : IResource ,
259
+ ) : Promise < TracerProvider > {
272
260
let config : TracerConfig = {
273
261
resource,
274
262
} ;
@@ -302,9 +290,27 @@ async function initializeProvider() {
302
290
}
303
291
tracerProvider . register ( sdkRegistrationConfig ) ;
304
292
293
+ return tracerProvider ;
294
+ }
295
+
296
+ async function initializeMeterProvider (
297
+ resource : IResource ,
298
+ ) : Promise < unknown | undefined > {
299
+ if ( process . env . OTEL_METRICS_EXPORTER === 'none' ) {
300
+ return ;
301
+ }
302
+
303
+ const { metrics } = await import ( '@opentelemetry/api' ) ;
304
+ const { MeterProvider, PeriodicExportingMetricReader } = await import (
305
+ '@opentelemetry/sdk-metrics'
306
+ ) ;
307
+ const { OTLPMetricExporter } = await import (
308
+ '@opentelemetry/exporter-metrics-otlp-http'
309
+ ) ;
310
+
305
311
// Configure default meter provider (doesn't export metrics)
306
312
const metricExporter = new OTLPMetricExporter ( ) ;
307
- let meterConfig : MeterProviderOptions = {
313
+ let meterConfig : unknown = {
308
314
resource,
309
315
readers : [
310
316
new PeriodicExportingMetricReader ( {
@@ -316,15 +322,36 @@ async function initializeProvider() {
316
322
meterConfig = configureMeter ( meterConfig ) ;
317
323
}
318
324
319
- const meterProvider = new MeterProvider ( meterConfig ) ;
325
+ const meterProvider = new MeterProvider ( meterConfig as object ) ;
320
326
if ( typeof configureMeterProvider === 'function' ) {
321
327
configureMeterProvider ( meterProvider ) ;
322
328
} else {
323
329
metrics . setGlobalMeterProvider ( meterProvider ) ;
324
330
}
325
331
332
+ metricsDisableFunction = ( ) => {
333
+ metrics . disable ( ) ;
334
+ } ;
335
+
336
+ return meterProvider ;
337
+ }
338
+
339
+ async function initializeLoggerProvider (
340
+ resource : IResource ,
341
+ ) : Promise < unknown | undefined > {
342
+ if ( process . env . OTEL_LOGS_EXPORTER === 'none' ) {
343
+ return ;
344
+ }
345
+
346
+ const { logs } = await import ( '@opentelemetry/api-logs' ) ;
347
+ const { LoggerProvider, SimpleLogRecordProcessor, ConsoleLogRecordExporter } =
348
+ await import ( '@opentelemetry/sdk-logs' ) ;
349
+ const { OTLPLogExporter } = await import (
350
+ '@opentelemetry/exporter-logs-otlp-http'
351
+ ) ;
352
+
326
353
const logExporter = new OTLPLogExporter ( ) ;
327
- const loggerConfig : LoggerProviderConfig = {
354
+ const loggerConfig = {
328
355
resource,
329
356
} ;
330
357
const loggerProvider = new LoggerProvider ( loggerConfig ) ;
@@ -344,6 +371,25 @@ async function initializeProvider() {
344
371
) ;
345
372
}
346
373
374
+ logsDisableFunction = ( ) => {
375
+ logs . disable ( ) ;
376
+ } ;
377
+
378
+ return loggerProvider ;
379
+ }
380
+
381
+ async function initializeProvider ( ) {
382
+ const resource = detectResourcesSync ( {
383
+ detectors : [ awsLambdaDetector , envDetector , processDetector ] ,
384
+ } ) ;
385
+
386
+ const tracerProvider : TracerProvider =
387
+ await initializeTracerProvider ( resource ) ;
388
+ const meterProvider : unknown | undefined =
389
+ await initializeMeterProvider ( resource ) ;
390
+ const loggerProvider : unknown | undefined =
391
+ await initializeLoggerProvider ( resource ) ;
392
+
347
393
// Create instrumentations if they have not been created before
348
394
// to prevent additional coldstart overhead
349
395
// caused by creations and initializations of instrumentations.
@@ -352,11 +398,14 @@ async function initializeProvider() {
352
398
}
353
399
354
400
// Re-register instrumentation with initialized provider. Patched code will see the update.
401
+
355
402
disableInstrumentations = registerInstrumentations ( {
356
403
instrumentations,
357
404
tracerProvider,
358
- meterProvider,
359
- loggerProvider,
405
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
406
+ meterProvider : meterProvider as any ,
407
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
408
+ loggerProvider : loggerProvider as any ,
360
409
} ) ;
361
410
}
362
411
@@ -382,8 +431,16 @@ export async function unwrap() {
382
431
context . disable ( ) ;
383
432
propagation . disable ( ) ;
384
433
trace . disable ( ) ;
385
- metrics . disable ( ) ;
386
- logs . disable ( ) ;
434
+
435
+ if ( metricsDisableFunction ) {
436
+ metricsDisableFunction ( ) ;
437
+ metricsDisableFunction = ( ) => { } ;
438
+ }
439
+
440
+ if ( logsDisableFunction ) {
441
+ logsDisableFunction ( ) ;
442
+ logsDisableFunction = ( ) => { } ;
443
+ }
387
444
}
388
445
389
446
export async function init ( ) {
@@ -406,6 +463,8 @@ console.log('Registering OpenTelemetry');
406
463
let initialized = false ;
407
464
let instrumentations : Instrumentation [ ] ;
408
465
let disableInstrumentations : ( ) => void ;
466
+ let metricsDisableFunction : ( ) => void ;
467
+ let logsDisableFunction : ( ) => void ;
409
468
410
469
// Configure lambda logging
411
470
const logLevel = getEnv ( ) . OTEL_LOG_LEVEL ;
0 commit comments