Stop publishing opentelemetry-extension-aws artifact (#4945)

This commit is contained in:
jack-berg 2022-11-17 09:40:29 -06:00 committed by GitHub
parent 6c7637b96e
commit 08e19e38c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 9 additions and 879 deletions

View File

@ -20,7 +20,7 @@
#### API Extensions
* DEPRECATION: the `opentelemetry-extension-aws` module containing
various `AwsXrayPropagator` implementations has been deprecated for removal in next major version.
various `AwsXrayPropagator` implementations has been deprecated for removal in next minor version.
A copy of the code will instead be maintained
in [opentelemetry-java-contrib/aws-xray-propagator](https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/aws-xray-propagator)
and published under

View File

@ -232,7 +232,6 @@ dependency as follows, replacing `{{artifact-id}}` with the value from the "Arti
| Component | Description | Artifact ID | Version |
|---------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------|-------------------------------------------------------------|
| [AWS Extension](./extensions/aws) | AWS Xray propagator (deprecated, moved to [opentelemetry-java-contrib/aws-xray-propagator](https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/aws-xray-propagator)) | `opentelemetry-extension-aws` | <!--VERSION_STABLE-->1.20.1<!--/VERSION_STABLE--> |
| [Kotlin Extension](./extensions/kotlin) | Context extension for coroutines | `opentelemetry-extension-kotlin` | <!--VERSION_STABLE-->1.20.1<!--/VERSION_STABLE--> |
| [Trace Propagators Extension](./extensions/trace-propagators) | Trace propagators, including B3, Jaeger, OT Trace | `opentelemetry-extension-trace-propagators` | <!--VERSION_STABLE-->1.20.1<!--/VERSION_STABLE--> |
| [Incubator Extension](./extensions/incubator) | API incubator, including pass through propagator, and extended tracer | `opentelemetry-extension-incubator` | <!--VERSION_UNSTABLE-->1.20.1-alpha<!--/VERSION_UNSTABLE--> |

View File

@ -48,6 +48,7 @@ dependencies {
testImplementation("io.grpc:grpc-protobuf")
testImplementation("io.grpc:grpc-stub")
testImplementation("io.opentelemetry:opentelemetry-extension-annotations")
testImplementation("io.opentelemetry:opentelemetry-extension-aws")
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-resources")
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-aws")

View File

@ -56,6 +56,12 @@ class FallbackArtifactsTest {
classAvailable("io.opentelemetry.sdk.extension.aws.trace.AwsXrayIdGenerator");
}
@Test
void extensionAws() {
classAvailable("io.opentelemetry.extension.aws.AwsConfigurablePropagator");
classAvailable("io.opentelemetry.extension.aws.AwsXrayPropagator");
}
private static void classAvailable(String fqcn) {
Assertions.assertThatCode(() -> Class.forName(fqcn)).doesNotThrowAnyException();
}

View File

@ -13,3 +13,4 @@ otelBom.addFallback("opentelemetry-exporter-jaeger-proto", "1.17.0")
otelBom.addFallback("opentelemetry-extension-annotations", "1.18.0")
otelBom.addFallback("opentelemetry-sdk-extension-resources", "1.19.0")
otelBom.addFallback("opentelemetry-sdk-extension-aws", "1.19.0")
otelBom.addFallback("opentelemetry-extension-aws", "1.20.0")

View File

@ -1,2 +0,0 @@
Comparing source compatibility of against
No changes.

View File

@ -1,12 +0,0 @@
# OpenTelemetry Extension AWS
[![Javadocs][javadoc-image]][javadoc-url]
> **NOTICE**: This artifact is deprecated and its contents have been moved
> to [io.opentelemetry.contrib:opentelemetry-aws-xray-propagator](https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/aws-xray-propagator).
> Version 1.20.0 will be the last minor version published. However, it will continue to receive
> patches for security vulnerabilities, and `io.opentelemetry:opentelemetry-bom` will reference the
> last published version.
[javadoc-image]: https://www.javadoc.io/badge/io.opentelemetry/opentelemetry-extension-aws.svg
[javadoc-url]: https://www.javadoc.io/doc/io.opentelemetry/opentelemetry-extension-aws

View File

@ -1,14 +0,0 @@
plugins {
id("otel.java-conventions")
id("otel.publish-conventions")
id("otel.animalsniffer-conventions")
}
description = "OpenTelemetry API Extensions for AWS"
otelJava.moduleName.set("io.opentelemetry.extension.aws")
dependencies {
api(project(":api:all"))
compileOnly(project(":sdk-extensions:autoconfigure"))
}

View File

@ -1,30 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.extension.aws;
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 AwsXrayPropagator} with
* the propagator name {@code xray}.
*
* @deprecated Moved to <a
* href="https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/aws-xray-propagator">io.opentelemetry.contrib:opentelemetry-aws-xray-propagator</a>.
*/
@Deprecated
public final class AwsConfigurablePropagator implements ConfigurablePropagatorProvider {
@Override
public TextMapPropagator getPropagator(ConfigProperties config) {
return AwsXrayPropagator.getInstance();
}
@Override
public String getName() {
return "xray";
}
}

View File

@ -1,333 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.extension.aws;
import io.opentelemetry.api.baggage.Baggage;
import io.opentelemetry.api.baggage.BaggageBuilder;
import io.opentelemetry.api.baggage.BaggageEntry;
import io.opentelemetry.api.internal.StringUtils;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceFlags;
import io.opentelemetry.api.trace.TraceId;
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.Collection;
import java.util.Collections;
import java.util.function.BiConsumer;
import java.util.logging.Logger;
import javax.annotation.Nullable;
/**
* Implementation of the AWS X-Ray Trace Header propagation protocol. See <a href=
* https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader>AWS
* Tracing header spec</a>
*
* <p>To register the X-Ray propagator together with default propagator when using the SDK:
*
* <pre>{@code
* OpenTelemetrySdk.builder()
* .setPropagators(
* ContextPropagators.create(
* TextMapPropagator.composite(
* W3CTraceContextPropagator.getInstance(),
* AWSXrayPropagator.getInstance())))
* .build();
* }</pre>
*
* @deprecated Moved to <a
* href="https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/aws-xray-propagator">io.opentelemetry.contrib:opentelemetry-aws-xray-propagator</a>.
*/
@Deprecated
public final class AwsXrayPropagator implements TextMapPropagator {
// Visible for testing
static final String TRACE_HEADER_KEY = "X-Amzn-Trace-Id";
private static final Logger logger = Logger.getLogger(AwsXrayPropagator.class.getName());
private static final char TRACE_HEADER_DELIMITER = ';';
private static final char KV_DELIMITER = '=';
private static final String TRACE_ID_KEY = "Root";
private static final int TRACE_ID_LENGTH = 35;
private static final String TRACE_ID_VERSION = "1";
private static final char TRACE_ID_DELIMITER = '-';
private static final int TRACE_ID_DELIMITER_INDEX_1 = 1;
private static final int TRACE_ID_DELIMITER_INDEX_2 = 10;
private static final int TRACE_ID_FIRST_PART_LENGTH = 8;
private static final String PARENT_ID_KEY = "Parent";
private static final int PARENT_ID_LENGTH = 16;
private static final String SAMPLED_FLAG_KEY = "Sampled";
private static final int SAMPLED_FLAG_LENGTH = 1;
private static final char IS_SAMPLED = '1';
private static final char NOT_SAMPLED = '0';
private static final Collection<String> FIELDS = Collections.singletonList(TRACE_HEADER_KEY);
private static final AwsXrayPropagator INSTANCE = new AwsXrayPropagator();
private AwsXrayPropagator() {
// singleton
}
public static AwsXrayPropagator getInstance() {
return INSTANCE;
}
@Override
public Collection<String> fields() {
return FIELDS;
}
@Override
public <C> void inject(Context context, @Nullable C carrier, TextMapSetter<C> setter) {
if (context == null) {
return;
}
if (setter == null) {
return;
}
Span span = Span.fromContext(context);
if (!span.getSpanContext().isValid()) {
return;
}
SpanContext spanContext = span.getSpanContext();
String otTraceId = spanContext.getTraceId();
String xrayTraceId =
TRACE_ID_VERSION
+ TRACE_ID_DELIMITER
+ otTraceId.substring(0, TRACE_ID_FIRST_PART_LENGTH)
+ TRACE_ID_DELIMITER
+ otTraceId.substring(TRACE_ID_FIRST_PART_LENGTH);
String parentId = spanContext.getSpanId();
char samplingFlag = spanContext.isSampled() ? IS_SAMPLED : NOT_SAMPLED;
// TODO: Add OT trace state to the X-Ray trace header
StringBuilder traceHeader = new StringBuilder();
traceHeader
.append(TRACE_ID_KEY)
.append(KV_DELIMITER)
.append(xrayTraceId)
.append(TRACE_HEADER_DELIMITER)
.append(PARENT_ID_KEY)
.append(KV_DELIMITER)
.append(parentId)
.append(TRACE_HEADER_DELIMITER)
.append(SAMPLED_FLAG_KEY)
.append(KV_DELIMITER)
.append(samplingFlag);
Baggage baggage = Baggage.fromContext(context);
// Truncate baggage to 256 chars per X-Ray spec.
baggage.forEach(
new BiConsumer<String, BaggageEntry>() {
private int baggageWrittenBytes;
@Override
public void accept(String key, BaggageEntry entry) {
if (key.equals(TRACE_ID_KEY)
|| key.equals(PARENT_ID_KEY)
|| key.equals(SAMPLED_FLAG_KEY)) {
return;
}
// Size is key/value pair, excludes delimiter.
int size = key.length() + entry.getValue().length() + 1;
if (baggageWrittenBytes + size > 256) {
return;
}
traceHeader
.append(TRACE_HEADER_DELIMITER)
.append(key)
.append(KV_DELIMITER)
.append(entry.getValue());
baggageWrittenBytes += size;
}
});
setter.set(carrier, TRACE_HEADER_KEY, traceHeader.toString());
}
@Override
public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C> getter) {
if (context == null) {
return Context.root();
}
if (getter == null) {
return context;
}
return getContextFromHeader(context, carrier, getter);
}
private static <C> Context getContextFromHeader(
Context context, @Nullable C carrier, TextMapGetter<C> getter) {
String traceHeader = getter.get(carrier, TRACE_HEADER_KEY);
if (traceHeader == null || traceHeader.isEmpty()) {
return context;
}
String traceId = TraceId.getInvalid();
String spanId = SpanId.getInvalid();
Boolean isSampled = false;
BaggageBuilder baggage = null;
int baggageReadBytes = 0;
int pos = 0;
while (pos < traceHeader.length()) {
int delimiterIndex = traceHeader.indexOf(TRACE_HEADER_DELIMITER, pos);
String part;
if (delimiterIndex >= 0) {
part = traceHeader.substring(pos, delimiterIndex);
pos = delimiterIndex + 1;
} else {
// Last part.
part = traceHeader.substring(pos);
pos = traceHeader.length();
}
String trimmedPart = part.trim();
int equalsIndex = trimmedPart.indexOf(KV_DELIMITER);
if (equalsIndex < 0) {
logger.fine("Error parsing X-Ray trace header. Invalid key value pair: " + part);
return context;
}
String value = trimmedPart.substring(equalsIndex + 1);
if (trimmedPart.startsWith(TRACE_ID_KEY)) {
traceId = parseTraceId(value);
} else if (trimmedPart.startsWith(PARENT_ID_KEY)) {
spanId = parseSpanId(value);
} else if (trimmedPart.startsWith(SAMPLED_FLAG_KEY)) {
isSampled = parseTraceFlag(value);
} else if (baggageReadBytes + trimmedPart.length() <= 256) {
if (baggage == null) {
baggage = Baggage.builder();
}
baggage.put(trimmedPart.substring(0, equalsIndex), value);
baggageReadBytes += trimmedPart.length();
}
}
if (isSampled == null) {
logger.fine(
"Invalid Sampling flag in X-Ray trace header: '"
+ TRACE_HEADER_KEY
+ "' with value "
+ traceHeader
+ "'.");
return context;
}
if (spanId == null || traceId == null) {
logger.finest("Both traceId and spanId are required to extract a valid span context. ");
}
SpanContext spanContext =
SpanContext.createFromRemoteParent(
StringUtils.padLeft(traceId, TraceId.getLength()),
spanId,
isSampled ? TraceFlags.getSampled() : TraceFlags.getDefault(),
TraceState.getDefault());
if (spanContext.isValid()) {
context = context.with(Span.wrap(spanContext));
}
if (baggage != null) {
context = context.with(baggage.build());
}
return context;
}
private static String parseTraceId(String xrayTraceId) {
return (xrayTraceId.length() == TRACE_ID_LENGTH
? parseSpecTraceId(xrayTraceId)
: parseShortTraceId(xrayTraceId));
}
private static String parseSpecTraceId(String xrayTraceId) {
// Check version trace id version
if (!xrayTraceId.startsWith(TRACE_ID_VERSION)) {
return TraceId.getInvalid();
}
// Check delimiters
if (xrayTraceId.charAt(TRACE_ID_DELIMITER_INDEX_1) != TRACE_ID_DELIMITER
|| xrayTraceId.charAt(TRACE_ID_DELIMITER_INDEX_2) != TRACE_ID_DELIMITER) {
return TraceId.getInvalid();
}
String epochPart =
xrayTraceId.substring(TRACE_ID_DELIMITER_INDEX_1 + 1, TRACE_ID_DELIMITER_INDEX_2);
String uniquePart = xrayTraceId.substring(TRACE_ID_DELIMITER_INDEX_2 + 1, TRACE_ID_LENGTH);
// X-Ray trace id format is 1-{8 digit hex}-{24 digit hex}
return epochPart + uniquePart;
}
private static String parseShortTraceId(String xrayTraceId) {
if (xrayTraceId.length() > TRACE_ID_LENGTH) {
return TraceId.getInvalid();
}
// Check version trace id version
if (!xrayTraceId.startsWith(TRACE_ID_VERSION)) {
return TraceId.getInvalid();
}
// Check delimiters
int firstDelimiter = xrayTraceId.indexOf(TRACE_ID_DELIMITER);
// we don't allow the epoch part to be missing completely
int secondDelimiter = xrayTraceId.indexOf(TRACE_ID_DELIMITER, firstDelimiter + 2);
if (firstDelimiter != TRACE_ID_DELIMITER_INDEX_1
|| secondDelimiter == -1
|| secondDelimiter > TRACE_ID_DELIMITER_INDEX_2) {
return TraceId.getInvalid();
}
String epochPart = xrayTraceId.substring(firstDelimiter + 1, secondDelimiter);
String uniquePart = xrayTraceId.substring(secondDelimiter + 1, secondDelimiter + 25);
// X-Ray trace id format is 1-{at most 8 digit hex}-{24 digit hex}
// epoch part can have leading 0s truncated
return epochPart + uniquePart;
}
private static String parseSpanId(String xrayParentId) {
if (xrayParentId.length() != PARENT_ID_LENGTH) {
return SpanId.getInvalid();
}
return xrayParentId;
}
@Nullable
private static Boolean parseTraceFlag(String xraySampledFlag) {
if (xraySampledFlag.length() != SAMPLED_FLAG_LENGTH) {
// Returning null as there is no invalid trace flag defined.
return null;
}
char flag = xraySampledFlag.charAt(0);
if (flag == IS_SAMPLED) {
return true;
} else if (flag == NOT_SAMPLED) {
return false;
} else {
return null;
}
}
}

