@@ -6,8 +6,10 @@ const { sanitizeAttributes } = require('@opentelemetry/core')
66const Sampler = require ( './sampler' )
77const Span = require ( './span' )
88const id = require ( '../id' )
9+ const log = require ( '../log' )
910const SpanContext = require ( './span_context' )
1011const TextMapPropagator = require ( '../opentracing/propagation/text_map' )
12+ const TraceState = require ( '../opentracing/propagation/tracestate' )
1113
1214class 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 ( ) ) {
0 commit comments