From 2faf04b2e4af8a939c2ce4fd1076895c065a87cd Mon Sep 17 00:00:00 2001 From: David Luna Date: Fri, 21 Mar 2025 11:31:49 +0100 Subject: [PATCH 01/11] feat(otel-node): set stable http semconv as default --- .../lib/instrumentations.js | 6 +++ .../test/instr-http.test.js | 48 ++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-node/lib/instrumentations.js b/packages/opentelemetry-node/lib/instrumentations.js index 02f8b7fa..322088b2 100644 --- a/packages/opentelemetry-node/lib/instrumentations.js +++ b/packages/opentelemetry-node/lib/instrumentations.js @@ -259,6 +259,12 @@ function getInstrumentations(opts = {}) { 'OTEL_NODE_DISABLED_INSTRUMENTATIONS' ); + // `@opentelemetry/instrumentation-http` defaults to emit old semconv attributes. + // Set the default to stable semconv if not defined by the user + if (!('OTEL_SEMCONV_STABILITY_OPT_IN' in process.env)) { + process.env.OTEL_SEMCONV_STABILITY_OPT_IN = 'http'; + } + Object.keys(instrumentationsMap).forEach((name) => { // Skip if env has an `enabled` list and does not include this one if (enabledFromEnv && !enabledFromEnv.includes(name)) { diff --git a/packages/opentelemetry-node/test/instr-http.test.js b/packages/opentelemetry-node/test/instr-http.test.js index 91dd1238..8c36782d 100644 --- a/packages/opentelemetry-node/test/instr-http.test.js +++ b/packages/opentelemetry-node/test/instr-http.test.js @@ -11,13 +11,53 @@ const {runTestFixtures} = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ const testFixtures = [ { - name: 'http.get', + name: 'http.get (stable semconv as default)', args: ['./fixtures/use-http-get.js'], cwd: __dirname, env: { NODE_OPTIONS: '--require=@elastic/opentelemetry-node', }, // verbose: true, + checkTelemetry: (t, col) => { + const spans = col.sortedSpans; + console.log(spans) + t.equal(spans.length, 1); + const span = spans[0]; + t.equal(span.scope.name, '@opentelemetry/instrumentation-http'); + t.equal(span.name, 'GET'); + t.equal(span.kind, 'SPAN_KIND_CLIENT'); + t.equal(span.attributes['http.url'], undefined); + t.equal(span.attributes['url.full'], 'http://www.google.com/'); + }, + }, + { + name: 'https.get (stable semconv as default)', + args: ['./fixtures/use-https-get.js'], + cwd: __dirname, + env: { + NODE_OPTIONS: '--require=@elastic/opentelemetry-node', + }, + // verbose: true, + checkTelemetry: (t, col) => { + const spans = col.sortedSpans; + t.equal(spans.length, 1); + const span = spans[0]; + t.equal(span.scope.name, '@opentelemetry/instrumentation-http'); + t.equal(span.name, 'GET'); + t.equal(span.kind, 'SPAN_KIND_CLIENT'); + t.equal(span.attributes['http.url'], undefined); + t.equal(span.attributes['url.full'], 'http://www.google.com/'); + }, + }, + { + name: 'http.get (dual mode semconv)', + args: ['./fixtures/use-http-get.js'], + cwd: __dirname, + env: { + NODE_OPTIONS: '--require=@elastic/opentelemetry-node', + OTEL_SEMCONV_STABILITY_OPT_IN: 'http/dup', + }, + // verbose: true, checkTelemetry: (t, col) => { const spans = col.sortedSpans; t.equal(spans.length, 1); @@ -26,14 +66,16 @@ const testFixtures = [ t.equal(span.name, 'GET'); t.equal(span.kind, 'SPAN_KIND_CLIENT'); t.equal(span.attributes['http.url'], 'http://www.google.com/'); + t.equal(span.attributes['url.full'], 'http://www.google.com/'); }, }, { - name: 'https.get', + name: 'https.get (dual mode semconv)', args: ['./fixtures/use-https-get.js'], cwd: __dirname, env: { NODE_OPTIONS: '--require=@elastic/opentelemetry-node', + OTEL_SEMCONV_STABILITY_OPT_IN: 'http/dup', }, // verbose: true, checkTelemetry: (t, col) => { @@ -44,6 +86,7 @@ const testFixtures = [ t.equal(span.name, 'GET'); t.equal(span.kind, 'SPAN_KIND_CLIENT'); t.equal(span.attributes['http.url'], 'https://www.google.com/'); + t.equal(span.attributes['url.full'], 'http://www.google.com/'); }, }, { @@ -52,6 +95,7 @@ const testFixtures = [ cwd: __dirname, env: { NODE_OPTIONS: '--require=@elastic/opentelemetry-node', + OTEL_SEMCONV_STABILITY_OPT_IN: 'http/dup', }, // verbose: true, checkTelemetry: (t, col) => { From c577d341e7aa0f15349aea63b5a9d00c3caa35dd Mon Sep 17 00:00:00 2001 From: David Luna Date: Tue, 25 Mar 2025 12:16:03 +0100 Subject: [PATCH 02/11] chore(otel-node): default to stable HTTP semconv --- .../test/instr-aws-sdk.test.js | 10 ++++----- .../test/instr-elastic-openai.test.js | 7 ++++--- .../test/instr-elasticsearch.test.js | 4 ++-- .../test/instr-express.test.js | 3 ++- .../test/instr-fastify.test.js | 5 +++-- .../test/instr-grpc.test.js | 4 ++-- .../test/instr-hapi.test.js | 4 ++-- .../test/instr-http.test.js | 17 +++++++-------- .../test/instr-mongodb.test.js | 4 ++-- .../test/instr-mongoose.test.js | 4 ++-- .../test/instr-mysql.test.js | 4 ++-- .../test/instr-mysql2.test.js | 4 ++-- .../opentelemetry-node/test/instr-pg.test.js | 4 ++-- .../test/instr-tedious.test.js | 4 ++-- .../test/instr-undici.test.js | 8 +++---- packages/opentelemetry-node/test/testutils.js | 21 +++++++++++++++++++ 16 files changed, 65 insertions(+), 42 deletions(-) diff --git a/packages/opentelemetry-node/test/instr-aws-sdk.test.js b/packages/opentelemetry-node/test/instr-aws-sdk.test.js index 3620941d..b2f8d965 100644 --- a/packages/opentelemetry-node/test/instr-aws-sdk.test.js +++ b/packages/opentelemetry-node/test/instr-aws-sdk.test.js @@ -10,7 +10,7 @@ const http = require('http'); const path = require('path'); const test = require('tape'); -const {runTestFixtures} = require('./testutils'); +const {runTestFixtures, filterOutGcpDetectorSpans} = require('./testutils'); const TEST_REGION = 'us-east-2'; @@ -41,7 +41,7 @@ const testFixtures = [ // span b592a3 "manual-parent-span" (26.1ms, SPAN_KIND_INTERNAL) // +4ms `- span bbe07e "S3.ListBuckets" (21.5ms, SPAN_KIND_CLIENT) // +10ms `- span b3b885 "GET" (7.0ms, SPAN_KIND_CLIENT, GET http://localhost:4566/?x-id=ListBuckets -> 200) - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 2); t.equal( @@ -77,7 +77,7 @@ const testFixtures = [ // span b592a3 "manual-parent-span" (26.1ms, SPAN_KIND_INTERNAL) // +4ms `- span bbe07e "SNS ListBuckets" (21.5ms, SPAN_KIND_CLIENT) // +10ms `- span b3b885 "POST" (7.0ms, SPAN_KIND_CLIENT, POST http://localhost:4566/ -> 200) - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 2); t.equal( @@ -114,7 +114,7 @@ const testFixtures = [ // span b592a3 "manual-parent-span" (26.1ms, SPAN_KIND_INTERNAL) // +4ms `- span bbe07e "SQS.ListQueues" (21.5ms, SPAN_KIND_CLIENT) // +10ms `- span b3b885 "POST" (7.0ms, SPAN_KIND_CLIENT, POST http://localhost:4566/ -> 200) - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 2); t.equal( @@ -152,7 +152,7 @@ const testFixtures = [ // span b592a3 "manual-parent-span" (26.1ms, SPAN_KIND_INTERNAL) // +4ms `- span bbe07e "DynamoDB.ListTables" (21.5ms, SPAN_KIND_CLIENT) // +10ms `- span b3b885 "POST" (7.0ms, SPAN_KIND_CLIENT, POST http://localhost:4566/ -> 200) - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 2); t.equal( diff --git a/packages/opentelemetry-node/test/instr-elastic-openai.test.js b/packages/opentelemetry-node/test/instr-elastic-openai.test.js index b9c9c860..95119d09 100644 --- a/packages/opentelemetry-node/test/instr-elastic-openai.test.js +++ b/packages/opentelemetry-node/test/instr-elastic-openai.test.js @@ -7,7 +7,7 @@ const http = require('http'); const {basename} = require('path'); const test = require('tape'); const semver = require('semver'); -const {runTestFixtures, assertDeepMatch} = require('./testutils'); +const {runTestFixtures, filterOutGcpDetectorSpans, assertDeepMatch} = require('./testutils'); let skip = process.env.TEST_GENAI_MODEL === undefined; if (skip) { @@ -35,7 +35,8 @@ const testFixtures = [ // Expected a trace like this: // span 7e8ca8 "embeddings all-minilm:22m" (26.4ms, SPAN_KIND_CLIENT, GenAI openai) // +9ms `- span 39fc32 "POST" (16.7ms, SPAN_KIND_CLIENT, POST http://127.0.0.1:11434/v1/embeddings -> 200) - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); + console.log(spans) assertDeepMatch( t, spans, @@ -58,7 +59,7 @@ const testFixtures = [ name: 'POST', parentSpanId: spans[0].spanId, attributes: { - 'http.target': '/v1/embeddings', + 'url.full': 'http://127.0.0.1:11434/v1/embeddings', }, scope: { name: '@opentelemetry/instrumentation-http', diff --git a/packages/opentelemetry-node/test/instr-elasticsearch.test.js b/packages/opentelemetry-node/test/instr-elasticsearch.test.js index 13aeb844..08220d73 100644 --- a/packages/opentelemetry-node/test/instr-elasticsearch.test.js +++ b/packages/opentelemetry-node/test/instr-elasticsearch.test.js @@ -7,7 +7,7 @@ // and later. const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); const skip = process.env.ES_URL === undefined; if (skip) { @@ -20,7 +20,7 @@ function checkTelemetry(t, col) { // Expected a trace like this: // span 91a6b1 "search" (13.4ms, SPAN_KIND_CLIENT, GET http://localhost:9200/) // +2ms `- span 14278c "GET" (10.8ms, SPAN_KIND_CLIENT, GET http://localhost:9200/_search?q=pants -> 200) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 2); t.equal(spans[0].name, 'search'); t.equal(spans[0].kind, 'SPAN_KIND_CLIENT', 'kind'); diff --git a/packages/opentelemetry-node/test/instr-express.test.js b/packages/opentelemetry-node/test/instr-express.test.js index 3fa9473e..b4da90b0 100644 --- a/packages/opentelemetry-node/test/instr-express.test.js +++ b/packages/opentelemetry-node/test/instr-express.test.js @@ -10,6 +10,7 @@ const { filterOutDnsNetSpans, runTestFixtures, findObjInArray, + filterOutGcpDetectorSpans, } = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ @@ -36,7 +37,7 @@ const testFixtures = [ // +0ms `- span 2092ee "middleware - query" (0.1ms, SPAN_KIND_INTERNAL) // +0ms `- span 033a59 "middleware - expressInit" (0.1ms, SPAN_KIND_INTERNAL) // +1ms `- span 5573dc "request handler - /hi/:name" (0.0ms, SPAN_KIND_INTERNAL) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 10); t.equal(spans[0].scope.name, '@opentelemetry/instrumentation-http'); diff --git a/packages/opentelemetry-node/test/instr-fastify.test.js b/packages/opentelemetry-node/test/instr-fastify.test.js index 5ba4dc1f..fcb2c198 100644 --- a/packages/opentelemetry-node/test/instr-fastify.test.js +++ b/packages/opentelemetry-node/test/instr-fastify.test.js @@ -10,6 +10,7 @@ const { filterOutDnsNetSpans, runTestFixtures, findObjInArray, + filterOutGcpDetectorSpans, } = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ @@ -27,7 +28,7 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 4); t.ok( @@ -70,7 +71,7 @@ const testFixtures = [ // span 6e0fc9 "GET" (1.6ms, SPAN_KIND_CLIENT, GET http://localhost:3000/hi/Bob -> 200) // +1ms `- span 40c4a8 "GET /hi/:name" (0.3ms, SPAN_KIND_SERVER, GET http://localhost:3000/hi/Bob -> 200) // +0ms `- span 74a68a "request handler - fastify" (0.1ms, SPAN_KIND_INTERNAL) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 6); t.equal(spans[0].scope.name, '@opentelemetry/instrumentation-http'); diff --git a/packages/opentelemetry-node/test/instr-grpc.test.js b/packages/opentelemetry-node/test/instr-grpc.test.js index d6a1911d..830badda 100644 --- a/packages/opentelemetry-node/test/instr-grpc.test.js +++ b/packages/opentelemetry-node/test/instr-grpc.test.js @@ -6,7 +6,7 @@ // Test that instrumentation-grpc generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, runTestFixtures, filterOutGcpDetectorSpans} = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ const testFixtures = [ @@ -19,7 +19,7 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 2); t.equal(spans[0].kind, 'SPAN_KIND_CLIENT'); t.equal(spans[1].kind, 'SPAN_KIND_SERVER'); diff --git a/packages/opentelemetry-node/test/instr-hapi.test.js b/packages/opentelemetry-node/test/instr-hapi.test.js index e743e238..cbbbfef1 100644 --- a/packages/opentelemetry-node/test/instr-hapi.test.js +++ b/packages/opentelemetry-node/test/instr-hapi.test.js @@ -6,7 +6,7 @@ // Test that 'hapi' instrumentation generates the telemetry we expect. const test = require('tape'); -const {runTestFixtures, findObjInArray} = require('./testutils'); +const {runTestFixtures, findObjInArray, filterOutGcpDetectorSpans} = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ const testFixtures = [ @@ -31,7 +31,7 @@ const testFixtures = [ // span 9a96c1 "GET" (2.0ms, SPAN_KIND_CLIENT, GET http://localhost:3000/hi/Bob -> 200) // +1ms `- span dfacba "GET /hi/{name}" (0.5ms, SPAN_KIND_SERVER, GET http://localhost:3000/hi/Bob -> 200) // +0ms `- span 71a126 "route - /hi/{name}" (0.0ms, SPAN_KIND_INTERNAL, GET) - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 6); t.equal(spans[0].scope.name, '@opentelemetry/instrumentation-http'); diff --git a/packages/opentelemetry-node/test/instr-http.test.js b/packages/opentelemetry-node/test/instr-http.test.js index 8c36782d..15ebc20d 100644 --- a/packages/opentelemetry-node/test/instr-http.test.js +++ b/packages/opentelemetry-node/test/instr-http.test.js @@ -6,7 +6,7 @@ // Test that 'http' instrumentation generates the telemetry we expect. const test = require('tape'); -const {runTestFixtures} = require('./testutils'); +const {runTestFixtures, filterOutGcpDetectorSpans} = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ const testFixtures = [ @@ -19,8 +19,7 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = col.sortedSpans; - console.log(spans) + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-http'); @@ -39,14 +38,14 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-http'); t.equal(span.name, 'GET'); t.equal(span.kind, 'SPAN_KIND_CLIENT'); t.equal(span.attributes['http.url'], undefined); - t.equal(span.attributes['url.full'], 'http://www.google.com/'); + t.equal(span.attributes['url.full'], 'https://www.google.com/'); }, }, { @@ -59,7 +58,7 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-http'); @@ -79,14 +78,14 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-http'); t.equal(span.name, 'GET'); t.equal(span.kind, 'SPAN_KIND_CLIENT'); t.equal(span.attributes['http.url'], 'https://www.google.com/'); - t.equal(span.attributes['url.full'], 'http://www.google.com/'); + t.equal(span.attributes['url.full'], 'https://www.google.com/'); }, }, { @@ -106,7 +105,7 @@ const testFixtures = [ // ------ trace b8467d (2 spans) ------ // span bc8a2c "POST" (3.8ms, SPAN_KIND_CLIENT, POST http://127.0.0.1:64972/echo -> 200) // +2ms `- span 4e7adf "POST" (1.1ms, SPAN_KIND_SERVER, POST http://127.0.0.1:64972/echo -> 200) - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 4); t.equal(spans[0].scope.name, '@opentelemetry/instrumentation-http'); t.equal(spans[0].name, 'GET'); diff --git a/packages/opentelemetry-node/test/instr-mongodb.test.js b/packages/opentelemetry-node/test/instr-mongodb.test.js index 31a832af..b80f9a38 100644 --- a/packages/opentelemetry-node/test/instr-mongodb.test.js +++ b/packages/opentelemetry-node/test/instr-mongodb.test.js @@ -6,7 +6,7 @@ // Test that 'mongodb' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); let skip = process.env.MONGODB_HOST === undefined; if (skip) { @@ -36,7 +36,7 @@ const testFixtures = [ // +13ms `- span 1e5ee2 "mongodb.insert" (1.4ms, SPAN_KIND_CLIENT) // +3ms `- span 3d4723 "mongodb.delete" (0.6ms, SPAN_KIND_CLIENT) // +1ms `- span 1c1373 "mongodb.endSessions" (0.3ms, SPAN_KIND_CLIENT) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 4); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-mongoose.test.js b/packages/opentelemetry-node/test/instr-mongoose.test.js index e5b900c8..f991c7aa 100644 --- a/packages/opentelemetry-node/test/instr-mongoose.test.js +++ b/packages/opentelemetry-node/test/instr-mongoose.test.js @@ -6,7 +6,7 @@ // Test that 'mongoose' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); let skip = process.env.MONGODB_HOST === undefined; if (skip) { @@ -40,7 +40,7 @@ const testFixtures = [ // +13ms `- span 5be842 "mongodb.drop" (0.8ms, SPAN_KIND_CLIENT) // +1ms `- span 13d56b "mongodb.endSessions" (0.3ms, SPAN_KIND_CLIENT) // -20ms `- span c4e688 "mongoose.User.save" (18.9ms, SPAN_KIND_CLIENT) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 7); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-mysql.test.js b/packages/opentelemetry-node/test/instr-mysql.test.js index 6d635955..0e263a2c 100644 --- a/packages/opentelemetry-node/test/instr-mysql.test.js +++ b/packages/opentelemetry-node/test/instr-mysql.test.js @@ -6,7 +6,7 @@ // Test that 'mysql' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); let skip = process.env.MYSQL_HOST === undefined; if (skip) { @@ -31,7 +31,7 @@ const testFixtures = [ // span 8ef53e "manual-parent-span" (21.7ms, SPAN_KIND_INTERNAL) // +1ms `- span 715182 "tcp.connect" (9.4ms, SPAN_KIND_INTERNAL) // +2ms `- span 430253 "SELECT" (18.2ms, SPAN_KIND_CLIENT) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 2); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-mysql2.test.js b/packages/opentelemetry-node/test/instr-mysql2.test.js index dda1f39a..7a6c0100 100644 --- a/packages/opentelemetry-node/test/instr-mysql2.test.js +++ b/packages/opentelemetry-node/test/instr-mysql2.test.js @@ -6,7 +6,7 @@ // Test that 'mysql2' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); let skip = process.env.MYSQL_HOST === undefined; if (skip) { @@ -31,7 +31,7 @@ const testFixtures = [ // span 8ef53e "manual-parent-span" (21.7ms, SPAN_KIND_INTERNAL) // +1ms `- span 715182 "tcp.connect" (9.4ms, SPAN_KIND_INTERNAL) // +2ms `- span 430253 "SELECT" (18.2ms, SPAN_KIND_CLIENT) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 2); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-pg.test.js b/packages/opentelemetry-node/test/instr-pg.test.js index 1c0f2bf9..b7918f62 100644 --- a/packages/opentelemetry-node/test/instr-pg.test.js +++ b/packages/opentelemetry-node/test/instr-pg.test.js @@ -4,7 +4,7 @@ */ const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); const skip = process.env.PGHOST === undefined; if (skip) { @@ -29,7 +29,7 @@ const testFixtures = [ // span 102150 "manual-parent-span" (7.5ms, SPAN_KIND_INTERNAL) // +3ms `- span 539d9d "pg.connect" (12.0ms, SPAN_KIND_CLIENT) // +13ms `- span 115c08 "pg.query:SELECT postgres" (2.4ms, SPAN_KIND_CLIENT) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 3); spans.slice(1).forEach((s) => { t.equal(s.traceId, spans[0].traceId, 'traceId'); diff --git a/packages/opentelemetry-node/test/instr-tedious.test.js b/packages/opentelemetry-node/test/instr-tedious.test.js index 54f08432..83e2a62b 100644 --- a/packages/opentelemetry-node/test/instr-tedious.test.js +++ b/packages/opentelemetry-node/test/instr-tedious.test.js @@ -5,7 +5,7 @@ const test = require('tape'); const semver = require('semver'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); const tediousVer = require('tedious/package.json').version; let skip = process.env.MSSQL_HOST === undefined; @@ -45,7 +45,7 @@ const testFixtures = [ // ------ trace d1755e (2 spans) ------ // span 6bb8d8 "manual-parent-span" (54.3ms, SPAN_KIND_INTERNAL) // +51ms `- span fb837e "execSql master" (3.0ms, SPAN_KIND_CLIENT) - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 2); const s = spans.pop(); diff --git a/packages/opentelemetry-node/test/instr-undici.test.js b/packages/opentelemetry-node/test/instr-undici.test.js index fc055182..8c422bec 100644 --- a/packages/opentelemetry-node/test/instr-undici.test.js +++ b/packages/opentelemetry-node/test/instr-undici.test.js @@ -6,7 +6,7 @@ const {satisfies} = require('semver'); const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures} = require('./testutils'); +const {filterOutDnsNetSpans, runTestFixtures, filterOutGcpDetectorSpans} = require('./testutils'); function getNodeVerRangeForCurrUndici() { const undiciVer = require('undici/package.json').version; @@ -34,7 +34,7 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = filterOutDnsNetSpans(col.sortedSpans); + const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-undici'); @@ -56,7 +56,7 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-undici'); @@ -84,7 +84,7 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = col.sortedSpans; + const spans = filterOutGcpDetectorSpans(col.sortedSpans); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-undici'); diff --git a/packages/opentelemetry-node/test/testutils.js b/packages/opentelemetry-node/test/testutils.js index 6345fbf1..d9331740 100644 --- a/packages/opentelemetry-node/test/testutils.js +++ b/packages/opentelemetry-node/test/testutils.js @@ -84,6 +84,26 @@ function filterOutDnsNetSpans(spans) { ); } +/** + * Filter out HTTP spans from GCP resource detector + * Temporary solution until https://github.com/open-telemetry/opentelemetry-js-contrib/issues/2320 + * is completed. + * + * @param {CollectedSpan[]} spans + * @returns {CollectedSpan[]} + */ +function filterOutGcpDetectorSpans(spans) { + // Filter out GCP resource detector spans for testing. + return spans.filter( + (s) => + s.scope.name !== '@opentelemetry/instrumentation-http' || + ![ + '169.254.169.254', + 'metadata.google.internal.', + ].includes(s.attributes['server.address']) + ); +} + /** * Lookup the property "str" (given in dot-notation) in the object "obj". * If the property isn't found, then `undefined` is returned. @@ -687,6 +707,7 @@ function runTestFixtures(suite, testFixtures) { module.exports = { assertDeepMatch, filterOutDnsNetSpans, + filterOutGcpDetectorSpans, dottedLookup, findObjInArray, findObjsInArray, From 8763749b88430d387417d81d4e8a622dffc7d73a Mon Sep 17 00:00:00 2001 From: David Luna Date: Tue, 25 Mar 2025 12:18:18 +0100 Subject: [PATCH 03/11] chore(otel-node): fix lint issues --- .../test/instr-elastic-openai.test.js | 8 ++++++-- .../test/instr-elasticsearch.test.js | 10 ++++++++-- packages/opentelemetry-node/test/instr-express.test.js | 4 +++- packages/opentelemetry-node/test/instr-fastify.test.js | 8 ++++++-- packages/opentelemetry-node/test/instr-grpc.test.js | 10 ++++++++-- packages/opentelemetry-node/test/instr-hapi.test.js | 6 +++++- packages/opentelemetry-node/test/instr-mongodb.test.js | 10 ++++++++-- .../opentelemetry-node/test/instr-mongoose.test.js | 10 ++++++++-- packages/opentelemetry-node/test/instr-mysql.test.js | 10 ++++++++-- packages/opentelemetry-node/test/instr-mysql2.test.js | 10 ++++++++-- packages/opentelemetry-node/test/instr-pg.test.js | 10 ++++++++-- packages/opentelemetry-node/test/instr-tedious.test.js | 10 ++++++++-- packages/opentelemetry-node/test/instr-undici.test.js | 10 ++++++++-- packages/opentelemetry-node/test/testutils.js | 7 +++---- 14 files changed, 95 insertions(+), 28 deletions(-) diff --git a/packages/opentelemetry-node/test/instr-elastic-openai.test.js b/packages/opentelemetry-node/test/instr-elastic-openai.test.js index 95119d09..63b4f2ef 100644 --- a/packages/opentelemetry-node/test/instr-elastic-openai.test.js +++ b/packages/opentelemetry-node/test/instr-elastic-openai.test.js @@ -7,7 +7,11 @@ const http = require('http'); const {basename} = require('path'); const test = require('tape'); const semver = require('semver'); -const {runTestFixtures, filterOutGcpDetectorSpans, assertDeepMatch} = require('./testutils'); +const { + runTestFixtures, + filterOutGcpDetectorSpans, + assertDeepMatch, +} = require('./testutils'); let skip = process.env.TEST_GENAI_MODEL === undefined; if (skip) { @@ -36,7 +40,7 @@ const testFixtures = [ // span 7e8ca8 "embeddings all-minilm:22m" (26.4ms, SPAN_KIND_CLIENT, GenAI openai) // +9ms `- span 39fc32 "POST" (16.7ms, SPAN_KIND_CLIENT, POST http://127.0.0.1:11434/v1/embeddings -> 200) const spans = filterOutGcpDetectorSpans(col.sortedSpans); - console.log(spans) + console.log(spans); assertDeepMatch( t, spans, diff --git a/packages/opentelemetry-node/test/instr-elasticsearch.test.js b/packages/opentelemetry-node/test/instr-elasticsearch.test.js index 08220d73..7900933d 100644 --- a/packages/opentelemetry-node/test/instr-elasticsearch.test.js +++ b/packages/opentelemetry-node/test/instr-elasticsearch.test.js @@ -7,7 +7,11 @@ // and later. const test = require('tape'); -const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); +const { + filterOutDnsNetSpans, + filterOutGcpDetectorSpans, + runTestFixtures, +} = require('./testutils'); const skip = process.env.ES_URL === undefined; if (skip) { @@ -20,7 +24,9 @@ function checkTelemetry(t, col) { // Expected a trace like this: // span 91a6b1 "search" (13.4ms, SPAN_KIND_CLIENT, GET http://localhost:9200/) // +2ms `- span 14278c "GET" (10.8ms, SPAN_KIND_CLIENT, GET http://localhost:9200/_search?q=pants -> 200) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 2); t.equal(spans[0].name, 'search'); t.equal(spans[0].kind, 'SPAN_KIND_CLIENT', 'kind'); diff --git a/packages/opentelemetry-node/test/instr-express.test.js b/packages/opentelemetry-node/test/instr-express.test.js index b4da90b0..a5e523db 100644 --- a/packages/opentelemetry-node/test/instr-express.test.js +++ b/packages/opentelemetry-node/test/instr-express.test.js @@ -37,7 +37,9 @@ const testFixtures = [ // +0ms `- span 2092ee "middleware - query" (0.1ms, SPAN_KIND_INTERNAL) // +0ms `- span 033a59 "middleware - expressInit" (0.1ms, SPAN_KIND_INTERNAL) // +1ms `- span 5573dc "request handler - /hi/:name" (0.0ms, SPAN_KIND_INTERNAL) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 10); t.equal(spans[0].scope.name, '@opentelemetry/instrumentation-http'); diff --git a/packages/opentelemetry-node/test/instr-fastify.test.js b/packages/opentelemetry-node/test/instr-fastify.test.js index fcb2c198..a26e42d7 100644 --- a/packages/opentelemetry-node/test/instr-fastify.test.js +++ b/packages/opentelemetry-node/test/instr-fastify.test.js @@ -28,7 +28,9 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 4); t.ok( @@ -71,7 +73,9 @@ const testFixtures = [ // span 6e0fc9 "GET" (1.6ms, SPAN_KIND_CLIENT, GET http://localhost:3000/hi/Bob -> 200) // +1ms `- span 40c4a8 "GET /hi/:name" (0.3ms, SPAN_KIND_SERVER, GET http://localhost:3000/hi/Bob -> 200) // +0ms `- span 74a68a "request handler - fastify" (0.1ms, SPAN_KIND_INTERNAL) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 6); t.equal(spans[0].scope.name, '@opentelemetry/instrumentation-http'); diff --git a/packages/opentelemetry-node/test/instr-grpc.test.js b/packages/opentelemetry-node/test/instr-grpc.test.js index 830badda..0cdbc4a8 100644 --- a/packages/opentelemetry-node/test/instr-grpc.test.js +++ b/packages/opentelemetry-node/test/instr-grpc.test.js @@ -6,7 +6,11 @@ // Test that instrumentation-grpc generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures, filterOutGcpDetectorSpans} = require('./testutils'); +const { + filterOutDnsNetSpans, + runTestFixtures, + filterOutGcpDetectorSpans, +} = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ const testFixtures = [ @@ -19,7 +23,9 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 2); t.equal(spans[0].kind, 'SPAN_KIND_CLIENT'); t.equal(spans[1].kind, 'SPAN_KIND_SERVER'); diff --git a/packages/opentelemetry-node/test/instr-hapi.test.js b/packages/opentelemetry-node/test/instr-hapi.test.js index cbbbfef1..fc2c63c7 100644 --- a/packages/opentelemetry-node/test/instr-hapi.test.js +++ b/packages/opentelemetry-node/test/instr-hapi.test.js @@ -6,7 +6,11 @@ // Test that 'hapi' instrumentation generates the telemetry we expect. const test = require('tape'); -const {runTestFixtures, findObjInArray, filterOutGcpDetectorSpans} = require('./testutils'); +const { + runTestFixtures, + findObjInArray, + filterOutGcpDetectorSpans, +} = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ const testFixtures = [ diff --git a/packages/opentelemetry-node/test/instr-mongodb.test.js b/packages/opentelemetry-node/test/instr-mongodb.test.js index b80f9a38..ae5ca488 100644 --- a/packages/opentelemetry-node/test/instr-mongodb.test.js +++ b/packages/opentelemetry-node/test/instr-mongodb.test.js @@ -6,7 +6,11 @@ // Test that 'mongodb' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); +const { + filterOutDnsNetSpans, + filterOutGcpDetectorSpans, + runTestFixtures, +} = require('./testutils'); let skip = process.env.MONGODB_HOST === undefined; if (skip) { @@ -36,7 +40,9 @@ const testFixtures = [ // +13ms `- span 1e5ee2 "mongodb.insert" (1.4ms, SPAN_KIND_CLIENT) // +3ms `- span 3d4723 "mongodb.delete" (0.6ms, SPAN_KIND_CLIENT) // +1ms `- span 1c1373 "mongodb.endSessions" (0.3ms, SPAN_KIND_CLIENT) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 4); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-mongoose.test.js b/packages/opentelemetry-node/test/instr-mongoose.test.js index f991c7aa..38197d9f 100644 --- a/packages/opentelemetry-node/test/instr-mongoose.test.js +++ b/packages/opentelemetry-node/test/instr-mongoose.test.js @@ -6,7 +6,11 @@ // Test that 'mongoose' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); +const { + filterOutDnsNetSpans, + filterOutGcpDetectorSpans, + runTestFixtures, +} = require('./testutils'); let skip = process.env.MONGODB_HOST === undefined; if (skip) { @@ -40,7 +44,9 @@ const testFixtures = [ // +13ms `- span 5be842 "mongodb.drop" (0.8ms, SPAN_KIND_CLIENT) // +1ms `- span 13d56b "mongodb.endSessions" (0.3ms, SPAN_KIND_CLIENT) // -20ms `- span c4e688 "mongoose.User.save" (18.9ms, SPAN_KIND_CLIENT) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 7); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-mysql.test.js b/packages/opentelemetry-node/test/instr-mysql.test.js index 0e263a2c..8b49e804 100644 --- a/packages/opentelemetry-node/test/instr-mysql.test.js +++ b/packages/opentelemetry-node/test/instr-mysql.test.js @@ -6,7 +6,11 @@ // Test that 'mysql' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); +const { + filterOutDnsNetSpans, + filterOutGcpDetectorSpans, + runTestFixtures, +} = require('./testutils'); let skip = process.env.MYSQL_HOST === undefined; if (skip) { @@ -31,7 +35,9 @@ const testFixtures = [ // span 8ef53e "manual-parent-span" (21.7ms, SPAN_KIND_INTERNAL) // +1ms `- span 715182 "tcp.connect" (9.4ms, SPAN_KIND_INTERNAL) // +2ms `- span 430253 "SELECT" (18.2ms, SPAN_KIND_CLIENT) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 2); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-mysql2.test.js b/packages/opentelemetry-node/test/instr-mysql2.test.js index 7a6c0100..c4694be4 100644 --- a/packages/opentelemetry-node/test/instr-mysql2.test.js +++ b/packages/opentelemetry-node/test/instr-mysql2.test.js @@ -6,7 +6,11 @@ // Test that 'mysql2' instrumentation generates the telemetry we expect. const test = require('tape'); -const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); +const { + filterOutDnsNetSpans, + filterOutGcpDetectorSpans, + runTestFixtures, +} = require('./testutils'); let skip = process.env.MYSQL_HOST === undefined; if (skip) { @@ -31,7 +35,9 @@ const testFixtures = [ // span 8ef53e "manual-parent-span" (21.7ms, SPAN_KIND_INTERNAL) // +1ms `- span 715182 "tcp.connect" (9.4ms, SPAN_KIND_INTERNAL) // +2ms `- span 430253 "SELECT" (18.2ms, SPAN_KIND_CLIENT) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 2); t.equal(spans[0].name, 'manual-parent-span'); diff --git a/packages/opentelemetry-node/test/instr-pg.test.js b/packages/opentelemetry-node/test/instr-pg.test.js index b7918f62..be1b5f3d 100644 --- a/packages/opentelemetry-node/test/instr-pg.test.js +++ b/packages/opentelemetry-node/test/instr-pg.test.js @@ -4,7 +4,11 @@ */ const test = require('tape'); -const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); +const { + filterOutDnsNetSpans, + filterOutGcpDetectorSpans, + runTestFixtures, +} = require('./testutils'); const skip = process.env.PGHOST === undefined; if (skip) { @@ -29,7 +33,9 @@ const testFixtures = [ // span 102150 "manual-parent-span" (7.5ms, SPAN_KIND_INTERNAL) // +3ms `- span 539d9d "pg.connect" (12.0ms, SPAN_KIND_CLIENT) // +13ms `- span 115c08 "pg.query:SELECT postgres" (2.4ms, SPAN_KIND_CLIENT) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 3); spans.slice(1).forEach((s) => { t.equal(s.traceId, spans[0].traceId, 'traceId'); diff --git a/packages/opentelemetry-node/test/instr-tedious.test.js b/packages/opentelemetry-node/test/instr-tedious.test.js index 83e2a62b..ee7db60b 100644 --- a/packages/opentelemetry-node/test/instr-tedious.test.js +++ b/packages/opentelemetry-node/test/instr-tedious.test.js @@ -5,7 +5,11 @@ const test = require('tape'); const semver = require('semver'); -const {filterOutDnsNetSpans, filterOutGcpDetectorSpans, runTestFixtures} = require('./testutils'); +const { + filterOutDnsNetSpans, + filterOutGcpDetectorSpans, + runTestFixtures, +} = require('./testutils'); const tediousVer = require('tedious/package.json').version; let skip = process.env.MSSQL_HOST === undefined; @@ -45,7 +49,9 @@ const testFixtures = [ // ------ trace d1755e (2 spans) ------ // span 6bb8d8 "manual-parent-span" (54.3ms, SPAN_KIND_INTERNAL) // +51ms `- span fb837e "execSql master" (3.0ms, SPAN_KIND_CLIENT) - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 2); const s = spans.pop(); diff --git a/packages/opentelemetry-node/test/instr-undici.test.js b/packages/opentelemetry-node/test/instr-undici.test.js index 8c422bec..73817989 100644 --- a/packages/opentelemetry-node/test/instr-undici.test.js +++ b/packages/opentelemetry-node/test/instr-undici.test.js @@ -6,7 +6,11 @@ const {satisfies} = require('semver'); const test = require('tape'); -const {filterOutDnsNetSpans, runTestFixtures, filterOutGcpDetectorSpans} = require('./testutils'); +const { + filterOutDnsNetSpans, + runTestFixtures, + filterOutGcpDetectorSpans, +} = require('./testutils'); function getNodeVerRangeForCurrUndici() { const undiciVer = require('undici/package.json').version; @@ -34,7 +38,9 @@ const testFixtures = [ }, // verbose: true, checkTelemetry: (t, col) => { - const spans = filterOutGcpDetectorSpans(filterOutDnsNetSpans(col.sortedSpans)); + const spans = filterOutGcpDetectorSpans( + filterOutDnsNetSpans(col.sortedSpans) + ); t.equal(spans.length, 1); const span = spans[0]; t.equal(span.scope.name, '@opentelemetry/instrumentation-undici'); diff --git a/packages/opentelemetry-node/test/testutils.js b/packages/opentelemetry-node/test/testutils.js index d9331740..009c6f02 100644 --- a/packages/opentelemetry-node/test/testutils.js +++ b/packages/opentelemetry-node/test/testutils.js @@ -97,10 +97,9 @@ function filterOutGcpDetectorSpans(spans) { return spans.filter( (s) => s.scope.name !== '@opentelemetry/instrumentation-http' || - ![ - '169.254.169.254', - 'metadata.google.internal.', - ].includes(s.attributes['server.address']) + !['169.254.169.254', 'metadata.google.internal.'].includes( + s.attributes['server.address'] + ) ); } From cb2ad742e6667788bd8e6cc7eaa165ec633b3d63 Mon Sep 17 00:00:00 2001 From: David Luna Date: Wed, 26 Mar 2025 11:31:50 +0100 Subject: [PATCH 04/11] fix: handle multiple values in env var --- .../lib/instrumentations.js | 9 ++++-- .../test/instr-http.test.js | 28 ++++++++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/opentelemetry-node/lib/instrumentations.js b/packages/opentelemetry-node/lib/instrumentations.js index 322088b2..f06c7dfe 100644 --- a/packages/opentelemetry-node/lib/instrumentations.js +++ b/packages/opentelemetry-node/lib/instrumentations.js @@ -260,10 +260,13 @@ function getInstrumentations(opts = {}) { ); // `@opentelemetry/instrumentation-http` defaults to emit old semconv attributes. - // Set the default to stable semconv if not defined by the user - if (!('OTEL_SEMCONV_STABILITY_OPT_IN' in process.env)) { - process.env.OTEL_SEMCONV_STABILITY_OPT_IN = 'http'; + // Set the default to stable HTTP semconv if not defined by the user (http, http/dup) + const semconvOptIn = + getStringListFromEnv('OTEL_SEMCONV_STABILITY_OPT_IN') || []; + if (!semconvOptIn.some((v) => v.startsWith('http'))) { + semconvOptIn.push('http'); } + process.env.OTEL_SEMCONV_STABILITY_OPT_IN = semconvOptIn.join(','); Object.keys(instrumentationsMap).forEach((name) => { // Skip if env has an `enabled` list and does not include this one diff --git a/packages/opentelemetry-node/test/instr-http.test.js b/packages/opentelemetry-node/test/instr-http.test.js index 15ebc20d..be65567b 100644 --- a/packages/opentelemetry-node/test/instr-http.test.js +++ b/packages/opentelemetry-node/test/instr-http.test.js @@ -11,7 +11,7 @@ const {runTestFixtures, filterOutGcpDetectorSpans} = require('./testutils'); /** @type {import('./testutils').TestFixture[]} */ const testFixtures = [ { - name: 'http.get (stable semconv as default)', + name: 'http.get (stable HTTP semconv if env not set)', args: ['./fixtures/use-http-get.js'], cwd: __dirname, env: { @@ -30,7 +30,27 @@ const testFixtures = [ }, }, { - name: 'https.get (stable semconv as default)', + name: 'http.get (stable HTTP semconv if env set with other values)', + args: ['./fixtures/use-http-get.js'], + cwd: __dirname, + env: { + NODE_OPTIONS: '--require=@elastic/opentelemetry-node', + OTEL_SEMCONV_STABILITY_OPT_IN: 'db/dup,foo', + }, + // verbose: true, + checkTelemetry: (t, col) => { + const spans = filterOutGcpDetectorSpans(col.sortedSpans); + t.equal(spans.length, 1); + const span = spans[0]; + t.equal(span.scope.name, '@opentelemetry/instrumentation-http'); + t.equal(span.name, 'GET'); + t.equal(span.kind, 'SPAN_KIND_CLIENT'); + t.equal(span.attributes['http.url'], undefined); + t.equal(span.attributes['url.full'], 'http://www.google.com/'); + }, + }, + { + name: 'https.get (stable HTTP semconv if env not set)', args: ['./fixtures/use-https-get.js'], cwd: __dirname, env: { @@ -49,7 +69,7 @@ const testFixtures = [ }, }, { - name: 'http.get (dual mode semconv)', + name: 'http.get (dual HTTP semconv if user set in env)', args: ['./fixtures/use-http-get.js'], cwd: __dirname, env: { @@ -69,7 +89,7 @@ const testFixtures = [ }, }, { - name: 'https.get (dual mode semconv)', + name: 'https.get (dual HTTP semconv if user set in env)', args: ['./fixtures/use-https-get.js'], cwd: __dirname, env: { From 7063f53b874cd5ae3c16baf896f45681b2ffa6c9 Mon Sep 17 00:00:00 2001 From: David Luna Date: Wed, 26 Mar 2025 11:36:57 +0100 Subject: [PATCH 05/11] chore: remove log --- packages/opentelemetry-node/test/instr-elastic-openai.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/opentelemetry-node/test/instr-elastic-openai.test.js b/packages/opentelemetry-node/test/instr-elastic-openai.test.js index 63b4f2ef..b70ead1f 100644 --- a/packages/opentelemetry-node/test/instr-elastic-openai.test.js +++ b/packages/opentelemetry-node/test/instr-elastic-openai.test.js @@ -40,7 +40,6 @@ const testFixtures = [ // span 7e8ca8 "embeddings all-minilm:22m" (26.4ms, SPAN_KIND_CLIENT, GenAI openai) // +9ms `- span 39fc32 "POST" (16.7ms, SPAN_KIND_CLIENT, POST http://127.0.0.1:11434/v1/embeddings -> 200) const spans = filterOutGcpDetectorSpans(col.sortedSpans); - console.log(spans); assertDeepMatch( t, spans, From e969e9f7e6b5c388b374f71ea2a802b5848f07ca Mon Sep 17 00:00:00 2001 From: David Luna Date: Thu, 27 Mar 2025 10:06:06 +0100 Subject: [PATCH 06/11] chore: remove filter in sortedSpans prop in test collector --- packages/opentelemetry-node/test/testutils.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/opentelemetry-node/test/testutils.js b/packages/opentelemetry-node/test/testutils.js index 009c6f02..92774c13 100644 --- a/packages/opentelemetry-node/test/testutils.js +++ b/packages/opentelemetry-node/test/testutils.js @@ -393,7 +393,8 @@ class TestCollector { }); }); }); - spans.sort((a, b) => { + + return spans.sort((a, b) => { assert(typeof a.startTimeUnixNano === 'string'); assert(typeof b.startTimeUnixNano === 'string'); let aStartInt = BigInt(a.startTimeUnixNano); @@ -414,15 +415,6 @@ class TestCollector { return aStartInt < bStartInt ? -1 : aStartInt > bStartInt ? 1 : 0; }); - - // NOTE: Ignore spans from the GCP detector for testing. It shouldn't be - // creating spans, but that should be fixed upstream. - return spans.filter((s) => { - const attrs = s.attributes; - const url = attrs && attrs['http.url']; - // GCP detector does request to a specific path - return !url || !url.endsWith('/computeMetadata/v1/instance'); - }); } get metrics() { From 878926961c9c3ed98ec770c1ded62c967bd26d30 Mon Sep 17 00:00:00 2001 From: David Luna Date: Thu, 27 Mar 2025 12:44:40 +0100 Subject: [PATCH 07/11] chore: tune gcp detector span filter function --- packages/opentelemetry-node/test/testutils.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/opentelemetry-node/test/testutils.js b/packages/opentelemetry-node/test/testutils.js index 92774c13..9d82143c 100644 --- a/packages/opentelemetry-node/test/testutils.js +++ b/packages/opentelemetry-node/test/testutils.js @@ -95,11 +95,13 @@ function filterOutDnsNetSpans(spans) { function filterOutGcpDetectorSpans(spans) { // Filter out GCP resource detector spans for testing. return spans.filter( - (s) => - s.scope.name !== '@opentelemetry/instrumentation-http' || - !['169.254.169.254', 'metadata.google.internal.'].includes( - s.attributes['server.address'] - ) + (s) => { + if (s.scope.name !== '@opentelemetry/instrumentation-http') { + return true; + } + const urlAttr = s.attributes['http.url'] || s.attributes['url.full'] || ''; + return !urlAttr.endsWith('/computeMetadata/v1/instance'); + } ); } From 9b888a90a41ffa6048df09eac0d17bc615baf54f Mon Sep 17 00:00:00 2001 From: David Luna Date: Thu, 27 Mar 2025 12:47:06 +0100 Subject: [PATCH 08/11] Update packages/opentelemetry-node/lib/instrumentations.js Co-authored-by: Trent Mick --- packages/opentelemetry-node/lib/instrumentations.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opentelemetry-node/lib/instrumentations.js b/packages/opentelemetry-node/lib/instrumentations.js index f06c7dfe..e4f5b88f 100644 --- a/packages/opentelemetry-node/lib/instrumentations.js +++ b/packages/opentelemetry-node/lib/instrumentations.js @@ -263,10 +263,10 @@ function getInstrumentations(opts = {}) { // Set the default to stable HTTP semconv if not defined by the user (http, http/dup) const semconvOptIn = getStringListFromEnv('OTEL_SEMCONV_STABILITY_OPT_IN') || []; - if (!semconvOptIn.some((v) => v.startsWith('http'))) { + if (!semconvOptIn.includes('http') && !semconvOptIn.includes('http/dup')) { semconvOptIn.push('http'); + process.env.OTEL_SEMCONV_STABILITY_OPT_IN = semconvOptIn.join(','); } - process.env.OTEL_SEMCONV_STABILITY_OPT_IN = semconvOptIn.join(','); Object.keys(instrumentationsMap).forEach((name) => { // Skip if env has an `enabled` list and does not include this one From 3a0600fc6b9c4ebf5889c6438f2f937390c0ed8e Mon Sep 17 00:00:00 2001 From: David Luna Date: Thu, 27 Mar 2025 12:49:51 +0100 Subject: [PATCH 09/11] chore: add TODO notes --- packages/opentelemetry-node/lib/instrumentations.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/opentelemetry-node/lib/instrumentations.js b/packages/opentelemetry-node/lib/instrumentations.js index e4f5b88f..68a01248 100644 --- a/packages/opentelemetry-node/lib/instrumentations.js +++ b/packages/opentelemetry-node/lib/instrumentations.js @@ -261,6 +261,8 @@ function getInstrumentations(opts = {}) { // `@opentelemetry/instrumentation-http` defaults to emit old semconv attributes. // Set the default to stable HTTP semconv if not defined by the user (http, http/dup) + // TODO: remove this once https://github.com/open-telemetry/opentelemetry-js/pull/5552 + // is merged and published. const semconvOptIn = getStringListFromEnv('OTEL_SEMCONV_STABILITY_OPT_IN') || []; if (!semconvOptIn.includes('http') && !semconvOptIn.includes('http/dup')) { From 50415fb0e8ba3868cae05c0466c603fd46eeb6a7 Mon Sep 17 00:00:00 2001 From: Trent Mick Date: Thu, 27 Mar 2025 10:18:25 -0700 Subject: [PATCH 10/11] lint:fix --- packages/opentelemetry-node/test/testutils.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/opentelemetry-node/test/testutils.js b/packages/opentelemetry-node/test/testutils.js index 9d82143c..7deb2f55 100644 --- a/packages/opentelemetry-node/test/testutils.js +++ b/packages/opentelemetry-node/test/testutils.js @@ -94,15 +94,14 @@ function filterOutDnsNetSpans(spans) { */ function filterOutGcpDetectorSpans(spans) { // Filter out GCP resource detector spans for testing. - return spans.filter( - (s) => { - if (s.scope.name !== '@opentelemetry/instrumentation-http') { - return true; - } - const urlAttr = s.attributes['http.url'] || s.attributes['url.full'] || ''; - return !urlAttr.endsWith('/computeMetadata/v1/instance'); + return spans.filter((s) => { + if (s.scope.name !== '@opentelemetry/instrumentation-http') { + return true; } - ); + const urlAttr = + s.attributes['http.url'] || s.attributes['url.full'] || ''; + return !urlAttr.endsWith('/computeMetadata/v1/instance'); + }); } /** From 133726bb3dd63fc6e02e91f2fa8d4c2505f90798 Mon Sep 17 00:00:00 2001 From: David Luna Date: Fri, 28 Mar 2025 09:29:05 +0100 Subject: [PATCH 11/11] chore: add changelog entry --- packages/opentelemetry-node/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/opentelemetry-node/CHANGELOG.md b/packages/opentelemetry-node/CHANGELOG.md index 93b5e222..2de3a510 100644 --- a/packages/opentelemetry-node/CHANGELOG.md +++ b/packages/opentelemetry-node/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +- feat: Default to stable semantic conventions for HTTP instrumentation. + (https://github.com/elastic/elastic-otel-node/pull/669) + - Upgrade upstream OTel dependencies to SDK 2.0. This should be non-breaking for users of `node --import @elastic/opentelemetry-node my-app.js` to start EDOT Node.js for their application.