From fbf1fd06d4fcf580a3f8db12735b37ccdd1d89c0 Mon Sep 17 00:00:00 2001 From: rochdev Date: Wed, 12 Feb 2025 18:47:57 -0500 Subject: [PATCH 1/4] move otel to datadog context conversion on otel side --- packages/dd-trace/src/opentelemetry/tracer.js | 46 ++++++++++++++++++- .../src/opentracing/propagation/text_map.js | 43 ----------------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/packages/dd-trace/src/opentelemetry/tracer.js b/packages/dd-trace/src/opentelemetry/tracer.js index bf2a0c3f86b..d6866e4654d 100644 --- a/packages/dd-trace/src/opentelemetry/tracer.js +++ b/packages/dd-trace/src/opentelemetry/tracer.js @@ -6,8 +6,10 @@ const { sanitizeAttributes } = require('@opentelemetry/core') const Sampler = require('./sampler') const Span = require('./span') const id = require('../id') +const log = require('../../log') const SpanContext = require('./span_context') const TextMapPropagator = require('../opentracing/propagation/text_map') +const TraceState = require('./tracestate') class Tracer { constructor (library, config, tracerProvider) { @@ -39,7 +41,49 @@ class Tracer { // Extracted method to create span context for a new span _createSpanContextForNewSpan (context) { const { traceId, spanId, traceFlags, traceState } = context - return TextMapPropagator._convertOtelContextToDatadog(traceId, spanId, traceFlags, traceState) + return this._convertOtelContextToDatadog(traceId, spanId, traceFlags, traceState) + } + + _convertOtelContextToDatadog (traceId, spanId, traceFlag, ts, meta = {}) { + const origin = null + let samplingPriority = traceFlag + + ts = ts?.traceparent || null + + if (ts) { + // Use TraceState.fromString to parse the tracestate header + const traceState = TraceState.fromString(ts) + let ddTraceStateData = null + + // Extract Datadog specific trace state data + traceState.forVendor('dd', (state) => { + ddTraceStateData = state + return state // You might need to adjust this part based on actual logic needed + }) + + if (ddTraceStateData) { + // Assuming ddTraceStateData is now a Map or similar structure containing Datadog trace state data + // Extract values as needed, similar to the original logic + const samplingPriorityTs = ddTraceStateData.get('s') + const origin = ddTraceStateData.get('o') + // Convert Map to object for meta + const otherPropagatedTags = Object.fromEntries(ddTraceStateData.entries()) + + // Update meta and samplingPriority based on extracted values + Object.assign(meta, otherPropagatedTags) + samplingPriority = TextMapPropagator._getSamplingPriority(traceFlag, parseInt(samplingPriorityTs, 10), origin) + } else { + log.debug(`no dd list member in tracestate from incoming request: ${ts}`) + } + } + + const spanContext = new OtelSpanContext({ + traceId: id(traceId, 16), spanId: id(), tags: meta, parentId: id(spanId, 16) + }) + + spanContext._sampling = { priority: samplingPriority } + spanContext._trace = { origin } + return spanContext } startSpan (name, options = {}, context = api.context.active()) { diff --git a/packages/dd-trace/src/opentracing/propagation/text_map.js b/packages/dd-trace/src/opentracing/propagation/text_map.js index fd7d32760cb..cefe9e9ffae 100644 --- a/packages/dd-trace/src/opentracing/propagation/text_map.js +++ b/packages/dd-trace/src/opentracing/propagation/text_map.js @@ -3,7 +3,6 @@ const pick = require('../../../../datadog-core/src/utils/src/pick') const id = require('../../id') const DatadogSpanContext = require('../span_context') -const OtelSpanContext = require('../../opentelemetry/span_context') const log = require('../../log') const TraceState = require('./tracestate') const tags = require('../../../../../ext/tags') @@ -693,48 +692,6 @@ class TextMapPropagator { return spanContext._traceId.toString(16) } - static _convertOtelContextToDatadog (traceId, spanId, traceFlag, ts, meta = {}) { - const origin = null - let samplingPriority = traceFlag - - ts = ts?.traceparent || null - - if (ts) { - // Use TraceState.fromString to parse the tracestate header - const traceState = TraceState.fromString(ts) - let ddTraceStateData = null - - // Extract Datadog specific trace state data - traceState.forVendor('dd', (state) => { - ddTraceStateData = state - return state // You might need to adjust this part based on actual logic needed - }) - - if (ddTraceStateData) { - // Assuming ddTraceStateData is now a Map or similar structure containing Datadog trace state data - // Extract values as needed, similar to the original logic - const samplingPriorityTs = ddTraceStateData.get('s') - const origin = ddTraceStateData.get('o') - // Convert Map to object for meta - const otherPropagatedTags = Object.fromEntries(ddTraceStateData.entries()) - - // Update meta and samplingPriority based on extracted values - Object.assign(meta, otherPropagatedTags) - samplingPriority = TextMapPropagator._getSamplingPriority(traceFlag, parseInt(samplingPriorityTs, 10), origin) - } else { - log.debug(`no dd list member in tracestate from incoming request: ${ts}`) - } - } - - const spanContext = new OtelSpanContext({ - traceId: id(traceId, 16), spanId: id(), tags: meta, parentId: id(spanId, 16) - }) - - spanContext._sampling = { priority: samplingPriority } - spanContext._trace = { origin } - return spanContext - } - static _getSamplingPriority (traceparentSampled, tracestateSamplingPriority, origin = null) { const fromRumWithoutPriority = !tracestateSamplingPriority && origin === 'rum' From 1f13d116e810bb15e7d4caa2c9072aada3dff4dc Mon Sep 17 00:00:00 2001 From: rochdev Date: Wed, 12 Feb 2025 18:57:45 -0500 Subject: [PATCH 2/4] fix incorrect reference --- packages/dd-trace/src/opentelemetry/tracer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dd-trace/src/opentelemetry/tracer.js b/packages/dd-trace/src/opentelemetry/tracer.js index d6866e4654d..d0c64ff0e06 100644 --- a/packages/dd-trace/src/opentelemetry/tracer.js +++ b/packages/dd-trace/src/opentelemetry/tracer.js @@ -77,7 +77,7 @@ class Tracer { } } - const spanContext = new OtelSpanContext({ + const spanContext = new SpanContext({ traceId: id(traceId, 16), spanId: id(), tags: meta, parentId: id(spanId, 16) }) From 5e5e89d48da7488676af833efc7658d85e0855bf Mon Sep 17 00:00:00 2001 From: rochdev Date: Wed, 12 Feb 2025 19:06:11 -0500 Subject: [PATCH 3/4] fix incorrect import --- packages/dd-trace/src/opentelemetry/tracer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dd-trace/src/opentelemetry/tracer.js b/packages/dd-trace/src/opentelemetry/tracer.js index d0c64ff0e06..4721e5fe055 100644 --- a/packages/dd-trace/src/opentelemetry/tracer.js +++ b/packages/dd-trace/src/opentelemetry/tracer.js @@ -6,7 +6,7 @@ const { sanitizeAttributes } = require('@opentelemetry/core') const Sampler = require('./sampler') const Span = require('./span') const id = require('../id') -const log = require('../../log') +const log = require('../log') const SpanContext = require('./span_context') const TextMapPropagator = require('../opentracing/propagation/text_map') const TraceState = require('./tracestate') From 9430ceb32ccd02e6a9c077a1f7462de4bd2e21bf Mon Sep 17 00:00:00 2001 From: rochdev Date: Wed, 12 Feb 2025 19:13:07 -0500 Subject: [PATCH 4/4] fix incorrect import --- packages/dd-trace/src/opentelemetry/tracer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dd-trace/src/opentelemetry/tracer.js b/packages/dd-trace/src/opentelemetry/tracer.js index 4721e5fe055..740847f9fc0 100644 --- a/packages/dd-trace/src/opentelemetry/tracer.js +++ b/packages/dd-trace/src/opentelemetry/tracer.js @@ -9,7 +9,7 @@ const id = require('../id') const log = require('../log') const SpanContext = require('./span_context') const TextMapPropagator = require('../opentracing/propagation/text_map') -const TraceState = require('./tracestate') +const TraceState = require('../opentracing/propagation/tracestate') class Tracer { constructor (library, config, tracerProvider) {