Skip to content

Commit 8f61af3

Browse files
committed
baggage propagation
1 parent 9ade38a commit 8f61af3

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

opentelemetry/src/main/java/io/grpc/opentelemetry/OpenTelemetryTracingModule.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import io.grpc.ServerStreamTracer;
3939
import io.grpc.opentelemetry.internal.OpenTelemetryConstants;
4040
import io.opentelemetry.api.OpenTelemetry;
41+
import io.opentelemetry.api.baggage.Baggage;
4142
import io.opentelemetry.api.common.AttributesBuilder;
4243
import io.opentelemetry.api.trace.Span;
4344
import io.opentelemetry.api.trace.StatusCode;
@@ -58,6 +59,11 @@ final class OpenTelemetryTracingModule {
5859

5960
@VisibleForTesting
6061
final io.grpc.Context.Key<Span> otelSpan = io.grpc.Context.key("opentelemetry-span-key");
62+
63+
@VisibleForTesting
64+
final io.grpc.Context.Key<Baggage> baggageKey =
65+
io.grpc.Context.key("opentelemetry-baggage-key");
66+
6167
@Nullable
6268
private static final AtomicIntegerFieldUpdater<CallAttemptsTracerFactory> callEndedUpdater;
6369
@Nullable
@@ -330,6 +336,8 @@ public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, Re
330336
return next.startCall(call, headers);
331337
}
332338
Context serverCallContext = Context.current().with(span);
339+
Baggage baggage = baggageKey.get(io.grpc.Context.current());
340+
serverCallContext = serverCallContext.with(baggage);
333341
try (Scope scope = serverCallContext.makeCurrent()) {
334342
return new ContextServerCallListener<>(next.startCall(call, headers), serverCallContext);
335343
}

opentelemetry/src/test/java/io/grpc/opentelemetry/OpenTelemetryTracingModuleTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import io.grpc.testing.GrpcCleanupRule;
6060
import io.grpc.testing.GrpcServerRule;
6161
import io.opentelemetry.api.OpenTelemetry;
62+
import io.opentelemetry.api.baggage.Baggage;
6263
import io.opentelemetry.api.trace.Span;
6364
import io.opentelemetry.api.trace.SpanBuilder;
6465
import io.opentelemetry.api.trace.SpanId;
@@ -750,6 +751,48 @@ public void onComplete() {
750751
}
751752
}
752753

754+
@Test
755+
public void serverSpanPropagationInterceptor_propagatesBaggage() {
756+
// 1. Arrange: Setup the module, interceptor, and mocks.
757+
OpenTelemetryTracingModule tracingModule = new OpenTelemetryTracingModule(
758+
openTelemetryRule.getOpenTelemetry());
759+
ServerInterceptor interceptor = tracingModule.getServerSpanPropagationInterceptor();
760+
761+
@SuppressWarnings("unchecked")
762+
ServerCallHandler<String, String> handler = mock(ServerCallHandler.class);
763+
ServerCall<String, String> call = new NoopServerCall<>();
764+
Metadata metadata = new Metadata();
765+
final AtomicReference<Baggage> capturedBaggage = new AtomicReference<>();
766+
767+
// Mock the handler to capture the Baggage from the current context when it's called.
768+
when(handler.startCall(any(), any())).thenAnswer(invocation -> {
769+
capturedBaggage.set(io.opentelemetry.api.baggage.Baggage.current());
770+
return mockServerCallListener;
771+
});
772+
773+
// Create a test Span and Baggage to be propagated.
774+
Span parentSpan = tracerRule.spanBuilder("parent-span").startSpan();
775+
io.opentelemetry.api.baggage.Baggage testBaggage =
776+
io.opentelemetry.api.baggage.Baggage.builder().put("testKey", "testValue").build();
777+
778+
// Attach the Span and Baggage to the gRPC context.
779+
io.grpc.Context grpcContext = io.grpc.Context.current()
780+
.withValue(tracingModule.otelSpan, parentSpan)
781+
.withValue(tracingModule.baggageKey, testBaggage);
782+
783+
io.grpc.Context previous = grpcContext.attach();
784+
try {
785+
// 2. Act: Call the interceptor.
786+
interceptor.interceptCall(call, metadata, handler);
787+
} finally {
788+
grpcContext.detach(previous);
789+
}
790+
791+
// 3. Assert: Verify the handler was called and the correct Baggage was propagated.
792+
verify(handler).startCall(same(call), same(metadata));
793+
assertEquals(testBaggage, capturedBaggage.get());
794+
}
795+
753796
@Test
754797
public void generateTraceSpanName() {
755798
assertEquals(

0 commit comments

Comments
 (0)