Rename HttpTraceContext to W3CTraceContextPropagator. (#2116)
* Rename HttpTraceContext to W3CTraceContextPropagator. * Add javadoc.
This commit is contained in:
parent
82cac7a7ec
commit
bbe8702257
|
|
@ -6,6 +6,7 @@
|
|||
package io.opentelemetry.api.trace.propagation;
|
||||
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
|
@ -26,7 +27,7 @@ import org.openjdk.jmh.annotations.State;
|
|||
import org.openjdk.jmh.annotations.Warmup;
|
||||
|
||||
@State(Scope.Thread)
|
||||
public class HttpTraceContextExtractBenchmark {
|
||||
public class W3CTraceContextPropagatorExtractBenchmark {
|
||||
|
||||
private static final String TRACEPARENT = "traceparent";
|
||||
private static final int COUNT = 5;
|
||||
|
|
@ -37,7 +38,8 @@ public class HttpTraceContextExtractBenchmark {
|
|||
"00-2e7d0ad2390617702e7d0ad239061770-d49582a2de984b86-01",
|
||||
"00-905734c59b913b4a905734c59b913b4a-776ff807b787538a-00",
|
||||
"00-68ec932c33b3f2ee68ec932c33b3f2ee-68ec932c33b3f2ee-00");
|
||||
private final HttpTraceContext httpTraceContext = HttpTraceContext.getInstance();
|
||||
private final TextMapPropagator w3cTraceContextPropagator =
|
||||
W3CTraceContextPropagator.getInstance();
|
||||
private final Getter<Map<String, String>> getter =
|
||||
new Getter<Map<String, String>>() {
|
||||
@Override
|
||||
|
|
@ -65,7 +67,7 @@ public class HttpTraceContextExtractBenchmark {
|
|||
public Context measureExtract() {
|
||||
Context result = null;
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
result = httpTraceContext.extract(Context.root(), carriers.get(i), getter);
|
||||
result = w3cTraceContextPropagator.extract(Context.root(), carriers.get(i), getter);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -10,6 +10,7 @@ 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.TextMapPropagator;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Setter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
|
@ -29,7 +30,7 @@ import org.openjdk.jmh.annotations.State;
|
|||
import org.openjdk.jmh.annotations.Warmup;
|
||||
|
||||
@State(Scope.Thread)
|
||||
public class HttpTraceContextInjectBenchmark {
|
||||
public class W3CTraceContextPropagatorInjectBenchmark {
|
||||
|
||||
private static final List<SpanContext> spanContexts =
|
||||
Arrays.asList(
|
||||
|
|
@ -39,7 +40,8 @@ public class HttpTraceContextInjectBenchmark {
|
|||
createTestSpanContext("905734c59b913b4a905734c59b913b4a", "776ff807b787538a"),
|
||||
createTestSpanContext("68ec932c33b3f2ee68ec932c33b3f2ee", "68ec932c33b3f2ee"));
|
||||
private static final int COUNT = 5; // spanContexts.size()
|
||||
private final HttpTraceContext httpTraceContext = HttpTraceContext.getInstance();
|
||||
private final TextMapPropagator w3cTraceContextPropagator =
|
||||
W3CTraceContextPropagator.getInstance();
|
||||
private final Map<String, String> carrier = new HashMap<>();
|
||||
private final Setter<Map<String, String>> setter =
|
||||
new Setter<Map<String, String>>() {
|
||||
|
|
@ -60,7 +62,7 @@ public class HttpTraceContextInjectBenchmark {
|
|||
@OperationsPerInvocation(COUNT)
|
||||
public Map<String, String> measureInject() {
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
httpTraceContext.inject(contexts.get(i), carrier, setter);
|
||||
w3cTraceContextPropagator.inject(contexts.get(i), carrier, setter);
|
||||
}
|
||||
return carrier;
|
||||
}
|
||||
|
|
@ -5,231 +5,45 @@
|
|||
|
||||
package io.opentelemetry.api.trace.propagation;
|
||||
|
||||
import static io.opentelemetry.api.internal.Utils.checkArgument;
|
||||
|
||||
import io.opentelemetry.api.internal.TemporaryBuffers;
|
||||
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.api.trace.TraceStateBuilder;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Pattern;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
/**
|
||||
* Implementation of the TraceContext propagation protocol. See <a
|
||||
* href=https://github.com/w3c/distributed-tracing>w3c/distributed-tracing</a>.
|
||||
* Deprecated alias of an implementation of the W3C TraceContext propagation protocol. Use {@link
|
||||
* W3CTraceContextPropagator} instead.
|
||||
*/
|
||||
@Immutable
|
||||
@Deprecated
|
||||
public final class HttpTraceContext implements TextMapPropagator {
|
||||
private static final Logger logger = Logger.getLogger(HttpTraceContext.class.getName());
|
||||
|
||||
private static final TraceState TRACE_STATE_DEFAULT = TraceState.builder().build();
|
||||
static final String TRACE_PARENT = "traceparent";
|
||||
static final String TRACE_STATE = "tracestate";
|
||||
private static final List<String> FIELDS =
|
||||
Collections.unmodifiableList(Arrays.asList(TRACE_PARENT, TRACE_STATE));
|
||||
|
||||
private static final String VERSION = "00";
|
||||
private static final int VERSION_SIZE = 2;
|
||||
private static final char TRACEPARENT_DELIMITER = '-';
|
||||
private static final int TRACEPARENT_DELIMITER_SIZE = 1;
|
||||
private static final int TRACE_ID_HEX_SIZE = TraceId.getHexLength();
|
||||
private static final int SPAN_ID_HEX_SIZE = SpanId.getHexLength();
|
||||
private static final int TRACE_OPTION_HEX_SIZE = TraceFlags.getHexLength();
|
||||
private static final int TRACE_ID_OFFSET = VERSION_SIZE + TRACEPARENT_DELIMITER_SIZE;
|
||||
private static final int SPAN_ID_OFFSET =
|
||||
TRACE_ID_OFFSET + TRACE_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE;
|
||||
private static final int TRACE_OPTION_OFFSET =
|
||||
SPAN_ID_OFFSET + SPAN_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE;
|
||||
private static final int TRACEPARENT_HEADER_SIZE = TRACE_OPTION_OFFSET + TRACE_OPTION_HEX_SIZE;
|
||||
private static final int TRACESTATE_MAX_SIZE = 512;
|
||||
private static final int TRACESTATE_MAX_MEMBERS = 32;
|
||||
private static final char TRACESTATE_KEY_VALUE_DELIMITER = '=';
|
||||
private static final char TRACESTATE_ENTRY_DELIMITER = ',';
|
||||
private static final Pattern TRACESTATE_ENTRY_DELIMITER_SPLIT_PATTERN =
|
||||
Pattern.compile("[ \t]*" + TRACESTATE_ENTRY_DELIMITER + "[ \t]*");
|
||||
private static final Set<String> VALID_VERSIONS;
|
||||
private static final String VERSION_00 = "00";
|
||||
private static final HttpTraceContext INSTANCE = new HttpTraceContext();
|
||||
|
||||
static {
|
||||
// A valid version is 1 byte representing an 8-bit unsigned integer, version ff is invalid.
|
||||
VALID_VERSIONS = new HashSet<>();
|
||||
for (int i = 0; i < 255; i++) {
|
||||
String version = Long.toHexString(i);
|
||||
if (version.length() < 2) {
|
||||
version = '0' + version;
|
||||
}
|
||||
VALID_VERSIONS.add(version);
|
||||
}
|
||||
}
|
||||
|
||||
private HttpTraceContext() {
|
||||
// singleton
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a singleton instance of a {@link TextMapPropagator} implementing the W3C TraceContext
|
||||
* propagation. Deprecated: use {@link W3CTraceContextPropagator#getInstance()} instead.
|
||||
*/
|
||||
public static HttpTraceContext getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> fields() {
|
||||
return FIELDS;
|
||||
return W3CTraceContextPropagator.getInstance().fields();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <C> void inject(Context context, C carrier, Setter<C> setter) {
|
||||
Objects.requireNonNull(context, "context");
|
||||
Objects.requireNonNull(setter, "setter");
|
||||
|
||||
SpanContext spanContext = Span.fromContext(context).getSpanContext();
|
||||
if (!spanContext.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
char[] chars = TemporaryBuffers.chars(TRACEPARENT_HEADER_SIZE);
|
||||
chars[0] = VERSION.charAt(0);
|
||||
chars[1] = VERSION.charAt(1);
|
||||
chars[2] = TRACEPARENT_DELIMITER;
|
||||
|
||||
String traceId = spanContext.getTraceIdAsHexString();
|
||||
for (int i = 0; i < traceId.length(); i++) {
|
||||
chars[TRACE_ID_OFFSET + i] = traceId.charAt(i);
|
||||
}
|
||||
|
||||
chars[SPAN_ID_OFFSET - 1] = TRACEPARENT_DELIMITER;
|
||||
|
||||
String spanId = spanContext.getSpanIdAsHexString();
|
||||
for (int i = 0; i < spanId.length(); i++) {
|
||||
chars[SPAN_ID_OFFSET + i] = spanId.charAt(i);
|
||||
}
|
||||
|
||||
chars[TRACE_OPTION_OFFSET - 1] = TRACEPARENT_DELIMITER;
|
||||
spanContext.copyTraceFlagsHexTo(chars, TRACE_OPTION_OFFSET);
|
||||
setter.set(carrier, TRACE_PARENT, new String(chars, 0, TRACEPARENT_HEADER_SIZE));
|
||||
TraceState traceState = spanContext.getTraceState();
|
||||
if (traceState.isEmpty()) {
|
||||
// No need to add an empty "tracestate" header.
|
||||
return;
|
||||
}
|
||||
StringBuilder stringBuilder = new StringBuilder(TRACESTATE_MAX_SIZE);
|
||||
traceState.forEach(
|
||||
(key, value) -> {
|
||||
if (stringBuilder.length() != 0) {
|
||||
stringBuilder.append(TRACESTATE_ENTRY_DELIMITER);
|
||||
}
|
||||
stringBuilder.append(key).append(TRACESTATE_KEY_VALUE_DELIMITER).append(value);
|
||||
});
|
||||
setter.set(carrier, TRACE_STATE, stringBuilder.toString());
|
||||
public <C> void inject(Context context, @Nullable C carrier, Setter<C> setter) {
|
||||
W3CTraceContextPropagator.getInstance().inject(context, carrier, setter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <C /*>>> extends @NonNull Object*/> Context extract(
|
||||
Context context, @Nullable C carrier, Getter<C> getter) {
|
||||
Objects.requireNonNull(context, "context");
|
||||
Objects.requireNonNull(getter, "getter");
|
||||
|
||||
SpanContext spanContext = extractImpl(carrier, getter);
|
||||
if (!spanContext.isValid()) {
|
||||
return context;
|
||||
}
|
||||
|
||||
return context.with(Span.wrap(spanContext));
|
||||
}
|
||||
|
||||
private static <C> SpanContext extractImpl(C carrier, Getter<C> getter) {
|
||||
String traceParent = getter.get(carrier, TRACE_PARENT);
|
||||
if (traceParent == null) {
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
|
||||
SpanContext contextFromParentHeader = extractContextFromTraceParent(traceParent);
|
||||
if (!contextFromParentHeader.isValid()) {
|
||||
return contextFromParentHeader;
|
||||
}
|
||||
|
||||
String traceStateHeader = getter.get(carrier, TRACE_STATE);
|
||||
if (traceStateHeader == null || traceStateHeader.isEmpty()) {
|
||||
return contextFromParentHeader;
|
||||
}
|
||||
|
||||
try {
|
||||
TraceState traceState = extractTraceState(traceStateHeader);
|
||||
return SpanContext.createFromRemoteParent(
|
||||
contextFromParentHeader.getTraceIdAsHexString(),
|
||||
contextFromParentHeader.getSpanIdAsHexString(),
|
||||
contextFromParentHeader.getTraceFlags(),
|
||||
traceState);
|
||||
} catch (IllegalArgumentException e) {
|
||||
logger.fine("Unparseable tracestate header. Returning span context without state.");
|
||||
return contextFromParentHeader;
|
||||
}
|
||||
}
|
||||
|
||||
private static SpanContext extractContextFromTraceParent(String traceparent) {
|
||||
// TODO(bdrutu): Do we need to verify that version is hex and that
|
||||
// for the version the length is the expected one?
|
||||
boolean isValid =
|
||||
(traceparent.length() == TRACEPARENT_HEADER_SIZE
|
||||
|| (traceparent.length() > TRACEPARENT_HEADER_SIZE
|
||||
&& traceparent.charAt(TRACEPARENT_HEADER_SIZE) == TRACEPARENT_DELIMITER))
|
||||
&& traceparent.charAt(TRACE_ID_OFFSET - 1) == TRACEPARENT_DELIMITER
|
||||
&& traceparent.charAt(SPAN_ID_OFFSET - 1) == TRACEPARENT_DELIMITER
|
||||
&& traceparent.charAt(TRACE_OPTION_OFFSET - 1) == TRACEPARENT_DELIMITER;
|
||||
if (!isValid) {
|
||||
logger.fine("Unparseable traceparent header. Returning INVALID span context.");
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
|
||||
try {
|
||||
String version = traceparent.substring(0, 2);
|
||||
if (!VALID_VERSIONS.contains(version)) {
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
if (version.equals(VERSION_00) && traceparent.length() > TRACEPARENT_HEADER_SIZE) {
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
|
||||
String traceId =
|
||||
traceparent.substring(TRACE_ID_OFFSET, TRACE_ID_OFFSET + TraceId.getHexLength());
|
||||
String spanId = traceparent.substring(SPAN_ID_OFFSET, SPAN_ID_OFFSET + SpanId.getHexLength());
|
||||
if (TraceId.isValid(traceId) && SpanId.isValid(spanId)) {
|
||||
byte isSampled = TraceFlags.byteFromHex(traceparent, TRACE_OPTION_OFFSET);
|
||||
return SpanContext.createFromRemoteParent(traceId, spanId, isSampled, TRACE_STATE_DEFAULT);
|
||||
}
|
||||
return SpanContext.getInvalid();
|
||||
} catch (IllegalArgumentException e) {
|
||||
logger.fine("Unparseable traceparent header. Returning INVALID span context.");
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
}
|
||||
|
||||
private static TraceState extractTraceState(String traceStateHeader) {
|
||||
TraceStateBuilder traceStateBuilder = TraceState.builder();
|
||||
String[] listMembers = TRACESTATE_ENTRY_DELIMITER_SPLIT_PATTERN.split(traceStateHeader);
|
||||
checkArgument(
|
||||
listMembers.length <= TRACESTATE_MAX_MEMBERS, "TraceState has too many elements.");
|
||||
// Iterate in reverse order because when call builder set the elements is added in the
|
||||
// front of the list.
|
||||
for (int i = listMembers.length - 1; i >= 0; i--) {
|
||||
String listMember = listMembers[i];
|
||||
int index = listMember.indexOf(TRACESTATE_KEY_VALUE_DELIMITER);
|
||||
checkArgument(index != -1, "Invalid TraceState list-member format.");
|
||||
traceStateBuilder.set(listMember.substring(0, index), listMember.substring(index + 1));
|
||||
}
|
||||
return traceStateBuilder.build();
|
||||
public <C> Context extract(Context context, @Nullable C carrier, Getter<C> getter) {
|
||||
return W3CTraceContextPropagator.getInstance().extract(context, carrier, getter);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,243 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.api.trace.propagation;
|
||||
|
||||
import static io.opentelemetry.api.internal.Utils.checkArgument;
|
||||
|
||||
import io.opentelemetry.api.internal.TemporaryBuffers;
|
||||
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.api.trace.TraceStateBuilder;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.regex.Pattern;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
|
||||
/**
|
||||
* Implementation of the W3C TraceContext propagation protocol. See <a
|
||||
* href="https://www.w3.org/TR/trace-context-1/">W3C Trace Context</a>.
|
||||
*
|
||||
* <p>This is the default propagator for {@link SpanContext}s. The {@link SpanContext} type is
|
||||
* designed to support all the data propagated via W3C propagation natively.
|
||||
*/
|
||||
@Immutable
|
||||
public final class W3CTraceContextPropagator {
|
||||
private static final Logger logger = Logger.getLogger(W3CTraceContextPropagator.class.getName());
|
||||
|
||||
private static final TraceState TRACE_STATE_DEFAULT = TraceState.builder().build();
|
||||
static final String TRACE_PARENT = "traceparent";
|
||||
static final String TRACE_STATE = "tracestate";
|
||||
private static final List<String> FIELDS =
|
||||
Collections.unmodifiableList(Arrays.asList(TRACE_PARENT, TRACE_STATE));
|
||||
|
||||
private static final String VERSION = "00";
|
||||
private static final int VERSION_SIZE = 2;
|
||||
private static final char TRACEPARENT_DELIMITER = '-';
|
||||
private static final int TRACEPARENT_DELIMITER_SIZE = 1;
|
||||
private static final int TRACE_ID_HEX_SIZE = TraceId.getHexLength();
|
||||
private static final int SPAN_ID_HEX_SIZE = SpanId.getHexLength();
|
||||
private static final int TRACE_OPTION_HEX_SIZE = TraceFlags.getHexLength();
|
||||
private static final int TRACE_ID_OFFSET = VERSION_SIZE + TRACEPARENT_DELIMITER_SIZE;
|
||||
private static final int SPAN_ID_OFFSET =
|
||||
TRACE_ID_OFFSET + TRACE_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE;
|
||||
private static final int TRACE_OPTION_OFFSET =
|
||||
SPAN_ID_OFFSET + SPAN_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE;
|
||||
private static final int TRACEPARENT_HEADER_SIZE = TRACE_OPTION_OFFSET + TRACE_OPTION_HEX_SIZE;
|
||||
private static final int TRACESTATE_MAX_SIZE = 512;
|
||||
private static final int TRACESTATE_MAX_MEMBERS = 32;
|
||||
private static final char TRACESTATE_KEY_VALUE_DELIMITER = '=';
|
||||
private static final char TRACESTATE_ENTRY_DELIMITER = ',';
|
||||
private static final Pattern TRACESTATE_ENTRY_DELIMITER_SPLIT_PATTERN =
|
||||
Pattern.compile("[ \t]*" + TRACESTATE_ENTRY_DELIMITER + "[ \t]*");
|
||||
private static final Set<String> VALID_VERSIONS;
|
||||
private static final String VERSION_00 = "00";
|
||||
private static final TextMapPropagator INSTANCE =
|
||||
new TextMapPropagator() {
|
||||
@Override
|
||||
public List<String> fields() {
|
||||
return FIELDS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <C> void inject(Context context, C carrier, Setter<C> setter) {
|
||||
Objects.requireNonNull(context, "context");
|
||||
Objects.requireNonNull(setter, "setter");
|
||||
|
||||
SpanContext spanContext = Span.fromContext(context).getSpanContext();
|
||||
if (!spanContext.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
char[] chars = TemporaryBuffers.chars(TRACEPARENT_HEADER_SIZE);
|
||||
chars[0] = VERSION.charAt(0);
|
||||
chars[1] = VERSION.charAt(1);
|
||||
chars[2] = TRACEPARENT_DELIMITER;
|
||||
|
||||
String traceId = spanContext.getTraceIdAsHexString();
|
||||
for (int i = 0; i < traceId.length(); i++) {
|
||||
chars[TRACE_ID_OFFSET + i] = traceId.charAt(i);
|
||||
}
|
||||
|
||||
chars[SPAN_ID_OFFSET - 1] = TRACEPARENT_DELIMITER;
|
||||
|
||||
String spanId = spanContext.getSpanIdAsHexString();
|
||||
for (int i = 0; i < spanId.length(); i++) {
|
||||
chars[SPAN_ID_OFFSET + i] = spanId.charAt(i);
|
||||
}
|
||||
|
||||
chars[TRACE_OPTION_OFFSET - 1] = TRACEPARENT_DELIMITER;
|
||||
spanContext.copyTraceFlagsHexTo(chars, TRACE_OPTION_OFFSET);
|
||||
setter.set(carrier, TRACE_PARENT, new String(chars, 0, TRACEPARENT_HEADER_SIZE));
|
||||
TraceState traceState = spanContext.getTraceState();
|
||||
if (traceState.isEmpty()) {
|
||||
// No need to add an empty "tracestate" header.
|
||||
return;
|
||||
}
|
||||
StringBuilder stringBuilder = new StringBuilder(TRACESTATE_MAX_SIZE);
|
||||
traceState.forEach(
|
||||
(key, value) -> {
|
||||
if (stringBuilder.length() != 0) {
|
||||
stringBuilder.append(TRACESTATE_ENTRY_DELIMITER);
|
||||
}
|
||||
stringBuilder.append(key).append(TRACESTATE_KEY_VALUE_DELIMITER).append(value);
|
||||
});
|
||||
setter.set(carrier, TRACE_STATE, stringBuilder.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public <C /*>>> extends @NonNull Object*/> Context extract(
|
||||
Context context, @Nullable C carrier, Getter<C> getter) {
|
||||
Objects.requireNonNull(context, "context");
|
||||
Objects.requireNonNull(getter, "getter");
|
||||
|
||||
SpanContext spanContext = extractImpl(carrier, getter);
|
||||
if (!spanContext.isValid()) {
|
||||
return context;
|
||||
}
|
||||
|
||||
return context.with(Span.wrap(spanContext));
|
||||
}
|
||||
};
|
||||
|
||||
static {
|
||||
// A valid version is 1 byte representing an 8-bit unsigned integer, version ff is invalid.
|
||||
VALID_VERSIONS = new HashSet<>();
|
||||
for (int i = 0; i < 255; i++) {
|
||||
String version = Long.toHexString(i);
|
||||
if (version.length() < 2) {
|
||||
version = '0' + version;
|
||||
}
|
||||
VALID_VERSIONS.add(version);
|
||||
}
|
||||
}
|
||||
|
||||
private W3CTraceContextPropagator() {
|
||||
// singleton
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a singleton instance of a {@link TextMapPropagator} implementing the W3C TraceContext
|
||||
* propagation.
|
||||
*/
|
||||
public static TextMapPropagator getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
private static <C> SpanContext extractImpl(C carrier, TextMapPropagator.Getter<C> getter) {
|
||||
String traceParent = getter.get(carrier, TRACE_PARENT);
|
||||
if (traceParent == null) {
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
|
||||
SpanContext contextFromParentHeader = extractContextFromTraceParent(traceParent);
|
||||
if (!contextFromParentHeader.isValid()) {
|
||||
return contextFromParentHeader;
|
||||
}
|
||||
|
||||
String traceStateHeader = getter.get(carrier, TRACE_STATE);
|
||||
if (traceStateHeader == null || traceStateHeader.isEmpty()) {
|
||||
return contextFromParentHeader;
|
||||
}
|
||||
|
||||
try {
|
||||
TraceState traceState = extractTraceState(traceStateHeader);
|
||||
return SpanContext.createFromRemoteParent(
|
||||
contextFromParentHeader.getTraceIdAsHexString(),
|
||||
contextFromParentHeader.getSpanIdAsHexString(),
|
||||
contextFromParentHeader.getTraceFlags(),
|
||||
traceState);
|
||||
} catch (IllegalArgumentException e) {
|
||||
logger.fine("Unparseable tracestate header. Returning span context without state.");
|
||||
return contextFromParentHeader;
|
||||
}
|
||||
}
|
||||
|
||||
private static SpanContext extractContextFromTraceParent(String traceparent) {
|
||||
// TODO(bdrutu): Do we need to verify that version is hex and that
|
||||
// for the version the length is the expected one?
|
||||
boolean isValid =
|
||||
(traceparent.length() == TRACEPARENT_HEADER_SIZE
|
||||
|| (traceparent.length() > TRACEPARENT_HEADER_SIZE
|
||||
&& traceparent.charAt(TRACEPARENT_HEADER_SIZE) == TRACEPARENT_DELIMITER))
|
||||
&& traceparent.charAt(TRACE_ID_OFFSET - 1) == TRACEPARENT_DELIMITER
|
||||
&& traceparent.charAt(SPAN_ID_OFFSET - 1) == TRACEPARENT_DELIMITER
|
||||
&& traceparent.charAt(TRACE_OPTION_OFFSET - 1) == TRACEPARENT_DELIMITER;
|
||||
if (!isValid) {
|
||||
logger.fine("Unparseable traceparent header. Returning INVALID span context.");
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
|
||||
try {
|
||||
String version = traceparent.substring(0, 2);
|
||||
if (!VALID_VERSIONS.contains(version)) {
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
if (version.equals(VERSION_00) && traceparent.length() > TRACEPARENT_HEADER_SIZE) {
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
|
||||
String traceId =
|
||||
traceparent.substring(TRACE_ID_OFFSET, TRACE_ID_OFFSET + TraceId.getHexLength());
|
||||
String spanId = traceparent.substring(SPAN_ID_OFFSET, SPAN_ID_OFFSET + SpanId.getHexLength());
|
||||
if (TraceId.isValid(traceId) && SpanId.isValid(spanId)) {
|
||||
byte isSampled = TraceFlags.byteFromHex(traceparent, TRACE_OPTION_OFFSET);
|
||||
return SpanContext.createFromRemoteParent(traceId, spanId, isSampled, TRACE_STATE_DEFAULT);
|
||||
}
|
||||
return SpanContext.getInvalid();
|
||||
} catch (IllegalArgumentException e) {
|
||||
logger.fine("Unparseable traceparent header. Returning INVALID span context.");
|
||||
return SpanContext.getInvalid();
|
||||
}
|
||||
}
|
||||
|
||||
private static TraceState extractTraceState(String traceStateHeader) {
|
||||
TraceStateBuilder traceStateBuilder = TraceState.builder();
|
||||
String[] listMembers = TRACESTATE_ENTRY_DELIMITER_SPLIT_PATTERN.split(traceStateHeader);
|
||||
checkArgument(
|
||||
listMembers.length <= TRACESTATE_MAX_MEMBERS, "TraceState has too many elements.");
|
||||
// Iterate in reverse order because when call builder set the elements is added in the
|
||||
// front of the list.
|
||||
for (int i = listMembers.length - 1; i >= 0; i--) {
|
||||
String listMember = listMembers[i];
|
||||
int index = listMember.indexOf(TRACESTATE_KEY_VALUE_DELIMITER);
|
||||
checkArgument(index != -1, "Invalid TraceState list-member format.");
|
||||
traceStateBuilder.set(listMember.substring(0, index), listMember.substring(index + 1));
|
||||
}
|
||||
return traceStateBuilder.build();
|
||||
}
|
||||
}
|
||||
|
|
@ -11,6 +11,7 @@ import com.google.common.collect.ImmutableMap;
|
|||
import edu.berkeley.cs.jqf.fuzz.Fuzz;
|
||||
import edu.berkeley.cs.jqf.fuzz.JQF;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Nullable;
|
||||
|
|
@ -18,13 +19,14 @@ import org.junit.runner.RunWith;
|
|||
|
||||
@RunWith(JQF.class)
|
||||
@SuppressWarnings("JavadocMethod")
|
||||
public class HttpTraceContextFuzzTest {
|
||||
private final HttpTraceContext httpTraceContext = HttpTraceContext.getInstance();
|
||||
public class W3CTraceContextPropagatorFuzzTest {
|
||||
private final TextMapPropagator w3cTraceContextPropagator =
|
||||
W3CTraceContextPropagator.getInstance();
|
||||
|
||||
@Fuzz
|
||||
public void safeForRandomInputs(String traceParentHeader, String traceStateHeader) {
|
||||
Context context =
|
||||
httpTraceContext.extract(
|
||||
w3cTraceContextPropagator.extract(
|
||||
Context.root(),
|
||||
ImmutableMap.of("traceparent", traceParentHeader, "tracestate", traceStateHeader),
|
||||
new Getter<Map<String, String>>() {
|
||||
|
|
@ -5,8 +5,8 @@
|
|||
|
||||
package io.opentelemetry.api.trace.propagation;
|
||||
|
||||
import static io.opentelemetry.api.trace.propagation.HttpTraceContext.TRACE_PARENT;
|
||||
import static io.opentelemetry.api.trace.propagation.HttpTraceContext.TRACE_STATE;
|
||||
import static io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator.TRACE_PARENT;
|
||||
import static io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator.TRACE_STATE;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.entry;
|
||||
|
||||
|
|
@ -17,6 +17,7 @@ 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.TextMapPropagator;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Setter;
|
||||
import java.util.Collections;
|
||||
|
|
@ -26,8 +27,8 @@ import java.util.Map;
|
|||
import javax.annotation.Nullable;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/** Unit tests for {@link HttpTraceContext}. */
|
||||
class HttpTraceContextTest {
|
||||
/** Unit tests for {@link W3CTraceContextPropagator}. */
|
||||
class W3CTraceContextPropagatorTest {
|
||||
|
||||
private static final TraceState TRACE_STATE_DEFAULT = TraceState.builder().build();
|
||||
private static final TraceState TRACE_STATE_NOT_DEFAULT =
|
||||
|
|
@ -57,7 +58,8 @@ class HttpTraceContextTest {
|
|||
private static final String TRACESTATE_NOT_DEFAULT_ENCODING = "bar=baz,foo=bar";
|
||||
private static final String TRACESTATE_NOT_DEFAULT_ENCODING_WITH_SPACES =
|
||||
"bar=baz , foo=bar";
|
||||
private final HttpTraceContext httpTraceContext = HttpTraceContext.getInstance();
|
||||
private final TextMapPropagator w3cTraceContextPropagator =
|
||||
W3CTraceContextPropagator.getInstance();
|
||||
|
||||
private static SpanContext getSpanContext(Context context) {
|
||||
return Span.fromContext(context).getSpanContext();
|
||||
|
|
@ -70,7 +72,7 @@ class HttpTraceContextTest {
|
|||
@Test
|
||||
void inject_Nothing() {
|
||||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
httpTraceContext.inject(Context.current(), carrier, setter);
|
||||
w3cTraceContextPropagator.inject(Context.current(), carrier, setter);
|
||||
assertThat(carrier).hasSize(0);
|
||||
}
|
||||
|
||||
|
|
@ -82,7 +84,7 @@ class HttpTraceContextTest {
|
|||
SpanContext.create(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT),
|
||||
Context.current());
|
||||
httpTraceContext.inject(
|
||||
w3cTraceContextPropagator.inject(
|
||||
context,
|
||||
null,
|
||||
(Setter<Map<String, String>>) (ignored, key, value) -> carrier.put(key, value));
|
||||
|
|
@ -92,7 +94,7 @@ class HttpTraceContextTest {
|
|||
@Test
|
||||
void inject_invalidContext() {
|
||||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
httpTraceContext.inject(
|
||||
w3cTraceContextPropagator.inject(
|
||||
withSpanContext(
|
||||
SpanContext.create(
|
||||
TraceId.getInvalid(),
|
||||
|
|
@ -113,7 +115,7 @@ class HttpTraceContextTest {
|
|||
SpanContext.create(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT),
|
||||
Context.current());
|
||||
httpTraceContext.inject(context, carrier, setter);
|
||||
w3cTraceContextPropagator.inject(context, carrier, setter);
|
||||
assertThat(carrier).containsExactly(entry(TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED));
|
||||
}
|
||||
|
||||
|
|
@ -125,7 +127,7 @@ class HttpTraceContextTest {
|
|||
SpanContext.create(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_DEFAULT),
|
||||
Context.current());
|
||||
httpTraceContext.inject(context, carrier, setter);
|
||||
w3cTraceContextPropagator.inject(context, carrier, setter);
|
||||
assertThat(carrier).containsExactly(entry(TRACE_PARENT, TRACEPARENT_HEADER_NOT_SAMPLED));
|
||||
}
|
||||
|
||||
|
|
@ -137,7 +139,7 @@ class HttpTraceContextTest {
|
|||
SpanContext.create(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_NOT_DEFAULT),
|
||||
Context.current());
|
||||
httpTraceContext.inject(context, carrier, setter);
|
||||
w3cTraceContextPropagator.inject(context, carrier, setter);
|
||||
assertThat(carrier)
|
||||
.containsExactly(
|
||||
entry(TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED),
|
||||
|
|
@ -152,7 +154,7 @@ class HttpTraceContextTest {
|
|||
SpanContext.create(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_NOT_DEFAULT),
|
||||
Context.current());
|
||||
httpTraceContext.inject(context, carrier, setter);
|
||||
w3cTraceContextPropagator.inject(context, carrier, setter);
|
||||
assertThat(carrier)
|
||||
.containsExactly(
|
||||
entry(TRACE_PARENT, TRACEPARENT_HEADER_NOT_SAMPLED),
|
||||
|
|
@ -163,7 +165,7 @@ class HttpTraceContextTest {
|
|||
void extract_Nothing() {
|
||||
// Context remains untouched.
|
||||
assertThat(
|
||||
httpTraceContext.extract(
|
||||
w3cTraceContextPropagator.extract(
|
||||
Context.current(), Collections.<String, String>emptyMap(), getter))
|
||||
.isSameAs(Context.current());
|
||||
}
|
||||
|
|
@ -172,7 +174,8 @@ class HttpTraceContextTest {
|
|||
void extract_SampledContext() {
|
||||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED);
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT));
|
||||
|
|
@ -182,7 +185,8 @@ class HttpTraceContextTest {
|
|||
void extract_NullCarrier() {
|
||||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED);
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT));
|
||||
|
|
@ -193,9 +197,9 @@ class HttpTraceContextTest {
|
|||
String traceParent = "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-03";
|
||||
Map<String, String> extractCarrier = new LinkedHashMap<>();
|
||||
extractCarrier.put(TRACE_PARENT, traceParent);
|
||||
Context context = httpTraceContext.extract(Context.current(), extractCarrier, getter);
|
||||
Context context = w3cTraceContextPropagator.extract(Context.current(), extractCarrier, getter);
|
||||
Map<String, String> injectCarrier = new LinkedHashMap<>();
|
||||
httpTraceContext.inject(context, injectCarrier, setter);
|
||||
w3cTraceContextPropagator.inject(context, injectCarrier, setter);
|
||||
assertThat(extractCarrier).isEqualTo(injectCarrier);
|
||||
}
|
||||
|
||||
|
|
@ -203,7 +207,8 @@ class HttpTraceContextTest {
|
|||
void extract_NotSampledContext() {
|
||||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_NOT_SAMPLED);
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_DEFAULT));
|
||||
|
|
@ -214,7 +219,8 @@ class HttpTraceContextTest {
|
|||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED);
|
||||
carrier.put(TRACE_STATE, TRACESTATE_NOT_DEFAULT_ENCODING);
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_NOT_DEFAULT));
|
||||
|
|
@ -225,7 +231,8 @@ class HttpTraceContextTest {
|
|||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_NOT_SAMPLED);
|
||||
carrier.put(TRACE_STATE, TRACESTATE_NOT_DEFAULT_ENCODING);
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_NOT_DEFAULT));
|
||||
|
|
@ -235,7 +242,8 @@ class HttpTraceContextTest {
|
|||
void extract_NotSampledContext_NextVersion() {
|
||||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, "01-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-00-02");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_DEFAULT));
|
||||
|
|
@ -246,7 +254,8 @@ class HttpTraceContextTest {
|
|||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_NOT_SAMPLED);
|
||||
carrier.put(TRACE_STATE, "");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_DEFAULT));
|
||||
|
|
@ -257,7 +266,8 @@ class HttpTraceContextTest {
|
|||
Map<String, String> carrier = new LinkedHashMap<>();
|
||||
carrier.put(TRACE_PARENT, TRACEPARENT_HEADER_NOT_SAMPLED);
|
||||
carrier.put(TRACE_STATE, TRACESTATE_NOT_DEFAULT_ENCODING_WITH_SPACES);
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), carrier, getter)))
|
||||
assertThat(
|
||||
getSpanContext(w3cTraceContextPropagator.extract(Context.current(), carrier, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_NOT_DEFAULT));
|
||||
|
|
@ -267,7 +277,9 @@ class HttpTraceContextTest {
|
|||
void extract_EmptyHeader() {
|
||||
Map<String, String> invalidHeaders = new LinkedHashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -276,7 +288,9 @@ class HttpTraceContextTest {
|
|||
Map<String, String> invalidHeaders = new LinkedHashMap<>();
|
||||
invalidHeaders.put(
|
||||
TRACE_PARENT, "00-" + "abcdefghijklmnopabcdefghijklmnop" + "-" + SPAN_ID_BASE16 + "-01");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -284,7 +298,9 @@ class HttpTraceContextTest {
|
|||
void extract_InvalidTraceId_Size() {
|
||||
Map<String, String> invalidHeaders = new LinkedHashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "00-" + SPAN_ID_BASE16 + "-01");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -292,7 +308,9 @@ class HttpTraceContextTest {
|
|||
void extract_InvalidSpanId() {
|
||||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + "abcdefghijklmnop" + "-01");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -300,7 +318,9 @@ class HttpTraceContextTest {
|
|||
void extract_InvalidSpanId_Size() {
|
||||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "00-01");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -308,7 +328,9 @@ class HttpTraceContextTest {
|
|||
void extract_InvalidTraceFlags() {
|
||||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-gh");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -316,7 +338,9 @@ class HttpTraceContextTest {
|
|||
void extract_InvalidTraceFlags_Size() {
|
||||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-0100");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -325,7 +349,9 @@ class HttpTraceContextTest {
|
|||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-01");
|
||||
invalidHeaders.put(TRACE_STATE, "foo=bar;test=test");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT));
|
||||
|
|
@ -336,7 +362,9 @@ class HttpTraceContextTest {
|
|||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-01");
|
||||
invalidHeaders.put(TRACE_STATE, "foo=bar,test-test");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT));
|
||||
|
|
@ -347,7 +375,9 @@ class HttpTraceContextTest {
|
|||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-01");
|
||||
invalidHeaders.put(TRACE_STATE, "test-test");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, SAMPLED_TRACE_OPTIONS, TRACE_STATE_DEFAULT));
|
||||
|
|
@ -357,7 +387,9 @@ class HttpTraceContextTest {
|
|||
void extract_InvalidVersion_ff() {
|
||||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "ff-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-01");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -365,7 +397,9 @@ class HttpTraceContextTest {
|
|||
void extract_InvalidTraceparent_extraTrailing() {
|
||||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "00-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-00-01");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
|
||||
|
|
@ -373,7 +407,9 @@ class HttpTraceContextTest {
|
|||
void extract_ValidTraceparent_nextVersion_extraTrailing() {
|
||||
Map<String, String> invalidHeaders = new HashMap<>();
|
||||
invalidHeaders.put(TRACE_PARENT, "01-" + TRACE_ID_BASE16 + "-" + SPAN_ID_BASE16 + "-00-01");
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), invalidHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
|
||||
.isEqualTo(
|
||||
SpanContext.createFromRemoteParent(
|
||||
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getDefault(), TRACE_STATE_DEFAULT));
|
||||
|
|
@ -381,7 +417,7 @@ class HttpTraceContextTest {
|
|||
|
||||
@Test
|
||||
void fieldsList() {
|
||||
assertThat(httpTraceContext.fields()).containsExactly(TRACE_PARENT, TRACE_STATE);
|
||||
assertThat(w3cTraceContextPropagator.fields()).containsExactly(TRACE_PARENT, TRACE_STATE);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -393,7 +429,9 @@ class HttpTraceContextTest {
|
|||
@Test
|
||||
void extract_emptyCarrier() {
|
||||
Map<String, String> emptyHeaders = new HashMap<>();
|
||||
assertThat(getSpanContext(httpTraceContext.extract(Context.current(), emptyHeaders, getter)))
|
||||
assertThat(
|
||||
getSpanContext(
|
||||
w3cTraceContextPropagator.extract(Context.current(), emptyHeaders, getter)))
|
||||
.isSameAs(SpanContext.getInvalid());
|
||||
}
|
||||
}
|
||||
|
|
@ -15,6 +15,7 @@ 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.api.trace.propagation.W3CTraceContextPropagator;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Setter;
|
||||
|
|
@ -25,7 +26,7 @@ import java.util.Map;
|
|||
import javax.annotation.Nullable;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/** Unit tests for {@link io.opentelemetry.api.trace.propagation.HttpTraceContext}. */
|
||||
/** Unit tests for {@link W3CTraceContextPropagator}. */
|
||||
class B3PropagatorTest {
|
||||
|
||||
private static final TraceState TRACE_STATE_DEFAULT = TraceState.builder().build();
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ 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.api.trace.propagation.HttpTraceContext;
|
||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator;
|
||||
import java.util.Arrays;
|
||||
|
|
@ -34,7 +34,7 @@ class TraceMultiPropagatorTest {
|
|||
private static final TextMapPropagator PROPAGATOR1 = B3Propagator.getInstance();
|
||||
private static final TextMapPropagator PROPAGATOR2 =
|
||||
B3Propagator.builder().injectMultipleHeaders().build();
|
||||
private static final TextMapPropagator PROPAGATOR3 = HttpTraceContext.getInstance();
|
||||
private static final TextMapPropagator PROPAGATOR3 = W3CTraceContextPropagator.getInstance();
|
||||
|
||||
private static final TextMapPropagator.Getter<Map<String, String>> getter =
|
||||
new TextMapPropagator.Getter<Map<String, String>>() {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ package io.opentelemetry;
|
|||
import com.google.gson.Gson;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.propagation.HttpTraceContext;
|
||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.context.propagation.TextMapPropagator.Getter;
|
||||
|
|
@ -33,7 +33,8 @@ public class Application {
|
|||
private static final OpenTelemetry openTelemetry;
|
||||
|
||||
static {
|
||||
OpenTelemetry.setGlobalPropagators(ContextPropagators.create(HttpTraceContext.getInstance()));
|
||||
OpenTelemetry.setGlobalPropagators(
|
||||
ContextPropagators.create(W3CTraceContextPropagator.getInstance()));
|
||||
openTelemetry = OpenTelemetry.get();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
package io.opentelemetry.sdk.testing.junit4;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.propagation.HttpTraceContext;
|
||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
|
||||
|
|
@ -55,7 +55,7 @@ public class OpenTelemetryRule extends ExternalResource {
|
|||
|
||||
OpenTelemetrySdk openTelemetry =
|
||||
OpenTelemetrySdk.builder()
|
||||
.setPropagators(ContextPropagators.create(HttpTraceContext.getInstance()))
|
||||
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
|
||||
.setTracerProvider(tracerProvider)
|
||||
.build();
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.sdk.testing.junit5;
|
|||
import static io.opentelemetry.sdk.testing.assertj.TracesAssert.assertThat;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.propagation.HttpTraceContext;
|
||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
import io.opentelemetry.sdk.testing.assertj.TracesAssert;
|
||||
|
|
@ -61,7 +61,7 @@ public class OpenTelemetryExtension
|
|||
|
||||
OpenTelemetrySdk openTelemetry =
|
||||
OpenTelemetrySdk.builder()
|
||||
.setPropagators(ContextPropagators.create(HttpTraceContext.getInstance()))
|
||||
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
|
||||
.setTracerProvider(tracerProvider)
|
||||
.build();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue