Skip to content

Commit aa4400a

Browse files
authored
retain propagated context for random trace-ids (#8263)
1 parent 1e0ddc6 commit aa4400a

File tree

2 files changed

+47
-15
lines changed

2 files changed

+47
-15
lines changed

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpanBuilder.java

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,13 @@
3737
/** {@link SdkSpanBuilder} is SDK implementation of {@link SpanBuilder}. */
3838
class SdkSpanBuilder implements SpanBuilder {
3939

40-
private static final Context ROOT_CONTEXT_WITH_RANDOM_TRACE_ID_BIT =
41-
preparePrimordialContext(
42-
TraceFlags.builder().setRandomTraceId(true).build(), TraceState.getDefault());
40+
private static final Span RANDOM_TRACE_ID_PRIMORDIAL_SPAN =
41+
Span.wrap(
42+
SpanContext.create(
43+
TraceId.getInvalid(),
44+
SpanId.getInvalid(),
45+
TraceFlags.builder().setRandomTraceId(true).build(),
46+
TraceState.getDefault()));
4347

4448
private final String spanName;
4549
private final InstrumentationScopeInfo instrumentationScopeInfo;
@@ -64,17 +68,6 @@ class SdkSpanBuilder implements SpanBuilder {
6468
this.spanLimits = spanLimits;
6569
}
6670

67-
/*
68-
* A primordial context can be passed as the parent context for a root span
69-
* if a non-default TraceFlags or TraceState need to be passed to the sampler
70-
*/
71-
private static Context preparePrimordialContext(TraceFlags traceFlags, TraceState traceState) {
72-
SpanContext spanContext =
73-
SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState);
74-
Span span = Span.wrap(spanContext);
75-
return span.storeInContext(Context.root());
76-
}
77-
7871
@Override
7972
public SpanBuilder setParent(Context context) {
8073
if (context == null) {
@@ -198,7 +191,7 @@ public Span startSpan() {
198191
if (idGenerator.generatesRandomTraceIds()) {
199192
isTraceIdRandom = true;
200193
// Replace parentContext for sampling with one with RANDOM_TRACE_ID bit set
201-
parentContextForSampler = ROOT_CONTEXT_WITH_RANDOM_TRACE_ID_BIT;
194+
parentContextForSampler = parentContext.with(RANDOM_TRACE_ID_PRIMORDIAL_SPAN);
202195
} else {
203196
isTraceIdRandom = false;
204197
}

sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.opentelemetry.api.trace.TraceState;
3333
import io.opentelemetry.api.trace.TracerProvider;
3434
import io.opentelemetry.context.Context;
35+
import io.opentelemetry.context.ContextKey;
3536
import io.opentelemetry.context.Scope;
3637
import io.opentelemetry.sdk.trace.data.LinkData;
3738
import io.opentelemetry.sdk.trace.data.SpanData;
@@ -47,6 +48,7 @@
4748
import org.junit.jupiter.api.BeforeEach;
4849
import org.junit.jupiter.api.Test;
4950
import org.junit.jupiter.api.extension.ExtendWith;
51+
import org.mockito.ArgumentCaptor;
5052
import org.mockito.ArgumentMatchers;
5153
import org.mockito.Mock;
5254
import org.mockito.Mockito;
@@ -940,6 +942,43 @@ void propagateRandomTraceIdFlag() {
940942
}
941943
}
942944

945+
@Test
946+
void samplerReceivesPropagatorContextWithRandomTraceId() {
947+
Sampler mockSampler = Mockito.mock(Sampler.class);
948+
Mockito.when(
949+
mockSampler.shouldSample(
950+
ArgumentMatchers.any(),
951+
ArgumentMatchers.anyString(),
952+
ArgumentMatchers.anyString(),
953+
ArgumentMatchers.any(),
954+
ArgumentMatchers.any(),
955+
ArgumentMatchers.anyList()))
956+
.thenReturn(SamplingResult.recordAndSample());
957+
958+
SdkTracerProvider provider = SdkTracerProvider.builder().setSampler(mockSampler).build();
959+
ContextKey<String> propagatorKey = ContextKey.named("propagator-test-key");
960+
Context parentWithPropagatorData = Context.root().with(propagatorKey, "test-value");
961+
962+
Span span =
963+
provider.get("test").spanBuilder(SPAN_NAME).setParent(parentWithPropagatorData).startSpan();
964+
span.end();
965+
966+
ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
967+
Mockito.verify(mockSampler)
968+
.shouldSample(
969+
contextCaptor.capture(),
970+
ArgumentMatchers.anyString(),
971+
ArgumentMatchers.anyString(),
972+
ArgumentMatchers.any(),
973+
ArgumentMatchers.any(),
974+
ArgumentMatchers.anyList());
975+
976+
Context samplerContext = contextCaptor.getValue();
977+
assertThat(samplerContext.get(propagatorKey)).isEqualTo("test-value");
978+
assertThat(Span.fromContext(samplerContext).getSpanContext().getTraceFlags().isTraceIdRandom())
979+
.isTrue();
980+
}
981+
943982
@Test
944983
void startTimestamp_numeric() {
945984
SdkSpan span =

0 commit comments

Comments
 (0)