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> {
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<AwsLambda
}
public static void extract(SpanLinksBuilder spanLinks) {
String parentTraceHeader = System.getenv(AWS_TRACE_HEADER_ENV_KEY);
if (parentTraceHeader == null || parentTraceHeader.isEmpty()) {
Map<String, String> 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<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>> {
INSTANCE;

View File

@ -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<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
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<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
AwsXrayEnvSpanLinksExtractor.extract(spanLinksBuilder);
// then