Skip to content
Draft
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
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
* Logging: Output event name in `SystemOutLogRecordExporter`
([#8609](https://github.com/open-telemetry/opentelemetry-java/pull/8609))

### Shims

* OpenTracing: Return the extracted `SpanContext` when it is sampled but invalid
([#8634](https://github.com/open-telemetry/opentelemetry-java/pull/8634))

## Version 1.64.0 (2026-07-10)

### API
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ <C> SpanContextShim extractTextMap(Format<C> format, TextMapExtract carrier) {

Span span = Span.fromContext(context);
Baggage baggage = Baggage.fromContext(context);
if (!span.getSpanContext().isValid() && baggage.isEmpty()) {
if (!span.getSpanContext().isValid()
&& !span.getSpanContext().isSampled()
&& baggage.isEmpty()) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,15 @@
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.baggage.Baggage;
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceId;
import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapGetter;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.context.propagation.TextMapSetter;
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
Expand All @@ -32,9 +38,11 @@
import io.opentracing.tag.StringTag;
import io.opentracing.tag.Tag;
import io.opentracing.tag.Tags;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -350,6 +358,21 @@ void extract_onlyBaggage() {
assertThat(spanContextShim.getBaggage()).isEqualTo(baggage);
}

@Test
void extract_invalidButSampledSpanContext() {
tracerShim =
new TracerShim(provider, new InvalidButSampledPropagator(), TextMapPropagator.noop());

SpanContext spanContext =
tracerShim.extract(Format.Builtin.TEXT_MAP, new TextMapAdapter(new HashMap<>()));

assertThat(spanContext).isNotNull();
SpanContextShim spanContextShim = (SpanContextShim) spanContext;
assertThat(spanContextShim.getSpanContext().isValid()).isFalse();
assertThat(spanContextShim.getSpanContext().isSampled()).isTrue();
assertThat(spanContextShim.getBaggage().isEmpty()).isTrue();
}

@Test
void extract_emptyCarrier_withActiveSpan_returnsNull() {
Span span = tracerShim.buildSpan("one").start();
Expand Down Expand Up @@ -467,4 +490,26 @@ void noopDoesNotCrash() {

assertThat(((SpanShim) span).getSpan().isRecording()).isFalse();
}

/** Extracts an invalid but sampled {@code SpanContext}, as {@code jaeger-debug-id} headers do. */
private static class InvalidButSampledPropagator implements TextMapPropagator {
@Override
public Collection<String> fields() {
return Collections.emptyList();
}

@Override
public <C> void inject(Context context, @Nullable C carrier, TextMapSetter<C> setter) {}

@Override
public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C> getter) {
return context.with(
io.opentelemetry.api.trace.Span.wrap(
io.opentelemetry.api.trace.SpanContext.create(
TraceId.getInvalid(),
SpanId.getInvalid(),
TraceFlags.getSampled(),
TraceState.getDefault())));
}
}
}
Loading