Skip to content

Commit

Permalink
move otel to datadog context conversion on otel side (#5260)
Browse files Browse the repository at this point in the history
  • Loading branch information
rochdev authored Feb 24, 2025
1 parent 519fbce commit c4f2921
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 44 deletions.
46 changes: 45 additions & 1 deletion packages/dd-trace/src/opentelemetry/tracer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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('../opentracing/propagation/tracestate')

class Tracer {
constructor (library, config, tracerProvider) {
Expand Down Expand Up @@ -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 SpanContext({
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()) {
Expand Down
43 changes: 0 additions & 43 deletions packages/dd-trace/src/opentracing/propagation/text_map.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -708,48 +707,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'

Expand Down

0 comments on commit c4f2921

Please sign in to comment.