diff --git a/micrometer-tracing-tests/micrometer-tracing-integration-test/src/test/java/io/micrometer/tracing/test/contextpropagation/AbstractObservationAwareSpanThreadLocalAccessorTests.java b/micrometer-tracing-tests/micrometer-tracing-integration-test/src/test/java/io/micrometer/tracing/test/contextpropagation/AbstractObservationAwareSpanThreadLocalAccessorTests.java index d577d78e..d3b3a4a2 100644 --- a/micrometer-tracing-tests/micrometer-tracing-integration-test/src/test/java/io/micrometer/tracing/test/contextpropagation/AbstractObservationAwareSpanThreadLocalAccessorTests.java +++ b/micrometer-tracing-tests/micrometer-tracing-integration-test/src/test/java/io/micrometer/tracing/test/contextpropagation/AbstractObservationAwareSpanThreadLocalAccessorTests.java @@ -47,6 +47,7 @@ import reactor.core.scheduler.Schedulers; import reactor.util.context.Context; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.concurrent.*; @@ -376,6 +377,26 @@ void onlyReactorPropagatesBaggageWithContextCaptureAndObservation() { assertThat(tenant).isEqualTo("tenantValue"); } + @Test + void observationAwareBaggageThreadLocalAccessorSetsAndClosesBaggageToPropagate() + throws ReflectiveOperationException { + then(getTracer().currentTraceContext().context()).isNull(); + + Observation.createNotStarted("First span", observationRegistry).observeChecked(() -> { + then(getTracer().currentTraceContext().context()).isNotNull(); + + BaggageToPropagate baggageToPropagate = new BaggageToPropagate("tenant", "tenantValue", "tenant2", + "tenant2Value"); + observationAwareBaggageThreadLocalAccessor.setValue(baggageToPropagate); + Method closeCurrentScope = ObservationAwareBaggageThreadLocalAccessor.class + .getDeclaredMethod("closeCurrentScope"); + closeCurrentScope.setAccessible(true); + return closeCurrentScope.invoke(observationAwareBaggageThreadLocalAccessor); + }); + + then(getTracer().currentTraceContext().context()).isNull(); + } + private String asyncCall() { logWithSpan("TASK EXECUTOR"); if (getTracer().currentSpan() == null) { diff --git a/micrometer-tracing/src/main/java/io/micrometer/tracing/contextpropagation/ObservationAwareBaggageThreadLocalAccessor.java b/micrometer-tracing/src/main/java/io/micrometer/tracing/contextpropagation/ObservationAwareBaggageThreadLocalAccessor.java index a08fbe10..506f0a45 100644 --- a/micrometer-tracing/src/main/java/io/micrometer/tracing/contextpropagation/ObservationAwareBaggageThreadLocalAccessor.java +++ b/micrometer-tracing/src/main/java/io/micrometer/tracing/contextpropagation/ObservationAwareBaggageThreadLocalAccessor.java @@ -160,7 +160,7 @@ private static BaggageAndScope baggageScopeClosingScope(Entry en if (scope == null) { return scopeClosingBaggageAndScope(entry, baggage); } - return scope.andThen(scopeClosingBaggageAndScope(entry, baggage)); + return scopeClosingBaggageAndScope(entry, baggage).andThen(scope); } private static BaggageAndScope scopeClosingBaggageAndScope(Entry entry, BaggageInScope baggage) {