From d48736a1cdc3e4f377e7d4922e006e007a4391a0 Mon Sep 17 00:00:00 2001 From: Tyler Benson <734411+tylerbenson@users.noreply.github.com> Date: Thu, 21 Mar 2024 05:54:34 -0400 Subject: [PATCH] Add xray propagators that prioritizes xray environment variable (#1032) --- aws-xray-propagator/build.gradle.kts | 4 + .../AwsXrayLambdaConfigurablePropagator.java | 26 ++++ .../propagator/AwsXrayLambdaPropagator.java | 100 +++++++++++++ .../awsxray/propagator/AwsXrayPropagator.java | 2 +- .../AwsXrayLambdaPropagatorTest.java | 141 ++++++++++++++++++ .../propagator/AwsXrayPropagatorTest.java | 84 ++++++----- 6 files changed, 318 insertions(+), 39 deletions(-) create mode 100644 aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaConfigurablePropagator.java create mode 100644 aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagator.java create mode 100644 aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagatorTest.java diff --git a/aws-xray-propagator/build.gradle.kts b/aws-xray-propagator/build.gradle.kts index 63a869baa..356267d64 100644 --- a/aws-xray-propagator/build.gradle.kts +++ b/aws-xray-propagator/build.gradle.kts @@ -10,4 +10,8 @@ otelJava.moduleName.set("io.opentelemetry.contrib.awsxray.propagator") dependencies { api("io.opentelemetry:opentelemetry-api") compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi") + testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") + testImplementation("io.opentelemetry:opentelemetry-sdk-trace") + testImplementation("io.opentelemetry:opentelemetry-sdk-testing") + testImplementation("uk.org.webcompere:system-stubs-jupiter:2.0.2") } diff --git a/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaConfigurablePropagator.java b/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaConfigurablePropagator.java new file mode 100644 index 000000000..57e030b4a --- /dev/null +++ b/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaConfigurablePropagator.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.contrib.awsxray.propagator; + +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigurablePropagatorProvider; + +/** + * A {@link ConfigurablePropagatorProvider} which allows enabling the {@link + * AwsXrayLambdaPropagator} with the propagator name {@code xray-lambda}. + */ +public final class AwsXrayLambdaConfigurablePropagator implements ConfigurablePropagatorProvider { + @Override + public TextMapPropagator getPropagator(ConfigProperties config) { + return AwsXrayLambdaPropagator.getInstance(); + } + + @Override + public String getName() { + return "xray-lambda"; + } +} diff --git a/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagator.java b/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagator.java new file mode 100644 index 000000000..f09f8163a --- /dev/null +++ b/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagator.java @@ -0,0 +1,100 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.contrib.awsxray.propagator; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.context.propagation.TextMapSetter; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.annotation.Nullable; + +/** + * Implementation of the AWS X-Ray Trace Header propagation protocol but with special handling for + * Lambda's {@code _X_AMZN_TRACE_ID} environment variable and {@code com.amazonaws.xray.traceHeader} + * system property. + * + *

To register the X-Ray propagator together with default propagator when using the SDK: + * + *

{@code
+ * OpenTelemetrySdk.builder()
+ *   .setPropagators(
+ *     ContextPropagators.create(
+ *         TextMapPropagator.composite(
+ *             W3CTraceContextPropagator.getInstance(),
+ *             AwsXrayLambdaPropagator.getInstance())))
+ *    .build();
+ * }
+ */ +public final class AwsXrayLambdaPropagator implements TextMapPropagator { + + private static final String AWS_TRACE_HEADER_ENV_KEY = "_X_AMZN_TRACE_ID"; + private static final String AWS_TRACE_HEADER_PROP = "com.amazonaws.xray.traceHeader"; + private final AwsXrayPropagator xrayPropagator = AwsXrayPropagator.getInstance(); + private static final AwsXrayLambdaPropagator INSTANCE = new AwsXrayLambdaPropagator(); + + private AwsXrayLambdaPropagator() { + // singleton + } + + public static AwsXrayLambdaPropagator getInstance() { + return INSTANCE; + } + + @Override + public List fields() { + return xrayPropagator.fields(); + } + + @Override + public void inject(Context context, @Nullable C carrier, TextMapSetter setter) { + xrayPropagator.inject(context, carrier, setter); + } + + @Override + public Context extract(Context context, @Nullable C carrier, TextMapGetter getter) { + Context xrayContext = xrayPropagator.extract(context, carrier, getter); + + if (Span.fromContext(context).getSpanContext().isValid()) { + return xrayContext; + } + + String traceHeader = System.getProperty(AWS_TRACE_HEADER_PROP); + if (isEmptyOrNull(traceHeader)) { + traceHeader = System.getenv(AWS_TRACE_HEADER_ENV_KEY); + } + if (isEmptyOrNull(traceHeader)) { + return xrayContext; + } + return xrayPropagator.extract( + xrayContext, + Collections.singletonMap(AwsXrayPropagator.TRACE_HEADER_KEY, traceHeader), + MapGetter.INSTANCE); + } + + private static boolean isEmptyOrNull(@Nullable String value) { + return value == null || value.isEmpty(); + } + + private enum MapGetter implements TextMapGetter> { + INSTANCE; + + @Override + public Set keys(Map map) { + return map.keySet(); + } + + @Override + @Nullable + public String get(@Nullable Map map, String s) { + return map == null ? null : map.get(s); + } + } +} diff --git a/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagator.java b/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagator.java index 2ce17875b..ef7a4cf8a 100644 --- a/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagator.java +++ b/aws-xray-propagator/src/main/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagator.java @@ -38,7 +38,7 @@ * ContextPropagators.create( * TextMapPropagator.composite( * W3CTraceContextPropagator.getInstance(), - * AWSXrayPropagator.getInstance()))) + * AwsXrayPropagator.getInstance()))) * .build(); * } */ diff --git a/aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagatorTest.java b/aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagatorTest.java new file mode 100644 index 000000000..957dcb0b6 --- /dev/null +++ b/aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayLambdaPropagatorTest.java @@ -0,0 +1,141 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.contrib.awsxray.propagator; + +import static io.opentelemetry.contrib.awsxray.propagator.AwsXrayPropagator.TRACE_HEADER_KEY; +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.trace.ReadableSpan; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.data.LinkData; +import java.util.Collections; +import java.util.Map; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; +import uk.org.webcompere.systemstubs.jupiter.SystemStub; +import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; +import uk.org.webcompere.systemstubs.properties.SystemProperties; + +@ExtendWith(SystemStubsExtension.class) +class AwsXrayLambdaPropagatorTest extends AwsXrayPropagatorTest { + + @SystemStub final EnvironmentVariables environmentVariables = new EnvironmentVariables(); + @SystemStub final SystemProperties systemProperties = new SystemProperties(); + + private Tracer tracer; + + @Override + TextMapPropagator propagator() { + return AwsXrayLambdaPropagator.getInstance(); + } + + @BeforeEach + public void setup() { + tracer = SdkTracerProvider.builder().build().get("awsxray"); + } + + @Test + void extract_fromEnvironmentVariable() { + environmentVariables.set( + "_X_AMZN_TRACE_ID", + "Root=1-00000001-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar"); + + assertThat( + getSpanContext(propagator().extract(Context.current(), Collections.emptyMap(), GETTER))) + .isEqualTo( + SpanContext.createFromRemoteParent( + "00000001d188f8fa79d48a391a778fa6", + SPAN_ID, + TraceFlags.getSampled(), + TraceState.getDefault())); + } + + @Test + void extract_fromSystemProperty() { + systemProperties.set( + "com.amazonaws.xray.traceHeader", + "Root=1-00000001-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar"); + + assertThat( + getSpanContext(propagator().extract(Context.current(), Collections.emptyMap(), GETTER))) + .isEqualTo( + SpanContext.createFromRemoteParent( + "00000001d188f8fa79d48a391a778fa6", + SPAN_ID, + TraceFlags.getSampled(), + TraceState.getDefault())); + } + + @Test + void extract_systemPropertyBeforeEnvironmentVariable() { + environmentVariables.set( + "_X_AMZN_TRACE_ID", + "Root=1-00000001-240000000000000000000001;Parent=1600000000000001;Sampled=1;Foo=Bar"); + systemProperties.set( + "com.amazonaws.xray.traceHeader", + "Root=1-00000002-240000000000000000000002;Parent=1600000000000002;Sampled=1;Foo=Baz"); + + assertThat( + getSpanContext(propagator().extract(Context.current(), Collections.emptyMap(), GETTER))) + .isEqualTo( + SpanContext.createFromRemoteParent( + "00000002240000000000000000000002", + "1600000000000002", + TraceFlags.getSampled(), + TraceState.getDefault())); + } + + @Test + void addLink_SystemProperty() { + Map carrier = + Collections.singletonMap( + TRACE_HEADER_KEY, + "Root=1-00000001-240000000000000000000001;Parent=1600000000000001;Sampled=1"); + environmentVariables.set( + "_X_AMZN_TRACE_ID", + "Root=1-00000002-240000000000000000000002;Parent=1600000000000002;Sampled=1;Foo=Bar"); + systemProperties.set( + "com.amazonaws.xray.traceHeader", + "Root=1-00000003-240000000000000000000003;Parent=1600000000000003;Sampled=1;Foo=Baz"); + + Context extract = propagator().extract(Context.current(), carrier, GETTER); + ReadableSpan span = + (ReadableSpan) + tracer + .spanBuilder("test") + .setParent(extract) + .addLink( + Span.fromContext(propagator().extract(extract, carrier, GETTER)) + .getSpanContext()) + .startSpan(); + assertThat(span.getParentSpanContext()) + .isEqualTo( + SpanContext.createFromRemoteParent( + "00000003240000000000000000000003", + "1600000000000003", + TraceFlags.getSampled(), + TraceState.getDefault())); + + assertThat(span.toSpanData().getLinks()) + .isEqualTo( + Collections.singletonList( + LinkData.create( + SpanContext.createFromRemoteParent( + "00000001240000000000000000000001", + "1600000000000001", + TraceFlags.getSampled(), + TraceState.getDefault())))); + } +} diff --git a/aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagatorTest.java b/aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagatorTest.java index 452c7c1bd..2637e78e5 100644 --- a/aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagatorTest.java +++ b/aws-xray-propagator/src/test/java/io/opentelemetry/contrib/awsxray/propagator/AwsXrayPropagatorTest.java @@ -15,6 +15,7 @@ import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.TextMapGetter; +import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.context.propagation.TextMapSetter; import java.util.Collections; import java.util.LinkedHashMap; @@ -27,11 +28,11 @@ class AwsXrayPropagatorTest { - private static final String TRACE_ID = "8a3c60f7d188f8fa79d48a391a778fa6"; - private static final String SPAN_ID = "53995c3f42cd8ad8"; + static final String TRACE_ID = "8a3c60f7d188f8fa79d48a391a778fa6"; + static final String SPAN_ID = "53995c3f42cd8ad8"; - private static final TextMapSetter> setter = Map::put; - private static final TextMapGetter> getter = + static final TextMapSetter> SETTER = Map::put; + static final TextMapGetter> GETTER = new TextMapGetter>() { @Override public Set keys(Map carrier) { @@ -44,17 +45,27 @@ public String get(Map carrier, String key) { return carrier.get(key); } }; - private final AwsXrayPropagator xrayPropagator = AwsXrayPropagator.getInstance(); + protected static final AwsXrayPropagator X_RAY = AwsXrayPropagator.getInstance(); + protected final TextMapPropagator subject = propagator(); + + TextMapPropagator propagator() { + return AwsXrayPropagator.getInstance(); + } + + @Test + void fields_valid() { + assertThat(subject.fields()).containsOnly("X-Amzn-Trace-Id"); + } @Test void inject_SampledContext() { Map carrier = new LinkedHashMap<>(); - xrayPropagator.inject( + subject.inject( withSpanContext( SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()), Context.current()), carrier, - setter); + SETTER); assertThat(carrier) .containsEntry( @@ -65,12 +76,12 @@ void inject_SampledContext() { @Test void inject_NotSampledContext() { Map carrier = new LinkedHashMap<>(); - xrayPropagator.inject( + subject.inject( withSpanContext( SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()), Context.current()), carrier, - setter); + SETTER); assertThat(carrier) .containsEntry( @@ -81,7 +92,7 @@ void inject_NotSampledContext() { @Test void inject_WithBaggage() { Map carrier = new LinkedHashMap<>(); - xrayPropagator.inject( + subject.inject( withSpanContext( SpanContext.create( TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()), @@ -95,7 +106,7 @@ void inject_WithBaggage() { .put("Sampled", "ignored") .build()), carrier, - setter); + SETTER); assertThat(carrier) .containsEntry( @@ -117,14 +128,14 @@ void inject_WithBaggage_LimitTruncates() { Baggage baggage = Baggage.builder().put(key1, value1).put(key2, value2).build(); - xrayPropagator.inject( + subject.inject( withSpanContext( SpanContext.create( TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()), Context.current()) .with(baggage), carrier, - setter); + SETTER); assertThat(carrier) .containsEntry( @@ -138,7 +149,7 @@ void inject_WithBaggage_LimitTruncates() { @Test void inject_WithTraceState() { Map carrier = new LinkedHashMap<>(); - xrayPropagator.inject( + subject.inject( withSpanContext( SpanContext.create( TRACE_ID, @@ -147,7 +158,7 @@ void inject_WithTraceState() { TraceState.builder().put("foo", "bar").build()), Context.current()), carrier, - setter); + SETTER); // TODO: assert trace state when the propagator supports it, for general key/value pairs we are // mapping with baggage. @@ -160,7 +171,7 @@ void inject_WithTraceState() { @Test void inject_nullContext() { Map carrier = new LinkedHashMap<>(); - xrayPropagator.inject(null, carrier, setter); + subject.inject(null, carrier, SETTER); assertThat(carrier).isEmpty(); } @@ -171,16 +182,14 @@ void inject_nullSetter() { withSpanContext( SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()), Context.current()); - xrayPropagator.inject(context, carrier, null); + subject.inject(context, carrier, null); assertThat(carrier).isEmpty(); } @Test void extract_Nothing() { // Context remains untouched. - assertThat( - xrayPropagator.extract( - Context.current(), Collections.emptyMap(), getter)) + assertThat(subject.extract(Context.current(), Collections.emptyMap(), GETTER)) .isSameAs(Context.current()); } @@ -191,7 +200,7 @@ void extract_SampledContext() { TRACE_HEADER_KEY, "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), carrier, GETTER))) .isEqualTo( SpanContext.createFromRemoteParent( TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault())); @@ -204,7 +213,7 @@ void extract_NotSampledContext() { TRACE_HEADER_KEY, "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), carrier, GETTER))) .isEqualTo( SpanContext.createFromRemoteParent( TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault())); @@ -217,7 +226,7 @@ void extract_DifferentPartOrder() { TRACE_HEADER_KEY, "Parent=53995c3f42cd8ad8;Sampled=1;Root=1-8a3c60f7-d188f8fa79d48a391a778fa6"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), carrier, GETTER))) .isEqualTo( SpanContext.createFromRemoteParent( TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault())); @@ -230,7 +239,7 @@ void extract_AdditionalFields() { TRACE_HEADER_KEY, "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar"); - Context context = xrayPropagator.extract(Context.current(), carrier, getter); + Context context = subject.extract(Context.current(), carrier, GETTER); assertThat(getSpanContext(context)) .isEqualTo( SpanContext.createFromRemoteParent( @@ -260,7 +269,7 @@ void extract_Baggage_LimitTruncates() { + '=' + value2); - Context context = xrayPropagator.extract(Context.current(), carrier, getter); + Context context = subject.extract(Context.current(), carrier, GETTER); assertThat(getSpanContext(context)) .isEqualTo( SpanContext.createFromRemoteParent( @@ -357,15 +366,14 @@ void extract_Invalid_NoSpanId() { private void verifyInvalidBehavior(Map invalidHeaders) { Context input = Context.current(); - Context result = xrayPropagator.extract(input, invalidHeaders, getter); + Context result = subject.extract(input, invalidHeaders, GETTER); assertThat(result).isSameAs(input); assertThat(getSpanContext(result)).isSameAs(SpanContext.getInvalid()); } @Test void extract_nullContext() { - assertThat(xrayPropagator.extract(null, Collections.emptyMap(), getter)) - .isSameAs(Context.root()); + assertThat(subject.extract(null, Collections.emptyMap(), GETTER)).isSameAs(Context.root()); } @Test @@ -374,7 +382,7 @@ void extract_nullGetter() { withSpanContext( SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()), Context.current()); - assertThat(xrayPropagator.extract(context, Collections.emptyMap(), null)).isSameAs(context); + assertThat(subject.extract(context, Collections.emptyMap(), null)).isSameAs(context); } @Test @@ -384,7 +392,7 @@ void extract_EpochPart_ZeroedSingleDigit() { TRACE_HEADER_KEY, "Root=1-0-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), carrier, GETTER))) .isEqualTo( SpanContext.createFromRemoteParent( "00000000d188f8fa79d48a391a778fa6", @@ -400,7 +408,7 @@ void extract_EpochPart_TwoChars() { TRACE_HEADER_KEY, "Root=1-1a-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), carrier, GETTER))) .isEqualTo( SpanContext.createFromRemoteParent( "0000001ad188f8fa79d48a391a778fa6", @@ -416,7 +424,7 @@ void extract_EpochPart_Zeroed() { TRACE_HEADER_KEY, "Root=1-00000000-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), carrier, GETTER))) .isEqualTo( SpanContext.createFromRemoteParent( "00000000d188f8fa79d48a391a778fa6", @@ -432,7 +440,7 @@ void extract_InvalidTraceId_EpochPart_TooLong() { TRACE_HEADER_KEY, "Root=1-8a3c60f711-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), invalidHeaders, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), invalidHeaders, GETTER))) .isSameAs(SpanContext.getInvalid()); } @@ -442,7 +450,7 @@ void extract_InvalidTraceId_EpochPart_Empty() { invalidHeaders.put( TRACE_HEADER_KEY, "Root=1--d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), invalidHeaders, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), invalidHeaders, GETTER))) .isSameAs(SpanContext.getInvalid()); } @@ -452,7 +460,7 @@ void extract_InvalidTraceId_EpochPart_Missing() { invalidHeaders.put( TRACE_HEADER_KEY, "Root=1-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), invalidHeaders, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), invalidHeaders, GETTER))) .isSameAs(SpanContext.getInvalid()); } @@ -463,15 +471,15 @@ void extract_InvalidTraceId_WrongVersion() { TRACE_HEADER_KEY, "Root=2-1a2a3a4a-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar"); - assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter))) + assertThat(getSpanContext(subject.extract(Context.current(), carrier, GETTER))) .isSameAs(SpanContext.getInvalid()); } - private static Context withSpanContext(SpanContext spanContext, Context context) { + static Context withSpanContext(SpanContext spanContext, Context context) { return context.with(Span.wrap(spanContext)); } - private static SpanContext getSpanContext(Context context) { + static SpanContext getSpanContext(Context context) { return Span.fromContext(context).getSpanContext(); } }