55import static datadog .trace .api .datastreams .DataStreamsTags .Direction .OUTBOUND ;
66import static datadog .trace .api .datastreams .DataStreamsTags .create ;
77import static datadog .trace .bootstrap .instrumentation .api .AgentPropagation .DSM_CONCERN ;
8+ import static datadog .trace .bootstrap .instrumentation .api .AgentPropagation .extractContextAndGetSpanContext ;
89import static datadog .trace .bootstrap .instrumentation .api .AgentTracer .activateSpan ;
910import static datadog .trace .bootstrap .instrumentation .api .AgentTracer .activeSpan ;
1011import static datadog .trace .bootstrap .instrumentation .api .AgentTracer .startSpan ;
2122import datadog .trace .bootstrap .InstrumentationContext ;
2223import datadog .trace .bootstrap .instrumentation .api .AgentScope ;
2324import datadog .trace .bootstrap .instrumentation .api .AgentSpan ;
25+ import datadog .trace .bootstrap .instrumentation .api .AgentSpanContext ;
2426import datadog .trace .bootstrap .instrumentation .api .InstrumentationTags ;
2527import datadog .trace .instrumentation .kafka_common .ClusterIdHolder ;
2628import net .bytebuddy .asm .Advice ;
@@ -46,12 +48,26 @@ public static AgentScope onEnter(
4648 ClusterIdHolder .set (clusterId );
4749 }
4850
49- final AgentSpan parent = activeSpan ();
50- final AgentSpan span = startSpan (KAFKA_PRODUCE );
51+ // Try to extract existing trace context from record headers
52+ final AgentSpanContext extractedContext =
53+ extractContextAndGetSpanContext (record .headers (), TextMapExtractAdapter .GETTER );
54+
55+ final AgentSpan localActiveSpan = activeSpan ();
56+
57+ final AgentSpan span ;
58+ final AgentSpan callbackParentSpan ;
59+
60+ if (extractedContext != null ) {
61+ span = startSpan (KAFKA_PRODUCE , extractedContext );
62+ callbackParentSpan = span ;
63+ } else {
64+ span = startSpan (KAFKA_PRODUCE );
65+ callbackParentSpan = localActiveSpan ;
66+ }
5167 PRODUCER_DECORATE .afterStart (span );
5268 PRODUCER_DECORATE .onProduce (span , record , producerConfig );
5369
54- callback = new KafkaProducerCallback (callback , parent , span , clusterId );
70+ callback = new KafkaProducerCallback (callback , callbackParentSpan , span , clusterId );
5571
5672 if (record .value () == null ) {
5773 span .setTag (InstrumentationTags .TOMBSTONE , true );
0 commit comments