Skip to content

Commit 1585505

Browse files
authored
Update TracingDecorator.java
FDPT-69007 fix tracingDecorator for span context, Baggages and header context
1 parent e6896ca commit 1585505

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

impl/src/main/java/io/quarkiverse/kafkastreamsprocessor/impl/decorator/processor/TracingDecorator.java

+21-7
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import java.util.Objects;
3030
import java.util.stream.Collectors;
3131

32+
import io.opentelemetry.api.baggage.Baggage;
33+
import io.quarkiverse.kafkastreamsprocessor.propagation.KafkaTextMapSetter;
3234
import jakarta.annotation.Priority;
3335
import jakarta.decorator.Decorator;
3436
import jakarta.enterprise.context.Dependent;
@@ -58,6 +60,7 @@
5860
import io.quarkiverse.kafkastreamsprocessor.impl.configuration.TopologyConfigurationImpl;
5961
import io.quarkiverse.kafkastreamsprocessor.impl.protocol.KafkaStreamsProcessorHeaders;
6062
import io.quarkiverse.kafkastreamsprocessor.propagation.KafkaTextMapGetter;
63+
import io.quarkiverse.kafkastreamsprocessor.propagation.KafkaTextMapSetter;
6164
import lombok.extern.slf4j.Slf4j;
6265

6366
/**
@@ -77,7 +80,10 @@ public class TracingDecorator extends AbstractProcessorDecorator {
7780
* The {@link OpenTelemetry} configured by Quarkus
7881
*/
7982
private final OpenTelemetry openTelemetry;
80-
83+
/**
84+
* Injects Context into the Kafka headers of a message
85+
*/
86+
private final KafkaTextMapSetter textMapSetter;
8187
/**
8288
* Extracts Context from the Kafka headers of a message
8389
*/
@@ -116,16 +122,20 @@ public class TracingDecorator extends AbstractProcessorDecorator {
116122
* The TopologyConfiguration after customization.
117123
*/
118124
@Inject
119-
public TracingDecorator(OpenTelemetry openTelemetry, KafkaTextMapGetter textMapGetter, Tracer tracer,
125+
public TracingDecorator(OpenTelemetry openTelemetry, KafkaTextMapGetter textMapGetter,
126+
KafkaTextMapSetter textMapSetter,
127+
Tracer tracer,
120128
TopologyConfigurationImpl configuration) {
121-
this(openTelemetry, textMapGetter, tracer, configuration.getProcessorPayloadType().getName(),
129+
this(openTelemetry, textMapGetter, textMapSetter, tracer, configuration.getProcessorPayloadType().getName(),
122130
JsonFormat.printer());
123131
}
124132

125133
public TracingDecorator(OpenTelemetry openTelemetry, KafkaTextMapGetter textMapGetter,
126-
Tracer tracer, String applicationName, JsonFormat.Printer jsonPrinter) {
134+
KafkaTextMapSetter textMapSetter, Tracer tracer, String applicationName,
135+
JsonFormat.Printer jsonPrinter) {
127136
this.openTelemetry = openTelemetry;
128137
this.textMapGetter = textMapGetter;
138+
this.textMapSetter = textMapSetter;
129139
this.tracer = tracer;
130140
this.applicationName = applicationName;
131141
this.jsonPrinter = jsonPrinter;
@@ -157,7 +167,7 @@ public void process(Record record) {
157167
SpanBuilder spanBuilder = tracer.spanBuilder(applicationName);
158168
final TextMapPropagator propagator = openTelemetry.getPropagators().getTextMapPropagator();
159169
Scope parentScope = null;
160-
170+
Context extractedContext = null;
161171
try {
162172
// going through all propagation field names defined in the OTel configuration
163173
// we look if any of them has been set with a non-null value in the headers of the incoming message
@@ -167,7 +177,7 @@ public void process(Record record) {
167177
.anyMatch(Objects::nonNull)) {
168178
// if that is the case, let's extract a Context initialized with the parent trace id, span id
169179
// and baggage present as headers in the incoming message
170-
Context extractedContext = propagator.extract(Context.current(), record.headers(), textMapGetter);
180+
extractedContext = propagator.extract(Context.current(), record.headers(), textMapGetter);
171181
// use the context as parent span for the built span
172182
spanBuilder.setParent(extractedContext);
173183
// we clean the headers to avoid their propagation in any outgoing message (knowing that by
@@ -179,8 +189,12 @@ public void process(Record record) {
179189
Span span = spanBuilder.startSpan();
180190
// baggage need to be explicitly set as current otherwise it is not propagated (baggage is independent of span
181191
// in opentelemetry) and actually lost as kafka headers are cleaned
182-
try (Scope ignored = span.makeCurrent()) {
192+
try (Scope ignored = (extractedContext != null)
193+
? Baggage.fromContext(extractedContext).makeCurrent()
194+
: Scope.noop();
195+
Scope scope = span.makeCurrent()) {
183196
try {
197+
propagator.inject(Context.current(), record.headers(), this.textMapSetter);
184198
getDelegate().process(record);
185199
span.setStatus(StatusCode.OK);
186200
} catch (KafkaException e) {

0 commit comments

Comments
 (0)