read tracing info from system properties (#8368)
This commit is contained in:
parent
474a6d0382
commit
6c3436557f
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue