diff --git a/package-lock.json b/package-lock.json index 28744a2ed0..f15a108ea7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -185,7 +185,7 @@ "yargs": "17.5.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" }, "optionalDependencies": { "couchbase": "4.6.0", @@ -47054,7 +47054,7 @@ "semver": "^7.7.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" } }, "packages/autoprofile/node_modules/detect-libc": { @@ -47094,7 +47094,7 @@ "@instana/serverless": "4.30.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" } }, "packages/aws-lambda": { @@ -47107,7 +47107,7 @@ "semver": "^7.7.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" } }, "packages/aws-lambda-auto-wrap": { @@ -47153,7 +47153,7 @@ "@instana/serverless": "4.30.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" } }, "packages/collector": { @@ -47175,7 +47175,7 @@ "typeorm": "^0.3.27" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" }, "optionalDependencies": { "@instana/autoprofile": "4.30.1" @@ -48040,7 +48040,7 @@ "@opentelemetry/instrumentation-restify": "0.53.0", "@opentelemetry/instrumentation-socket.io": "0.54.0", "@opentelemetry/instrumentation-tedious": "0.27.0", - "@opentelemetry/sdk-trace-base": "1.25.0", + "@opentelemetry/sdk-trace-base": "2.2.0", "cls-bluebird": "^2.1.0", "import-in-the-middle": "2.0.0", "lru-cache": "^10.1.0", @@ -48071,54 +48071,58 @@ } }, "packages/core/node_modules/@opentelemetry/core": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.0.tgz", - "integrity": "sha512-n0B3s8rrqGrasTgNkXLKXzN0fXo+6IYP7M5b7AMsrZM33f/y6DS6kJ0Btd7SespASWq8bgL3taLo0oe0vB52IQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", + "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "packages/core/node_modules/@opentelemetry/resources": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.0.tgz", - "integrity": "sha512-iHjydPMYJ+Li1auveJCq2rp5U2h6Mhq8BidiyE0jfVlDTFyR1ny8AfJHfmFzJ/RAM8vT8L7T21kcmGybxZC7lQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", + "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "packages/core/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.0.tgz", - "integrity": "sha512-6+g2fiRQUG39guCsKVeY8ToeuUf3YUnPkN6DXRA1qDmFLprlLvZm9cS6+chgbW70cZJ406FTtSCDnJwxDC5sGQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", + "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.25.0", - "@opentelemetry/resources": "1.25.0", - "@opentelemetry/semantic-conventions": "1.25.0" + "@opentelemetry/core": "2.2.0", + "@opentelemetry/resources": "2.2.0", + "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { - "node": ">=14" + "node": "^18.19.0 || >=20.6.0" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "packages/core/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.0.tgz", - "integrity": "sha512-M+kkXKRAIAiAP6qYyesfrC5TOmDpDVtsxuGfPcqd9B/iBrac+E14jYwrgm0yZBUIbIP2OnqC3j+UgkXLm1vxUQ==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", + "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", + "license": "Apache-2.0", "engines": { "node": ">=14" } @@ -48157,7 +48161,7 @@ "@instana/serverless": "4.30.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" } }, "packages/metrics-util": { @@ -48168,6 +48172,9 @@ "@instana/core": "4.30.1", "@instana/shared-metrics": "4.30.1", "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=18.19.0" } }, "packages/metrics-util/node_modules/node-fetch": { @@ -48228,7 +48235,7 @@ "chai-spies": "1.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" } }, "packages/opentelemetry-exporter/node_modules/@grpc/grpc-js": { @@ -49654,7 +49661,7 @@ "nock": "^13.2.9" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.19.0" } }, "packages/opentelemetry-sampler/node_modules/@grpc/grpc-js": { @@ -51196,6 +51203,9 @@ "dependencies": { "@instana/core": "4.30.1", "https-proxy-agent": "^7.0.6" + }, + "engines": { + "node": ">=18.19.0" } }, "packages/serverless-collector": { @@ -51205,6 +51215,9 @@ "dependencies": { "@instana/core": "4.30.1", "@instana/serverless": "4.30.1" + }, + "engines": { + "node": ">=18.19.0" } }, "packages/serverless/node_modules/agent-base": { @@ -51243,6 +51256,9 @@ "devDependencies": { "@types/tar": "^6.1.6" }, + "engines": { + "node": ">=18.19.0" + }, "optionalDependencies": { "event-loop-stats": "1.4.1", "gcstats.js": "1.0.0" diff --git a/packages/collector/test/tracing/opentelemetry/test.js b/packages/collector/test/tracing/opentelemetry/test.js index d95a48dfa1..609f4bec63 100644 --- a/packages/collector/test/tracing/opentelemetry/test.js +++ b/packages/collector/test/tracing/opentelemetry/test.js @@ -915,7 +915,10 @@ mochaSuiteFn('opentelemetry tests', function () { dataProperty: 'tags', extraTests: span => { expect(span.data.tags.name).to.eql('fs readFileSync'); - checkTelemetryResourceAttrs(span); + + // This test uses a global OpenTelemetry SDK instance, which still uses sdk version v1. + // Its nice to keep it like that to proof that v1 and v2 work fine with our integration. + checkTelemetryResourceAttrs(span, /1\.\d+\.\d/); } }); @@ -928,7 +931,7 @@ mochaSuiteFn('opentelemetry tests', function () { dataProperty: 'tags', extraTests: span => { expect(span.data.tags.name).to.eql('fs statSync'); - checkTelemetryResourceAttrs(span); + checkTelemetryResourceAttrs(span, /1\.\d+\.\d/); } }); }) @@ -995,8 +998,8 @@ mochaSuiteFn('opentelemetry tests', function () { expect(response.otelspan.name).to.eql('explicit-otel-operation'); expect(response.otelspan._spanContext).to.have.property('traceId'); expect(response.otelspan._spanContext).to.have.property('spanId'); - expect(response.otelspan.instrumentationLibrary).to.be.an('object'); - expect(response.otelspan.instrumentationLibrary.name).to.eql('otel-sdk-app-tracer'); + expect(response.otelspan.instrumentationScope).to.be.an('object'); + expect(response.otelspan.instrumentationScope.name).to.eql('otel-sdk-app-tracer'); }) .then(() => delay(DELAY_TIMEOUT_IN_MS)) .then(() => @@ -1021,11 +1024,11 @@ mochaSuiteFn('opentelemetry tests', function () { }); }); -function checkTelemetryResourceAttrs(span) { +function checkTelemetryResourceAttrs(span, otelSdkVersion = /2\.\d+\.\d/) { expect(span.data.resource['service.name']).to.not.exist; expect(span.data.resource['telemetry.sdk.language']).to.eql('nodejs'); expect(span.data.resource['telemetry.sdk.name']).to.eql('opentelemetry'); - expect(span.data.resource['telemetry.sdk.version']).to.match(/1\.\d+\.\d/); + expect(span.data.resource['telemetry.sdk.version']).to.match(otelSdkVersion); } function verifyHttpExit(spans, parentSpan) { diff --git a/packages/core/package.json b/packages/core/package.json index dd6ac27832..3d74ba076b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -64,7 +64,7 @@ "@opentelemetry/instrumentation-restify": "0.53.0", "@opentelemetry/instrumentation-socket.io": "0.54.0", "@opentelemetry/instrumentation-tedious": "0.27.0", - "@opentelemetry/sdk-trace-base": "1.25.0", + "@opentelemetry/sdk-trace-base": "2.2.0", "cls-bluebird": "^2.1.0", "import-in-the-middle": "2.0.0", "lru-cache": "^10.1.0", diff --git a/packages/core/src/tracing/opentelemetry-instrumentations/tedious.js b/packages/core/src/tracing/opentelemetry-instrumentations/tedious.js index ef6d8b0947..0b0753bdc7 100644 --- a/packages/core/src/tracing/opentelemetry-instrumentations/tedious.js +++ b/packages/core/src/tracing/opentelemetry-instrumentations/tedious.js @@ -18,14 +18,6 @@ module.exports.init = () => { instrumentation.enable(); } }; -exports.transform = otelSpan => { - // NOTE: This assignment is necessary to display the database name in the UI. - // In the backend, for OpenTelemetry, the service name is based on the OpenTelemetry span attribute service.name. - if (otelSpan.attributes && 'db.name' in otelSpan.attributes) { - otelSpan.resource._attributes['service.name'] = otelSpan.attributes['db.name']; - } - return otelSpan; -}; module.exports.getKind = () => { const kind = constants.EXIT; diff --git a/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js b/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js index 7908db4048..b99141249b 100644 --- a/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js +++ b/packages/core/src/tracing/opentelemetry-instrumentations/wrap.js @@ -40,11 +40,19 @@ module.exports.init = (_config, cls) => { }); const transformToInstanaSpan = otelSpan => { - if (!otelSpan || !otelSpan.instrumentationLibrary) { + // TODO: remove instrumentationLibrary in next major release + // instrumentationScope was introduced in OpenTelemetry v2 + if (!otelSpan || (!otelSpan.instrumentationScope && !otelSpan.instrumentationLibrary)) { + return; + } + + const targetInstrumentionName = + otelSpan.instrumentationScope?.name || otelSpan.instrumentationLibrary?.name || null; + + if (!targetInstrumentionName) { return; } - const targetInstrumentionName = otelSpan.instrumentationLibrary.name; let kind = constants.EXIT; if (instrumentations[targetInstrumentionName] && instrumentations[targetInstrumentionName].module) {