11# (c) Copyright IBM Corp. 2025
2- from typing import TYPE_CHECKING , Any , Dict , Optional
2+ from typing import Any , Dict , Optional
33
44from opentelemetry .trace .span import format_span_id
55
66from instana .log import logger
77from instana .propagators .base_propagator import BasePropagator , CarrierT
88from instana .util .ids import hex_id_limited
9-
10- if TYPE_CHECKING :
11- from instana .span_context import SpanContext
12-
9+ from instana .span_context import SpanContext
1310
1411class KafkaPropagator (BasePropagator ):
1512 """
@@ -53,7 +50,7 @@ def extract_carrier_headers(self, carrier: CarrierT) -> Dict[str, Any]:
5350
5451 def extract (
5552 self , carrier : CarrierT , disable_w3c_trace_context : bool = False
56- ) -> Optional [" SpanContext" ]:
53+ ) -> Optional [SpanContext ]:
5754 """
5855 This method overrides one of the Base classes as with the introduction
5956 of W3C trace context for the Kafka requests more extracting steps and
@@ -64,7 +61,7 @@ def extract(
6461 disable_w3c_trace_context (bool): A flag to disable the W3C trace context.
6562
6663 Returns:
67- Optional[" SpanContext" ]: The extracted span context or None.
64+ Optional[SpanContext]: The extracted span context or None.
6865 """
6966 try :
7067 headers = self .extract_carrier_headers (carrier = carrier )
@@ -79,7 +76,7 @@ def extract(
7976 # Assisted by watsonx Code Assistant
8077 def inject (
8178 self ,
82- span_context : " SpanContext" ,
79+ span_context : SpanContext ,
8380 carrier : CarrierT ,
8481 disable_w3c_trace_context : bool = True ,
8582 ) -> None :
@@ -103,7 +100,26 @@ def inject(
103100 # Suppression `level` made in the child context or in the parent context
104101 # has priority over any non-suppressed `level` setting
105102 suppression_level = int (self .extract_instana_headers (dictionary_carrier )[2 ])
106- span_context .level = min (suppression_level , span_context .level )
103+ new_level = min (suppression_level , span_context .level )
104+
105+ if new_level != span_context .level :
106+ # Create a new span context with the updated level
107+ span_context = SpanContext (
108+ trace_id = span_context .trace_id ,
109+ span_id = span_context .span_id ,
110+ is_remote = span_context .is_remote ,
111+ trace_flags = span_context .trace_flags ,
112+ trace_state = span_context .trace_state ,
113+ level = new_level ,
114+ synthetic = span_context .synthetic ,
115+ trace_parent = span_context .trace_parent ,
116+ instana_ancestor = span_context .instana_ancestor ,
117+ long_trace_id = span_context .long_trace_id ,
118+ correlation_type = span_context .correlation_type ,
119+ correlation_id = span_context .correlation_id ,
120+ traceparent = span_context .traceparent ,
121+ tracestate = span_context .tracestate
122+ )
107123
108124 def inject_key_value (carrier , key , value ):
109125 if isinstance (carrier , list ):
@@ -119,9 +135,9 @@ def inject_key_value(carrier, key, value):
119135 inject_key_value (
120136 carrier ,
121137 self .KAFKA_HEADER_KEY_L_S ,
122- str (suppression_level ).encode ("utf-8" ),
138+ str (span_context . level ).encode ("utf-8" ),
123139 )
124- if suppression_level == 1 :
140+ if span_context . level == 1 :
125141 inject_key_value (
126142 carrier ,
127143 self .KAFKA_HEADER_KEY_T ,
0 commit comments