Skip to content

Upgrade to otel sdk v2 #1789

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
86d0813
Upgrade @opentelemetry/resources
wpessers Apr 12, 2025
943b38f
Upgrade @opentelemetry/core
wpessers Apr 12, 2025
013aaa0
Use new environment variable utilities
wpessers Apr 12, 2025
1a0ee1e
Determine version of otel js sdk using npm list, as the VERSION varia…
wpessers Apr 12, 2025
6c4d8ef
Merge branch 'main' of github.com:wpessers/opentelemetry-lambda into …
wpessers Apr 14, 2025
a4085be
Set span processors through TracerProvider constructor instead of dep…
wpessers Apr 14, 2025
fd19f7f
Use node tracer provider instead of custom implementation
wpessers Apr 16, 2025
f5e66bf
Set trace exporters based on OTEL_TRACES_EXPORTER env var
wpessers Apr 21, 2025
adbe26c
Upgrade remaining packages to v2 versions
wpessers Apr 23, 2025
8351597
Update minimum node version
wpessers Apr 23, 2025
e6efd08
Raise compilation target to ES2022
wpessers Apr 23, 2025
d710772
Merge branch 'open-telemetry:main' into feat/nodejs/upgrade-otel-sdk
wpessers Apr 23, 2025
60e160f
Remove redundant lockfile
wpessers May 6, 2025
fb8d1cc
Remove zipkin exporter from default supported exporters through env vars
wpessers May 6, 2025
f2af371
Allow exporters set through env vars to overwrite the config from the…
wpessers May 6, 2025
c1210a4
Merge branch 'open-telemetry:main' into feat/nodejs/upgrade-otel-sdk
wpessers May 6, 2025
9601183
Reassign exporterName with lowercased and trimmed value
wpessers May 8, 2025
412a3f9
Merge branch 'feat/nodejs/upgrade-otel-sdk' of github.com:wpessers/op…
wpessers May 8, 2025
8312624
Merge branch 'open-telemetry:main' into feat/nodejs/upgrade-otel-sdk
wpessers May 8, 2025
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
2 changes: 1 addition & 1 deletion .github/workflows/release-layer-nodejs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
- name: Save Node SDK Version
id: save-node-sdk-version
run: |
SDK_VERSION=$(node version.js)
SDK_VERSION=$(npm list @opentelemetry/core --depth=0 | grep @opentelemetry/core | sed 's/^.*@//')
echo "SDK_VERSION=$SDK_VERSION" >> $GITHUB_OUTPUT
working-directory: nodejs/packages/layer/scripts

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ The table below captures the state of various features and their levels of suppo

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

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

[1]: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/faas-spans.md#general-attributes
[2]: https://github.com/open-telemetry/semantic-conventions/blob/main/docs/faas/faas-spans.md#incoming-invocations
Expand Down
785 changes: 396 additions & 389 deletions nodejs/package-lock.json

Large diffs are not rendered by default.