View File

@ -1,5 +0,0 @@
/** OpenTelemetry API extensions for use with AWS. */
@ParametersAreNonnullByDefault
package io.opentelemetry.extension.aws;
import javax.annotation.ParametersAreNonnullByDefault;

View File

@ -1 +0,0 @@
io.opentelemetry.extension.aws.AwsConfigurablePropagator

View File

@ -1,479 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.extension.aws;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.baggage.Baggage;
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.context.Context;
import io.opentelemetry.context.propagation.TextMapGetter;
import io.opentelemetry.context.propagation.TextMapSetter;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.junit.jupiter.api.Test;
@SuppressWarnings("deprecation") // Moved to contrib
class AwsXrayPropagatorTest {
private static final String TRACE_ID = "8a3c60f7d188f8fa79d48a391a778fa6";
private static final String SPAN_ID = "53995c3f42cd8ad8";
private static final TextMapSetter<Map<String, String>> setter = Map::put;
private static final TextMapGetter<Map<String, String>> getter =
new TextMapGetter<Map<String, String>>() {
@Override
public Iterable<String> keys(Map<String, String> carrier) {
return carrier.keySet();
}
@Nullable
@Override
public String get(Map<String, String> carrier, String key) {
return carrier.get(key);
}
};
private final AwsXrayPropagator xrayPropagator = AwsXrayPropagator.getInstance();
@Test
void inject_SampledContext() {
Map<String, String> carrier = new LinkedHashMap<>();
xrayPropagator.inject(
withSpanContext(
SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()),
Context.current()),
carrier,
setter);
assertThat(carrier)
.containsEntry(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1");
}
@Test
void inject_NotSampledContext() {
Map<String, String> carrier = new LinkedHashMap<>();
xrayPropagator.inject(
withSpanContext(
SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()),
Context.current()),
carrier,
setter);
assertThat(carrier)
.containsEntry(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0");
}
@Test
void inject_WithBaggage() {
Map<String, String> carrier = new LinkedHashMap<>();
xrayPropagator.inject(
withSpanContext(
SpanContext.create(
TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()),
Context.current())
.with(
Baggage.builder()
.put("cat", "meow")
.put("dog", "bark")
.put("Root", "ignored")
.put("Parent", "ignored")
.put("Sampled", "ignored")
.build()),
carrier,
setter);
assertThat(carrier)
.containsEntry(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0;"
+ "cat=meow;dog=bark");
}
@Test
void inject_WithBaggage_LimitTruncates() {
Map<String, String> carrier = new LinkedHashMap<>();
// Limit is 256 characters for all baggage. We add a 254-character key/value pair and a
// 3 character key value pair.
String key1 = Stream.generate(() -> "a").limit(252).collect(Collectors.joining());
String value1 = "a"; // 252 + 1 (=) + 1 = 254
String key2 = "b";
String value2 = "b"; // 1 + 1 (=) + 1 = 3
Baggage baggage = Baggage.builder().put(key1, value1).put(key2, value2).build();
xrayPropagator.inject(
withSpanContext(
SpanContext.create(
TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()),
Context.current())
.with(baggage),
carrier,
setter);
assertThat(carrier)
.containsEntry(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0;"
+ key1
+ '='
+ value1);
}
@Test
void inject_WithTraceState() {
Map<String, String> carrier = new LinkedHashMap<>();
xrayPropagator.inject(
withSpanContext(
SpanContext.create(
TRACE_ID,
SPAN_ID,
TraceFlags.getDefault(),
TraceState.builder().put("foo", "bar").build()),
Context.current()),
carrier,
setter);
// TODO: assert trace state when the propagator supports it, for general key/value pairs we are
// mapping with baggage.
assertThat(carrier)
.containsEntry(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0");
}
@Test
void inject_nullContext() {
Map<String, String> carrier = new LinkedHashMap<>();
xrayPropagator.inject(null, carrier, setter);
assertThat(carrier).isEmpty();
}
@Test
void inject_nullSetter() {
Map<String, String> carrier = new LinkedHashMap<>();
Context context =
withSpanContext(
SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()),
Context.current());
xrayPropagator.inject(context, carrier, null);
assertThat(carrier).isEmpty();
}
@Test
void extract_Nothing() {
// Context remains untouched.
assertThat(
xrayPropagator.extract(
Context.current(), Collections.<String, String>emptyMap(), getter))
.isSameAs(Context.current());
}
@Test
void extract_SampledContext() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter)))
.isEqualTo(
SpanContext.createFromRemoteParent(
TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()));
}
@Test
void extract_NotSampledContext() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter)))
.isEqualTo(
SpanContext.createFromRemoteParent(
TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()));
}
@Test
void extract_DifferentPartOrder() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Parent=53995c3f42cd8ad8;Sampled=1;Root=1-8a3c60f7-d188f8fa79d48a391a778fa6");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter)))
.isEqualTo(
SpanContext.createFromRemoteParent(
TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()));
}
@Test
void extract_AdditionalFields() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar");
Context context = xrayPropagator.extract(Context.current(), carrier, getter);
assertThat(getSpanContext(context))
.isEqualTo(
SpanContext.createFromRemoteParent(
TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()));
assertThat(Baggage.fromContext(context).getEntryValue("Foo")).isEqualTo("Bar");
}
@Test
void extract_Baggage_LimitTruncates() {
// Limit is 256 characters for all baggage. We add a 254-character key/value pair and a
// 3 character key value pair.
String key1 = Stream.generate(() -> "a").limit(252).collect(Collectors.joining());
String value1 = "a"; // 252 + 1 (=) + 1 = 254
String key2 = "b";
String value2 = "b"; // 1 + 1 (=) + 1 = 3
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;"
+ key1
+ '='
+ value1
+ ';'
+ key2
+ '='
+ value2);
Context context = xrayPropagator.extract(Context.current(), carrier, getter);
assertThat(getSpanContext(context))
.isEqualTo(
SpanContext.createFromRemoteParent(
TRACE_ID, SPAN_ID, TraceFlags.getSampled(), TraceState.getDefault()));
assertThat(Baggage.fromContext(context).getEntryValue(key1)).isEqualTo(value1);
assertThat(Baggage.fromContext(context).getEntryValue(key2)).isNull();
}
@Test
void extract_EmptyHeaderValue() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(AwsXrayPropagator.TRACE_HEADER_KEY, "");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_InvalidTraceId() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=abcdefghijklmnopabcdefghijklmnop;Parent=53995c3f42cd8ad8;Sampled=0");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_InvalidTraceId_Size() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa600;Parent=53995c3f42cd8ad8;Sampled=0");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_InvalidSpanId() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=abcdefghijklmnop;Sampled=0");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_InvalidSpanId_Size() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad800;Sampled=0");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_InvalidFlags() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_InvalidFlags_Size() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=10220");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_InvalidFlags_NonNumeric() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f7-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=a");
verifyInvalidBehavior(invalidHeaders);
}
@Test
void extract_Invalid_NoSpanId() {
Map<String, String> invalidHeaders = new LinkedHashMap<>(1);
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY, "Root=1-622422bf-59625fe25708d4660735d8ef");
verifyInvalidBehavior(invalidHeaders);
}
private void verifyInvalidBehavior(Map<String, String> invalidHeaders) {
Context input = Context.current();
Context result = xrayPropagator.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());
}
@Test
void extract_nullGetter() {
Context context =
withSpanContext(
SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault()),
Context.current());
assertThat(xrayPropagator.extract(context, Collections.emptyMap(), null)).isSameAs(context);
}
@Test
void extract_EpochPart_ZeroedSingleDigit() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-0-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter)))
.isEqualTo(
SpanContext.createFromRemoteParent(
"00000000d188f8fa79d48a391a778fa6",
SPAN_ID,
TraceFlags.getSampled(),
TraceState.getDefault()));
}
@Test
void extract_EpochPart_TwoChars() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-1a-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter)))
.isEqualTo(
SpanContext.createFromRemoteParent(
"0000001ad188f8fa79d48a391a778fa6",
SPAN_ID,
TraceFlags.getSampled(),
TraceState.getDefault()));
}
@Test
void extract_EpochPart_Zeroed() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-00000000-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter)))
.isEqualTo(
SpanContext.createFromRemoteParent(
"00000000d188f8fa79d48a391a778fa6",
SPAN_ID,
TraceFlags.getSampled(),
TraceState.getDefault()));
}
@Test
void extract_InvalidTraceId_EpochPart_TooLong() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-8a3c60f711-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), invalidHeaders, getter)))
.isSameAs(SpanContext.getInvalid());
}
@Test
void extract_InvalidTraceId_EpochPart_Empty() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1--d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), invalidHeaders, getter)))
.isSameAs(SpanContext.getInvalid());
}
@Test
void extract_InvalidTraceId_EpochPart_Missing() {
Map<String, String> invalidHeaders = new LinkedHashMap<>();
invalidHeaders.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=1-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=0");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), invalidHeaders, getter)))
.isSameAs(SpanContext.getInvalid());
}
@Test
void extract_InvalidTraceId_WrongVersion() {
Map<String, String> carrier = new LinkedHashMap<>();
carrier.put(
AwsXrayPropagator.TRACE_HEADER_KEY,
"Root=2-1a2a3a4a-d188f8fa79d48a391a778fa6;Parent=53995c3f42cd8ad8;Sampled=1;Foo=Bar");
assertThat(getSpanContext(xrayPropagator.extract(Context.current(), carrier, getter)))
.isSameAs(SpanContext.getInvalid());
}
private static Context withSpanContext(SpanContext spanContext, Context context) {
return context.with(Span.wrap(spanContext));
}
private static SpanContext getSpanContext(Context context) {
return Span.fromContext(context).getSpanContext();
}
}

View File

@ -30,7 +30,6 @@ include(":bom-alpha")
include(":context")
include(":dependencyManagement")
include(":extensions:incubator")
include(":extensions:aws")
include(":extensions:kotlin")
include(":extensions:trace-propagators")
include(":exporters:common")