Stop publishing opentelemetry-extension-aws artifact (#4945)
This commit is contained in:
parent
6c7637b96e
commit
08e19e38c6
|
@ -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
|
||||
|
|
|
@ -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--> |
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
Comparing source compatibility of against
|
||||
No changes.
|
|
@ -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
|
|
@ -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"))
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
/** OpenTelemetry API extensions for use with AWS. */
|
||||
@ParametersAreNonnullByDefault
|
||||
package io.opentelemetry.extension.aws;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
|
@ -1 +0,0 @@
|
|||
io.opentelemetry.extension.aws.AwsConfigurablePropagator
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue