read tracing info from system properties (#8368)

This commit is contained in:
jdoherty 2023-05-19 01:45:59 -04:00 committed by GitHub
parent 474a6d0382
commit 6c3436557f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 66 additions and 15 deletions

View File

@ -26,7 +26,7 @@ import java.util.Map;
final class AwsXrayEnvSpanLinksExtractor implements SpanLinksExtractor<AwsLambdaRequest> { final class AwsXrayEnvSpanLinksExtractor implements SpanLinksExtractor<AwsLambdaRequest> {
private static final String AWS_TRACE_HEADER_ENV_KEY = "_X_AMZN_TRACE_ID"; 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 // lower-case map getter used for extraction
private static final String AWS_TRACE_HEADER_PROPAGATOR_KEY = "x-amzn-trace-id"; private static final String AWS_TRACE_HEADER_PROPAGATOR_KEY = "x-amzn-trace-id";
@ -42,22 +42,32 @@ final class AwsXrayEnvSpanLinksExtractor implements SpanLinksExtractor<AwsLambda
} }
public static void extract(SpanLinksBuilder spanLinks) { public static void extract(SpanLinksBuilder spanLinks) {
String parentTraceHeader = System.getenv(AWS_TRACE_HEADER_ENV_KEY); Map<String, String> contextMap = getTraceHeaderMap();
if (parentTraceHeader == null || parentTraceHeader.isEmpty()) { if (contextMap.isEmpty()) {
return; return;
} }
Context xrayContext = Context xrayContext =
AwsXrayPropagator.getInstance() AwsXrayPropagator.getInstance().extract(Context.root(), contextMap, MapGetter.INSTANCE);
.extract(
Context.root(),
Collections.singletonMap(AWS_TRACE_HEADER_PROPAGATOR_KEY, parentTraceHeader),
MapGetter.INSTANCE);
SpanContext envVarSpanCtx = Span.fromContext(xrayContext).getSpanContext(); SpanContext envVarSpanCtx = Span.fromContext(xrayContext).getSpanContext();
if (envVarSpanCtx.isValid()) { if (envVarSpanCtx.isValid()) {
spanLinks.addLink(envVarSpanCtx, LINK_ATTRIBUTES); spanLinks.addLink(envVarSpanCtx, LINK_ATTRIBUTES);
} }
} }
private static Map<String, String> 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<Map<String, String>> { private enum MapGetter implements TextMapGetter<Map<String, String>> {
INSTANCE; INSTANCE;

View File

@ -21,6 +21,7 @@ import org.mockito.ArgumentCaptor;
import uk.org.webcompere.systemstubs.environment.EnvironmentVariables; import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
import uk.org.webcompere.systemstubs.jupiter.SystemStub; import uk.org.webcompere.systemstubs.jupiter.SystemStub;
import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension; 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 * 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"); Attributes.of(AttributeKey.stringKey("source"), "x-ray-env");
@SystemStub final EnvironmentVariables environmentVariables = new EnvironmentVariables(); @SystemStub final EnvironmentVariables environmentVariables = new EnvironmentVariables();
@SystemStub final SystemProperties systemProperties = new SystemProperties();
@Test @Test
void shouldIgnoreIfEnvVarEmpty() { void shouldIgnoreIfEnvVarAndSystemPropertyEmpty() {
// given // given
SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class); SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class);
environmentVariables.set("_X_AMZN_TRACE_ID", ""); environmentVariables.set("_X_AMZN_TRACE_ID", "");
systemProperties.set("com.amazonaws.xray.traceHeader", "");
// when // when
AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder);
// then // then
verifyNoInteractions(spanLinksBuilder); 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<SpanContext> 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 @Test
void shouldLinkAwsParentHeaderIfValidAndNotSampled() { void shouldLinkAwsParentHeaderIfValidAndNotSampled() {
// given // given
@ -52,7 +76,6 @@ class AwsXrayEnvSpanLinksExtractorTest {
environmentVariables.set( environmentVariables.set(
"_X_AMZN_TRACE_ID", "_X_AMZN_TRACE_ID",
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=0"); "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=0");
// when // when
AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder);
// then // then
@ -66,13 +89,31 @@ class AwsXrayEnvSpanLinksExtractorTest {
} }
@Test @Test
void shouldLinkAwsParentHeaderIfValidAndSampled() { void shouldLinkAwsParentHeaderIfValidAndNotSampledSystemProperty() {
// given // given
SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class); SpanLinksBuilder spanLinksBuilder = mock(SpanLinksBuilder.class);
environmentVariables.set( systemProperties.set(
"_X_AMZN_TRACE_ID", "com.amazonaws.xray.traceHeader",
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=1"); "Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=0000000000000456;Sampled=0");
// when
AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder);
// then
ArgumentCaptor<SpanContext> 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 // when
AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder); AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder);
// then // then