95 changes: 48 additions & 47 deletions nodejs/packages/layer/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,56 +33,57 @@
"author": "OpenTelemetry Authors",
"license": "Apache-2.0",
"engines": {
"node": ">=18.0.0"
"node": ">=18.19.0"
},
"dependencies": {
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/api-logs": "^0.57.2",
"@opentelemetry/context-async-hooks": "^1.30.1",
"@opentelemetry/core": "^1.30.0",
"@opentelemetry/exporter-logs-otlp-http": "^0.57.2",
"@opentelemetry/exporter-metrics-otlp-http": "^0.57.2",
"@opentelemetry/exporter-trace-otlp-http": "^0.57.2",
"@opentelemetry/instrumentation": "^0.57.2",
"@opentelemetry/instrumentation-amqplib": "^0.46.1",
"@opentelemetry/instrumentation-aws-lambda": "^0.50.3",
"@opentelemetry/instrumentation-aws-sdk": "^0.49.1",
"@opentelemetry/instrumentation-bunyan": "^0.45.1",
"@opentelemetry/instrumentation-cassandra-driver": "^0.45.1",
"@opentelemetry/instrumentation-connect": "^0.43.1",
"@opentelemetry/instrumentation-dataloader": "^0.16.1",
"@opentelemetry/instrumentation-dns": "^0.43.1",
"@opentelemetry/instrumentation-express": "^0.47.1",
"@opentelemetry/instrumentation-fs": "^0.19.1",
"@opentelemetry/instrumentation-graphql": "^0.47.1",
"@opentelemetry/instrumentation-grpc": "^0.57.2",
"@opentelemetry/instrumentation-hapi": "^0.45.2",
"@opentelemetry/instrumentation-http": "^0.57.2",
"@opentelemetry/instrumentation-ioredis": "^0.47.1",
"@opentelemetry/instrumentation-kafkajs": "^0.7.1",
"@opentelemetry/instrumentation-knex": "^0.44.1",
"@opentelemetry/instrumentation-koa": "^0.47.1",
"@opentelemetry/instrumentation-memcached": "^0.43.1",
"@opentelemetry/instrumentation-mongodb": "^0.52.0",
"@opentelemetry/instrumentation-mongoose": "^0.46.1",
"@opentelemetry/instrumentation-mysql": "^0.45.1",
"@opentelemetry/instrumentation-mysql2": "^0.45.2",
"@opentelemetry/instrumentation-nestjs-core": "^0.44.1",
"@opentelemetry/instrumentation-net": "^0.43.1",
"@opentelemetry/instrumentation-pg": "^0.51.1",
"@opentelemetry/instrumentation-pino": "^0.46.1",
"@opentelemetry/instrumentation-redis": "^0.46.1",
"@opentelemetry/instrumentation-restify": "^0.45.1",
"@opentelemetry/instrumentation-socket.io": "^0.46.1",
"@opentelemetry/instrumentation-undici": "^0.10.1",
"@opentelemetry/instrumentation-winston": "^0.44.1",
"@opentelemetry/propagator-aws-xray": "^1.26.2",
"@opentelemetry/propagator-aws-xray-lambda": "^0.53.2",
"@opentelemetry/resource-detector-aws": "^1.12.0",
"@opentelemetry/resources": "^1.30.0",
"@opentelemetry/sdk-logs": "^0.57.0",
"@opentelemetry/sdk-metrics": "^1.30.0",
"@opentelemetry/sdk-trace-base": "^1.30.0"
"@opentelemetry/api-logs": "^0.200.0",
"@opentelemetry/context-async-hooks": "^2.0.0",
"@opentelemetry/core": "^2.0.0",
"@opentelemetry/exporter-logs-otlp-http": "^0.200.0",
"@opentelemetry/exporter-metrics-otlp-http": "^0.200.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.200.0",
"@opentelemetry/exporter-zipkin": "^2.0.0",
"@opentelemetry/instrumentation": "^0.200.0",
"@opentelemetry/instrumentation-amqplib": "^0.47.0",
"@opentelemetry/instrumentation-aws-lambda": "^0.51.0",
"@opentelemetry/instrumentation-aws-sdk": "^0.51.0",
"@opentelemetry/instrumentation-bunyan": "^0.46.0",
"@opentelemetry/instrumentation-cassandra-driver": "^0.46.0",
"@opentelemetry/instrumentation-connect": "^0.44.0",
"@opentelemetry/instrumentation-dataloader": "^0.17.0",
"@opentelemetry/instrumentation-dns": "^0.44.0",
"@opentelemetry/instrumentation-express": "^0.48.1",
"@opentelemetry/instrumentation-fs": "^0.20.0",
"@opentelemetry/instrumentation-graphql": "^0.48.0",
"@opentelemetry/instrumentation-grpc": "^0.200.0",
"@opentelemetry/instrumentation-hapi": "^0.46.0",
"@opentelemetry/instrumentation-http": "^0.200.0",
"@opentelemetry/instrumentation-ioredis": "^0.48.0",
"@opentelemetry/instrumentation-kafkajs": "^0.9.1",
"@opentelemetry/instrumentation-knex": "^0.45.0",
"@opentelemetry/instrumentation-koa": "^0.48.0",
"@opentelemetry/instrumentation-memcached": "^0.44.0",
"@opentelemetry/instrumentation-mongodb": "^0.53.0",
"@opentelemetry/instrumentation-mongoose": "^0.47.0",
"@opentelemetry/instrumentation-mysql": "^0.46.0",
"@opentelemetry/instrumentation-mysql2": "^0.46.0",
"@opentelemetry/instrumentation-nestjs-core": "^0.46.0",
"@opentelemetry/instrumentation-net": "^0.44.0",
"@opentelemetry/instrumentation-pg": "^0.52.0",
"@opentelemetry/instrumentation-pino": "^0.47.0",
"@opentelemetry/instrumentation-redis": "^0.47.0",
"@opentelemetry/instrumentation-restify": "^0.46.0",
"@opentelemetry/instrumentation-socket.io": "^0.47.0",
"@opentelemetry/instrumentation-undici": "^0.11.0",
"@opentelemetry/instrumentation-winston": "^0.45.0",
"@opentelemetry/propagator-aws-xray": "^2.0.0",
"@opentelemetry/propagator-aws-xray-lambda": "^0.54.0",
"@opentelemetry/resource-detector-aws": "^2.0.0",
"@opentelemetry/resources": "^2.0.0",
"@opentelemetry/sdk-logs": "^0.200.0",
"@opentelemetry/sdk-metrics": "^2.0.0",
"@opentelemetry/sdk-trace-node": "^2.0.0"
},
"devDependencies": {
"@types/mocha": "^10.0.9",
Expand Down
1 change: 0 additions & 1 deletion nodejs/packages/layer/scripts/version.js

This file was deleted.

24 changes: 0 additions & 24 deletions nodejs/packages/layer/src/LambdaTracerProvider.ts

This file was deleted.

84 changes: 60 additions & 24 deletions nodejs/packages/layer/src/wrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,29 @@ import {
} from '@opentelemetry/api';
import {
CompositePropagator,
getEnv,
diagLogLevelFromString,
getStringFromEnv,
W3CBaggagePropagator,
W3CTraceContextPropagator,
} from '@opentelemetry/core';
import {
BasicTracerProvider,
BatchSpanProcessor,
ConsoleSpanExporter,
NodeTracerProvider,
SDKRegistrationConfig,
SimpleSpanProcessor,
SpanExporter,
TracerConfig,
} from '@opentelemetry/sdk-trace-base';
} from '@opentelemetry/sdk-trace-node';
import {
detectResourcesSync,
detectResources,
envDetector,
IResource,
Resource,
processDetector,
} from '@opentelemetry/resources';
import { awsLambdaDetector } from '@opentelemetry/resource-detector-aws';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { ZipkinExporter } from '@opentelemetry/exporter-zipkin';
import {
Instrumentation,
registerInstrumentations,
Expand All @@ -45,8 +48,6 @@ import {
import { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';
import { AWSXRayLambdaPropagator } from '@opentelemetry/propagator-aws-xray-lambda';

import { LambdaTracerProvider } from './LambdaTracerProvider';

const defaultInstrumentationList = [
'dns',
'express',
Expand Down Expand Up @@ -83,10 +84,6 @@ declare global {
defaultSdkRegistration: SDKRegistrationConfig,
): SDKRegistrationConfig;
function configureTracer(defaultConfig: TracerConfig): TracerConfig;
/**
* @deprecated please use {@link configureTracer} instead.
*/
function configureTracerProvider(tracerProvider: BasicTracerProvider): void;

// No explicit metric type here, but "unknown" type.
// Because metric packages are important dynamically.
Expand Down Expand Up @@ -359,32 +356,71 @@ function getPropagator(): TextMapPropagator {
return new CompositePropagator({ propagators });
}

function getExportersFromEnv(): SpanExporter[] {
if (
process.env.OTEL_TRACES_EXPORTER == null ||
process.env.OTEL_TRACES_EXPORTER.trim() === '' ||
process.env.OTEL_TRACES_EXPORTER.includes('none')
) {
return [new OTLPTraceExporter()];
}

const stringToExporter = new Map<string, () => SpanExporter>([
['otlp', () => new OTLPTraceExporter()],
['zipkin', () => new ZipkinExporter()],
['console', () => new ConsoleSpanExporter()],
]);
const exporters: SpanExporter[] = [];
process.env.OTEL_TRACES_EXPORTER.split(',').map(exporterName => {
exporterName.toLowerCase().trim();
const exporter = stringToExporter.get(exporterName);
if (exporter) {
exporters.push(exporter());
} else {
diag.warn(
`Invalid exporter "${exporterName}" specified in the environment variable OTEL_TRACES_EXPORTER`,
);
}
});
return exporters;
}

async function initializeTracerProvider(
resource: IResource,
resource: Resource,
): Promise<TracerProvider> {
let config: TracerConfig = {
resource,
spanProcessors: [],
};

if (typeof configureTracer === 'function') {
config = configureTracer(config);
} else if (process.env.OTEL_TRACES_EXPORTER) {
const exporters = getExportersFromEnv();
exporters.map(exporter => {
if (exporter instanceof ConsoleSpanExporter) {
config.spanProcessors?.push(new SimpleSpanProcessor(exporter));
} else {
config.spanProcessors?.push(new BatchSpanProcessor(exporter));
}
});
}

const tracerProvider = new LambdaTracerProvider(config);
if (typeof configureTracerProvider === 'function') {
configureTracerProvider(tracerProvider);
} else {
// Defaults
tracerProvider.addSpanProcessor(
if (config.spanProcessors?.length === 0) {
// Default
config.spanProcessors?.push(
new BatchSpanProcessor(new OTLPTraceExporter()),
);
}

// Logging for debug
if (logLevel === DiagLogLevel.DEBUG) {
tracerProvider.addSpanProcessor(
config.spanProcessors?.push(
new SimpleSpanProcessor(new ConsoleSpanExporter()),
);
}

const tracerProvider = new NodeTracerProvider(config);

let sdkRegistrationConfig: SDKRegistrationConfig = {};
if (typeof configureSdkRegistration === 'function') {
sdkRegistrationConfig = configureSdkRegistration(sdkRegistrationConfig);
Expand All @@ -399,7 +435,7 @@ async function initializeTracerProvider(
}

async function initializeMeterProvider(
resource: IResource,
resource: Resource,
): Promise<unknown | undefined> {
if (process.env.OTEL_METRICS_EXPORTER === 'none') {
return;
Expand Down Expand Up @@ -442,7 +478,7 @@ async function initializeMeterProvider(
}

async function initializeLoggerProvider(
resource: IResource,
resource: Resource,
): Promise<unknown | undefined> {
if (process.env.OTEL_LOGS_EXPORTER === 'none') {
return;
Expand Down Expand Up @@ -484,7 +520,7 @@ async function initializeLoggerProvider(
}

async function initializeProvider() {
const resource = detectResourcesSync({
const resource = detectResources({
detectors: [awsLambdaDetector, envDetector, processDetector],
});

Expand Down Expand Up @@ -572,5 +608,5 @@ let metricsDisableFunction: () => void;
let logsDisableFunction: () => void;

// Configure lambda logging
const logLevel = getEnv().OTEL_LOG_LEVEL;
const logLevel = diagLogLevelFromString(getStringFromEnv('OTEL_LOG_LEVEL'));
diag.setLogger(new DiagConsoleLogger(), logLevel);
2 changes: 1 addition & 1 deletion nodejs/packages/layer/test/handler.spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
import {
BatchSpanProcessor,
InMemorySpanExporter
} from '@opentelemetry/sdk-trace-base';
} from '@opentelemetry/sdk-trace-node';

import { registerLoader } from '../src/loader.mjs';
import { init, wrap, unwrap } from '../build/src/wrapper.js';
Expand Down
2 changes: 1 addition & 1 deletion nodejs/packages/layer/test/handler.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
BatchSpanProcessor,
InMemorySpanExporter,
ReadableSpan,
} from '@opentelemetry/sdk-trace-base';
} from '@opentelemetry/sdk-trace-node';
import { Context } from 'aws-lambda';

import { init, wrap, unwrap } from '../src/wrapper';
Expand Down
Loading