Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,13 @@
/** {@link SdkSpanBuilder} is SDK implementation of {@link SpanBuilder}. */
class SdkSpanBuilder implements SpanBuilder {

private static final Context ROOT_CONTEXT_WITH_RANDOM_TRACE_ID_BIT =
preparePrimordialContext(
TraceFlags.builder().setRandomTraceId(true).build(), TraceState.getDefault());
private static final Span RANDOM_TRACE_ID_PRIMORDIAL_SPAN =
Span.wrap(
SpanContext.create(
TraceId.getInvalid(),
SpanId.getInvalid(),
TraceFlags.builder().setRandomTraceId(true).build(),
TraceState.getDefault()));

private final String spanName;
private final InstrumentationScopeInfo instrumentationScopeInfo;
Expand All @@ -64,17 +68,6 @@ class SdkSpanBuilder implements SpanBuilder {
this.spanLimits = spanLimits;
}

/*
* A primordial context can be passed as the parent context for a root span
* if a non-default TraceFlags or TraceState need to be passed to the sampler
*/
private static Context preparePrimordialContext(TraceFlags traceFlags, TraceState traceState) {
SpanContext spanContext =
SpanContext.create(TraceId.getInvalid(), SpanId.getInvalid(), traceFlags, traceState);
Span span = Span.wrap(spanContext);
return span.storeInContext(Context.root());
}

@Override
public SpanBuilder setParent(Context context) {
if (context == null) {
Expand Down Expand Up @@ -198,7 +191,7 @@ public Span startSpan() {
if (idGenerator.generatesRandomTraceIds()) {
isTraceIdRandom = true;
// Replace parentContext for sampling with one with RANDOM_TRACE_ID bit set
parentContextForSampler = ROOT_CONTEXT_WITH_RANDOM_TRACE_ID_BIT;
parentContextForSampler = parentContext.with(RANDOM_TRACE_ID_PRIMORDIAL_SPAN);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This means extra allocations for each and every root span, but it seems necessary to be correct.

cc @PeterF778

} else {
isTraceIdRandom = false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.ContextKey;
import io.opentelemetry.context.Scope;
import io.opentelemetry.sdk.trace.data.LinkData;
import io.opentelemetry.sdk.trace.data.SpanData;
Expand All @@ -47,6 +48,7 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatchers;
import org.mockito.Mock;
import org.mockito.Mockito;
Expand Down Expand Up @@ -940,6 +942,43 @@ void propagateRandomTraceIdFlag() {
}
}

@Test
void samplerReceivesPropagatorContextWithRandomTraceId() {
Sampler mockSampler = Mockito.mock(Sampler.class);
Mockito.when(
mockSampler.shouldSample(
ArgumentMatchers.any(),
ArgumentMatchers.anyString(),
ArgumentMatchers.anyString(),
ArgumentMatchers.any(),
ArgumentMatchers.any(),
ArgumentMatchers.anyList()))
.thenReturn(SamplingResult.recordAndSample());

SdkTracerProvider provider = SdkTracerProvider.builder().setSampler(mockSampler).build();
ContextKey<String> propagatorKey = ContextKey.named("propagator-test-key");
Context parentWithPropagatorData = Context.root().with(propagatorKey, "test-value");

Span span =
provider.get("test").spanBuilder(SPAN_NAME).setParent(parentWithPropagatorData).startSpan();
span.end();

ArgumentCaptor<Context> contextCaptor = ArgumentCaptor.forClass(Context.class);
Mockito.verify(mockSampler)
.shouldSample(
contextCaptor.capture(),
ArgumentMatchers.anyString(),
ArgumentMatchers.anyString(),
ArgumentMatchers.any(),
ArgumentMatchers.any(),
ArgumentMatchers.anyList());

Context samplerContext = contextCaptor.getValue();
assertThat(samplerContext.get(propagatorKey)).isEqualTo("test-value");
assertThat(Span.fromContext(samplerContext).getSpanContext().getTraceFlags().isTraceIdRandom())
.isTrue();
}

@Test
void startTimestamp_numeric() {
SdkSpan span =
Expand Down
Loading