Skip to content

Commit c4f2921

Browse files
authored
move otel to datadog context conversion on otel side (#5260)
1 parent 519fbce commit c4f2921

2 files changed

Lines changed: 45 additions & 44 deletions

File tree

packages/dd-trace/src/opentelemetry/tracer.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ const { sanitizeAttributes } = require('@opentelemetry/core')
66
const Sampler = require('./sampler')
77
const Span = require('./span')
88
const id = require('../id')
9+
const log = require('../log')
910
const SpanContext = require('./span_context')
1011
const TextMapPropagator = require('../opentracing/propagation/text_map')
12+
const TraceState = require('../opentracing/propagation/tracestate')
1113

1214
class Tracer {
1315
constructor (library, config, tracerProvider) {
@@ -39,7 +41,49 @@ class Tracer {
3941
// Extracted method to create span context for a new span
4042
_createSpanContextForNewSpan (context) {
4143
const { traceId, spanId, traceFlags, traceState } = context
42-
return TextMapPropagator._convertOtelContextToDatadog(traceId, spanId, traceFlags, traceState)
44+
return this._convertOtelContextToDatadog(traceId, spanId, traceFlags, traceState)
45+
}
46+
47+
_convertOtelContextToDatadog (traceId, spanId, traceFlag, ts, meta = {}) {
48+
const origin = null
49+
let samplingPriority = traceFlag
50+
51+
ts = ts?.traceparent || null
52+
53+
if (ts) {
54+
// Use TraceState.fromString to parse the tracestate header
55+
const traceState = TraceState.fromString(ts)
56+
let ddTraceStateData = null
57+
58+
// Extract Datadog specific trace state data
59+
traceState.forVendor('dd', (state) => {
60+
ddTraceStateData = state
61+
return state // You might need to adjust this part based on actual logic needed
62+
})
63+
64+
if (ddTraceStateData) {
65+
// Assuming ddTraceStateData is now a Map or similar structure containing Datadog trace state data
66+
// Extract values as needed, similar to the original logic
67+
const samplingPriorityTs = ddTraceStateData.get('s')
68+
const origin = ddTraceStateData.get('o')
69+
// Convert Map to object for meta
70+
const otherPropagatedTags = Object.fromEntries(ddTraceStateData.entries())
71+
72+
// Update meta and samplingPriority based on extracted values
73+
Object.assign(meta, otherPropagatedTags)
74+
samplingPriority = TextMapPropagator._getSamplingPriority(traceFlag, parseInt(samplingPriorityTs, 10), origin)
75+
} else {
76+
log.debug(`no dd list member in tracestate from incoming request: ${ts}`)
77+
}
78+
}
79+
80+
const spanContext = new SpanContext({
81+
traceId: id(traceId, 16), spanId: id(), tags: meta, parentId: id(spanId, 16)
82+
})
83+
84+
spanContext._sampling = { priority: samplingPriority }
85+
spanContext._trace = { origin }
86+
return spanContext
4387
}
4488

4589
startSpan (name, options = {}, context = api.context.active()) {

packages/dd-trace/src/opentracing/propagation/text_map.js

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
const pick = require('../../../../datadog-core/src/utils/src/pick')
44
const id = require('../../id')
55
const DatadogSpanContext = require('../span_context')
6-
const OtelSpanContext = require('../../opentelemetry/span_context')
76
const log = require('../../log')
87
const TraceState = require('./tracestate')
98
const tags = require('../../../../../ext/tags')
@@ -708,48 +707,6 @@ class TextMapPropagator {
708707
return spanContext._traceId.toString(16)
709708
}
710709

711-
static _convertOtelContextToDatadog (traceId, spanId, traceFlag, ts, meta = {}) {
712-
const origin = null
713-
let samplingPriority = traceFlag
714-
715-
ts = ts?.traceparent || null
716-
717-
if (ts) {
718-
// Use TraceState.fromString to parse the tracestate header
719-
const traceState = TraceState.fromString(ts)
720-
let ddTraceStateData = null
721-
722-
// Extract Datadog specific trace state data
723-
traceState.forVendor('dd', (state) => {
724-
ddTraceStateData = state
725-
return state // You might need to adjust this part based on actual logic needed
726-
})
727-
728-
if (ddTraceStateData) {
729-
// Assuming ddTraceStateData is now a Map or similar structure containing Datadog trace state data
730-
// Extract values as needed, similar to the original logic
731-
const samplingPriorityTs = ddTraceStateData.get('s')
732-
const origin = ddTraceStateData.get('o')
733-
// Convert Map to object for meta
734-
const otherPropagatedTags = Object.fromEntries(ddTraceStateData.entries())
735-
736-
// Update meta and samplingPriority based on extracted values
737-
Object.assign(meta, otherPropagatedTags)
738-
samplingPriority = TextMapPropagator._getSamplingPriority(traceFlag, parseInt(samplingPriorityTs, 10), origin)
739-
} else {
740-
log.debug(`no dd list member in tracestate from incoming request: ${ts}`)
741-
}
742-
}
743-
744-
const spanContext = new OtelSpanContext({
745-
traceId: id(traceId, 16), spanId: id(), tags: meta, parentId: id(spanId, 16)
746-
})
747-
748-
spanContext._sampling = { priority: samplingPriority }
749-
spanContext._trace = { origin }
750-
return spanContext
751-
}
752-
753710
static _getSamplingPriority (traceparentSampled, tracestateSamplingPriority, origin = null) {
754711
const fromRumWithoutPriority = !tracestateSamplingPriority && origin === 'rum'
755712

0 commit comments

Comments
 (0)