From 6c3436557f25d48ea2dae17bb769814fbbdab0fc Mon Sep 17 00:00:00 2001 From: jdoherty Date: Fri, 19 May 2023 01:45:59 -0400 Subject: [PATCH] read tracing info from system properties (#8368) --- .../AwsXrayEnvSpanLinksExtractor.java | 26 ++++++--- .../AwsXrayEnvSpanLinksExtractorTest.java | 55 ++++++++++++++++--- 2 files changed, 66 insertions(+), 15 deletions(-) diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java index 342f65b50a..c88cf20c91 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/main/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractor.java @@ -26,7 +26,7 @@ import java.util.Map; final class AwsXrayEnvSpanLinksExtractor implements SpanLinksExtractor { 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"; // lower-case map getter used for extraction private static final String AWS_TRACE_HEADER_PROPAGATOR_KEY = "x-amzn-trace-id"; @@ -42,22 +42,32 @@ final class AwsXrayEnvSpanLinksExtractor implements SpanLinksExtractor contextMap = getTraceHeaderMap(); + if (contextMap.isEmpty()) { return; } Context xrayContext = - AwsXrayPropagator.getInstance() - .extract( - Context.root(), - Collections.singletonMap(AWS_TRACE_HEADER_PROPAGATOR_KEY, parentTraceHeader), - MapGetter.INSTANCE); + AwsXrayPropagator.getInstance().extract(Context.root(), contextMap, MapGetter.INSTANCE); SpanContext envVarSpanCtx = Span.fromContext(xrayContext).getSpanContext(); if (envVarSpanCtx.isValid()) { spanLinks.addLink(envVarSpanCtx, LINK_ATTRIBUTES); } } + private static Map getTraceHeaderMap() { + String traceHeader = System.getProperty(AWS_TRACE_HEADER_PROP); + if (isEmptyOrNull(traceHeader)) { + traceHeader = System.getenv(AWS_TRACE_HEADER_ENV_KEY); + } + return isEmptyOrNull(traceHeader) + ? Collections.emptyMap() + : Collections.singletonMap(AWS_TRACE_HEADER_PROPAGATOR_KEY, traceHeader); + } + + private static boolean isEmptyOrNull(String value) { + return value == null || value.isEmpty(); + } + private enum MapGetter implements TextMapGetter> { INSTANCE; diff --git a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java index 061f59cdf9..509bfbd05e 100644 --- a/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java +++ b/instrumentation/aws-lambda/aws-lambda-core-1.0/library/src/test/java/io/opentelemetry/instrumentation/awslambdacore/v1_0/internal/AwsXrayEnvSpanLinksExtractorTest.java @@ -21,6 +21,7 @@ import org.mockito.ArgumentCaptor; 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; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -32,19 +33,42 @@ class AwsXrayEnvSpanLinksExtractorTest { Attributes.of(AttributeKey.stringKey("source"), "x-ray-env"); @SystemStub final EnvironmentVariables environmentVariables = new EnvironmentVariables(); + @SystemStub final SystemProperties systemProperties = new SystemProperties(); @Test - void shouldIgnoreIfEnvVarEmpty() { + void shouldIgnoreIfEnvVarAndSystemPropertyEmpty() { // given SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class); environmentVariables.set("_X_AMZN_TRACE_ID", ""); - + systemProperties.set("com.amazonaws.xray.traceHeader", ""); // when AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); // then verifyNoInteractions(spanLinksBuilder); } + @Test + void shouldLinkAwsParentHeaderAndChooseSystemPropertyIfValidAndNotSampled() { + // given + SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class); + environmentVariables.set( + "_X_AMZN_TRACE_ID", + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=0"); + systemProperties.set( + "com.amazonaws.xray.traceHeader", + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa7;Parent=0000000000000789;Sampled=0"); + // when + AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); + // then + ArgumentCaptor captor = ArgumentCaptor.forClass(SpanContext.class); + verify(spanLinksBuilder).addLink(captor.capture(), eq(EXPECTED_LINK_ATTRIBUTES)); + SpanContext spanContext = captor.getValue(); + assertThat(spanContext.isValid()).isTrue(); + assertThat(spanContext.isSampled()).isFalse(); + assertThat(spanContext.getSpanId()).isEqualTo("0000000000000789"); + assertThat(spanContext.getTraceId()).isEqualTo("8a3c60f7d188f8fa79d48a391a778fa7"); + } + @Test void shouldLinkAwsParentHeaderIfValidAndNotSampled() { // given @@ -52,7 +76,6 @@ class AwsXrayEnvSpanLinksExtractorTest { environmentVariables.set( "_X_AMZN_TRACE_ID", "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=0"); - // when AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); // then @@ -66,13 +89,31 @@ class AwsXrayEnvSpanLinksExtractorTest { } @Test - void shouldLinkAwsParentHeaderIfValidAndSampled() { + void shouldLinkAwsParentHeaderIfValidAndNotSampledSystemProperty() { // given SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class); - environmentVariables.set( - "_X_AMZN_TRACE_ID", - "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=1"); + systemProperties.set( + "com.amazonaws.xray.traceHeader", + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=0"); + // when + AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); + // then + ArgumentCaptor captor = ArgumentCaptor.forClass(SpanContext.class); + verify(spanLinksBuilder).addLink(captor.capture(), eq(EXPECTED_LINK_ATTRIBUTES)); + SpanContext spanContext = captor.getValue(); + assertThat(spanContext.isValid()).isTrue(); + assertThat(spanContext.isSampled()).isFalse(); + assertThat(spanContext.getSpanId()).isEqualTo("0000000000000456"); + assertThat(spanContext.getTraceId()).isEqualTo("8a3c60f7d188f8fa79d48a391a778fa6"); + } + @Test + void shouldLinkAwsParentHeaderIfValidAndSampledSystemProperty() { + // given + SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class); + systemProperties.set( + "com.amazonaws.xray.traceHeader", + "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=1"); // when AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); // then