Skip to content

Commit 0b2e564

Browse files
authored
Upgrade to otel sdk v2 (#1789)
* Upgrade @opentelemetry/resources * Upgrade @opentelemetry/core * Use new environment variable utilities * Determine version of otel js sdk using npm list, as the VERSION variable is no longer exported in version 2.0.0 * Set span processors through TracerProvider constructor instead of deprecated addSpanProcessor method, remove support for configureTracerProvider global method * Use node tracer provider instead of custom implementation * Set trace exporters based on OTEL_TRACES_EXPORTER env var * Upgrade remaining packages to v2 versions * Update minimum node version * Raise compilation target to ES2022 * Remove redundant lockfile * Remove zipkin exporter from default supported exporters through env vars * Allow exporters set through env vars to overwrite the config from the configureTracer global func * Reassign exporterName with lowercased and trimmed value
1 parent dcbdf00 commit 0b2e564

File tree

13 files changed

+559
-4513
lines changed

13 files changed

+559
-4513
lines changed

.github/workflows/release-layer-nodejs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ jobs:
4040
- name: Save Node SDK Version
4141
id: save-node-sdk-version
4242
run: |
43-
SDK_VERSION=$(node version.js)
43+
SDK_VERSION=$(npm list @opentelemetry/core --depth=0 | grep @opentelemetry/core | sed 's/^.*@//')
4444
echo "SDK_VERSION=$SDK_VERSION" >> $GITHUB_OUTPUT
4545
working-directory: nodejs/packages/layer/scripts
4646

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ The table below captures the state of various features and their levels of suppo
102102

103103
The following are runtimes which are no longer or not yet supported by this repository:
104104

105-
* Node.js 12 - not [officially supported](https://github.com/open-telemetry/opentelemetry-js#supported-runtimes) by OpenTelemetry JS
105+
* Node.js 12, Node.js 16 - not [officially supported](https://github.com/open-telemetry/opentelemetry-js#supported-runtimes) by OpenTelemetry JS
106106

107107
[1]: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/faas-spans.md#general-attributes
108108
[2]: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/faas-spans.md#incoming-invocations

nodejs/package-lock.json

Lines changed: 378 additions & 389 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nodejs/packages/layer/package-lock.json

Lines changed: 0 additions & 4016 deletions
This file was deleted.

nodejs/packages/layer/package.json

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -33,56 +33,56 @@
3333
"author": "OpenTelemetry Authors",
3434
"license": "Apache-2.0",
3535
"engines": {
36-
"node": ">=18.0.0"
36+
"node": ">=18.19.0"
3737
},
3838
"dependencies": {
3939
"@opentelemetry/api": "^1.9.0",
40-
"@opentelemetry/api-logs": "^0.57.2",
41-
"@opentelemetry/context-async-hooks": "^1.30.1",
42-
"@opentelemetry/core": "^1.30.0",
43-
"@opentelemetry/exporter-logs-otlp-http": "^0.57.2",
44-
"@opentelemetry/exporter-metrics-otlp-http": "^0.57.2",
45-
"@opentelemetry/exporter-trace-otlp-http": "^0.57.2",
46-
"@opentelemetry/instrumentation": "^0.57.2",
47-
"@opentelemetry/instrumentation-amqplib": "^0.46.1",
48-
"@opentelemetry/instrumentation-aws-lambda": "^0.50.3",
49-
"@opentelemetry/instrumentation-aws-sdk": "^0.49.1",
50-
"@opentelemetry/instrumentation-bunyan": "^0.45.1",
51-
"@opentelemetry/instrumentation-cassandra-driver": "^0.45.1",
52-
"@opentelemetry/instrumentation-connect": "^0.43.1",
53-
"@opentelemetry/instrumentation-dataloader": "^0.16.1",
54-
"@opentelemetry/instrumentation-dns": "^0.43.1",
55-
"@opentelemetry/instrumentation-express": "^0.47.1",
56-
"@opentelemetry/instrumentation-fs": "^0.19.1",
57-
"@opentelemetry/instrumentation-graphql": "^0.47.1",
58-
"@opentelemetry/instrumentation-grpc": "^0.57.2",
59-
"@opentelemetry/instrumentation-hapi": "^0.45.2",
60-
"@opentelemetry/instrumentation-http": "^0.57.2",
61-
"@opentelemetry/instrumentation-ioredis": "^0.47.1",
62-
"@opentelemetry/instrumentation-kafkajs": "^0.7.1",
63-
"@opentelemetry/instrumentation-knex": "^0.44.1",
64-
"@opentelemetry/instrumentation-koa": "^0.47.1",
65-
"@opentelemetry/instrumentation-memcached": "^0.43.1",
66-
"@opentelemetry/instrumentation-mongodb": "^0.52.0",
67-
"@opentelemetry/instrumentation-mongoose": "^0.46.1",
68-
"@opentelemetry/instrumentation-mysql": "^0.45.1",
69-
"@opentelemetry/instrumentation-mysql2": "^0.45.2",
70-
"@opentelemetry/instrumentation-nestjs-core": "^0.44.1",
71-
"@opentelemetry/instrumentation-net": "^0.43.1",
72-
"@opentelemetry/instrumentation-pg": "^0.51.1",
73-
"@opentelemetry/instrumentation-pino": "^0.46.1",
74-
"@opentelemetry/instrumentation-redis": "^0.46.1",
75-
"@opentelemetry/instrumentation-restify": "^0.45.1",
76-
"@opentelemetry/instrumentation-socket.io": "^0.46.1",
77-
"@opentelemetry/instrumentation-undici": "^0.10.1",
78-
"@opentelemetry/instrumentation-winston": "^0.44.1",
79-
"@opentelemetry/propagator-aws-xray": "^1.26.2",
80-
"@opentelemetry/propagator-aws-xray-lambda": "^0.53.2",
81-
"@opentelemetry/resource-detector-aws": "^1.12.0",
82-
"@opentelemetry/resources": "^1.30.0",
83-
"@opentelemetry/sdk-logs": "^0.57.0",
84-
"@opentelemetry/sdk-metrics": "^1.30.0",
85-
"@opentelemetry/sdk-trace-base": "^1.30.0"
40+
"@opentelemetry/api-logs": "^0.200.0",
41+
"@opentelemetry/context-async-hooks": "^2.0.0",
42+
"@opentelemetry/core": "^2.0.0",
43+
"@opentelemetry/exporter-logs-otlp-http": "^0.200.0",
44+
"@opentelemetry/exporter-metrics-otlp-http": "^0.200.0",
45+
"@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
46+
"@opentelemetry/instrumentation": "^0.200.0",
47+
"@opentelemetry/instrumentation-amqplib": "^0.47.0",
48+
"@opentelemetry/instrumentation-aws-lambda": "^0.51.0",
49+
"@opentelemetry/instrumentation-aws-sdk": "^0.51.0",
50+
"@opentelemetry/instrumentation-bunyan": "^0.46.0",
51+
"@opentelemetry/instrumentation-cassandra-driver": "^0.46.0",
52+
"@opentelemetry/instrumentation-connect": "^0.44.0",
53+
"@opentelemetry/instrumentation-dataloader": "^0.17.0",
54+
"@opentelemetry/instrumentation-dns": "^0.44.0",
55+
"@opentelemetry/instrumentation-express": "^0.48.1",
56+
"@opentelemetry/instrumentation-fs": "^0.20.0",
57+
"@opentelemetry/instrumentation-graphql": "^0.48.0",
58+
"@opentelemetry/instrumentation-grpc": "^0.200.0",
59+
"@opentelemetry/instrumentation-hapi": "^0.46.0",
60+
"@opentelemetry/instrumentation-http": "^0.200.0",
61+
"@opentelemetry/instrumentation-ioredis": "^0.48.0",
62+
"@opentelemetry/instrumentation-kafkajs": "^0.9.1",
63+
"@opentelemetry/instrumentation-knex": "^0.45.0",
64+
"@opentelemetry/instrumentation-koa": "^0.48.0",
65+
"@opentelemetry/instrumentation-memcached": "^0.44.0",
66+
"@opentelemetry/instrumentation-mongodb": "^0.53.0",
67+
"@opentelemetry/instrumentation-mongoose": "^0.47.0",
68+
"@opentelemetry/instrumentation-mysql": "^0.46.0",
69+
"@opentelemetry/instrumentation-mysql2": "^0.46.0",
70+
"@opentelemetry/instrumentation-nestjs-core": "^0.46.0",
71+
"@opentelemetry/instrumentation-net": "^0.44.0",
72+
"@opentelemetry/instrumentation-pg": "^0.52.0",
73+
"@opentelemetry/instrumentation-pino": "^0.47.0",
74+
"@opentelemetry/instrumentation-redis": "^0.47.0",
75+
"@opentelemetry/instrumentation-restify": "^0.46.0",
76+
"@opentelemetry/instrumentation-socket.io": "^0.47.0",
77+
"@opentelemetry/instrumentation-undici": "^0.11.0",
78+
"@opentelemetry/instrumentation-winston": "^0.45.0",
79+
"@opentelemetry/propagator-aws-xray": "^2.0.0",
80+
"@opentelemetry/propagator-aws-xray-lambda": "^0.54.0",
81+
"@opentelemetry/resource-detector-aws": "^2.0.0",
82+
"@opentelemetry/resources": "^2.0.0",
83+
"@opentelemetry/sdk-logs": "^0.200.0",
84+
"@opentelemetry/sdk-metrics": "^2.0.0",
85+
"@opentelemetry/sdk-trace-node": "^2.0.0"
8686
},
8787
"devDependencies": {
8888
"@types/mocha": "^10.0.9",

nodejs/packages/layer/scripts/version.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

nodejs/packages/layer/src/LambdaTracerProvider.ts

Lines changed: 0 additions & 24 deletions
This file was deleted.

nodejs/packages/layer/src/wrapper.ts

Lines changed: 70 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,24 @@ import {
1010
} from '@opentelemetry/api';
1111
import {
1212
CompositePropagator,
13-
getEnv,
13+
diagLogLevelFromString,
14+
getStringFromEnv,
1415
W3CBaggagePropagator,
1516
W3CTraceContextPropagator,
1617
} from '@opentelemetry/core';
1718
import {
18-
BasicTracerProvider,
1919
BatchSpanProcessor,
2020
ConsoleSpanExporter,
21+
NodeTracerProvider,
2122
SDKRegistrationConfig,
2223
SimpleSpanProcessor,
24+
SpanExporter,
2325
TracerConfig,
24-
} from '@opentelemetry/sdk-trace-base';
26+
} from '@opentelemetry/sdk-trace-node';
2527
import {
26-
detectResourcesSync,
28+
detectResources,
2729
envDetector,
28-
IResource,
30+
Resource,
2931
processDetector,
3032
} from '@opentelemetry/resources';
3133
import { awsLambdaDetector } from '@opentelemetry/resource-detector-aws';
@@ -45,8 +47,6 @@ import {
4547
import { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';
4648
import { AWSXRayLambdaPropagator } from '@opentelemetry/propagator-aws-xray-lambda';
4749

48-
import { LambdaTracerProvider } from './LambdaTracerProvider';
49-
5050
const defaultInstrumentationList = [
5151
'dns',
5252
'express',
@@ -83,10 +83,6 @@ declare global {
8383
defaultSdkRegistration: SDKRegistrationConfig,
8484
): SDKRegistrationConfig;
8585
function configureTracer(defaultConfig: TracerConfig): TracerConfig;
86-
/**
87-
* @deprecated please use {@link configureTracer} instead.
88-
*/
89-
function configureTracerProvider(tracerProvider: BasicTracerProvider): void;
9086

9187
// No explicit metric type here, but "unknown" type.
9288
// Because metric packages are important dynamically.
@@ -359,32 +355,79 @@ function getPropagator(): TextMapPropagator {
359355
return new CompositePropagator({ propagators });
360356
}
361357

358+
function getExportersFromEnv(): SpanExporter[] | null {
359+
if (
360+
process.env.OTEL_TRACES_EXPORTER == null ||
361+
process.env.OTEL_TRACES_EXPORTER.trim() === ''
362+
) {
363+
return [];
364+
}
365+
if (process.env.OTEL_TRACES_EXPORTER.includes('none')) {
366+
return null;
367+
}
368+
369+
const stringToExporter = new Map<string, () => SpanExporter>([
370+
['otlp', () => new OTLPTraceExporter()],
371+
['console', () => new ConsoleSpanExporter()],
372+
]);
373+
const exporters: SpanExporter[] = [];
374+
process.env.OTEL_TRACES_EXPORTER.split(',').map(exporterName => {
375+
exporterName = exporterName.toLowerCase().trim();
376+
const exporter = stringToExporter.get(exporterName);
377+
if (exporter) {
378+
exporters.push(exporter());
379+
} else {
380+
diag.warn(
381+
`Invalid exporter "${exporterName}" specified in the environment variable OTEL_TRACES_EXPORTER`,
382+
);
383+
}
384+
});
385+
return exporters;
386+
}
387+
362388
async function initializeTracerProvider(
363-
resource: IResource,
364-
): Promise<TracerProvider> {
389+
resource: Resource,
390+
): Promise<TracerProvider | undefined> {
365391
let config: TracerConfig = {
366392
resource,
393+
spanProcessors: [],
367394
};
395+
396+
const exporters = getExportersFromEnv();
397+
if (!exporters) {
398+
return;
399+
}
400+
368401
if (typeof configureTracer === 'function') {
369402
config = configureTracer(config);
370403
}
371404

372-
const tracerProvider = new LambdaTracerProvider(config);
373-
if (typeof configureTracerProvider === 'function') {
374-
configureTracerProvider(tracerProvider);
375-
} else {
376-
// Defaults
377-
tracerProvider.addSpanProcessor(
378-
new BatchSpanProcessor(new OTLPTraceExporter()),
379-
);
405+
if (exporters.length) {
406+
config.spanProcessors = [];
407+
exporters.map(exporter => {
408+
if (exporter instanceof ConsoleSpanExporter) {
409+
config.spanProcessors?.push(new SimpleSpanProcessor(exporter));
410+
} else {
411+
config.spanProcessors?.push(new BatchSpanProcessor(exporter));
412+
}
413+
});
414+
}
415+
416+
config.spanProcessors = config.spanProcessors || [];
417+
if (config.spanProcessors.length === 0) {
418+
// Default
419+
config.spanProcessors.push(new BatchSpanProcessor(new OTLPTraceExporter()));
380420
}
421+
381422
// Logging for debug
382423
if (logLevel === DiagLogLevel.DEBUG) {
383-
tracerProvider.addSpanProcessor(
424+
config.spanProcessors.push(
384425
new SimpleSpanProcessor(new ConsoleSpanExporter()),
385426
);
386427
}
387428

429+
const tracerProvider = new NodeTracerProvider(config);
430+
388431
let sdkRegistrationConfig: SDKRegistrationConfig = {};
389432
if (typeof configureSdkRegistration === 'function') {
390433
sdkRegistrationConfig = configureSdkRegistration(sdkRegistrationConfig);
@@ -399,7 +442,7 @@ async function initializeTracerProvider(
399442
}
400443

401444
async function initializeMeterProvider(
402-
resource: IResource,
445+
resource: Resource,
403446
): Promise<unknown | undefined> {
404447
if (process.env.OTEL_METRICS_EXPORTER === 'none') {
405448
return;
@@ -442,7 +485,7 @@ async function initializeMeterProvider(
442485
}
443486

444487
async function initializeLoggerProvider(
445-
resource: IResource,
488+
resource: Resource,
446489
): Promise<unknown | undefined> {
447490
if (process.env.OTEL_LOGS_EXPORTER === 'none') {
448491
return;
@@ -488,11 +531,11 @@ async function initializeLoggerProvider(
488531
}
489532

490533
async function initializeProvider() {
491-
const resource = detectResourcesSync({
534+
const resource = detectResources({
492535
detectors: [awsLambdaDetector, envDetector, processDetector],
493536
});
494537

495-
const tracerProvider: TracerProvider =
538+
const tracerProvider: TracerProvider | undefined =
496539
await initializeTracerProvider(resource);
497540
const meterProvider: unknown | undefined =
498541
await initializeMeterProvider(resource);
@@ -576,5 +619,5 @@ let metricsDisableFunction: () => void;
576619
let logsDisableFunction: () => void;
577620

578621
// Configure lambda logging
579-
const logLevel = getEnv().OTEL_LOG_LEVEL;
622+
const logLevel = diagLogLevelFromString(getStringFromEnv('OTEL_LOG_LEVEL'));
580623
diag.setLogger(new DiagConsoleLogger(), logLevel);

nodejs/packages/layer/test/handler.spec.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
import {
1111
BatchSpanProcessor,
1212
InMemorySpanExporter
13-
} from '@opentelemetry/sdk-trace-base';
13+
} from '@opentelemetry/sdk-trace-node';
1414

1515
import { registerLoader } from '../src/loader.mjs';
1616
import { init, wrap, unwrap } from '../build/src/wrapper.js';

nodejs/packages/layer/test/handler.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
BatchSpanProcessor,
88
InMemorySpanExporter,
99
ReadableSpan,
10-
} from '@opentelemetry/sdk-trace-base';
10+
} from '@opentelemetry/sdk-trace-node';
1111
import { Context } from 'aws-lambda';
1212

1313
import { init, wrap, unwrap } from '../src/wrapper';

0 commit comments

Comments
 (0)