Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ public final class ConfigDefaults {
new LinkedHashSet<>(asList(DATADOG, TRACECONTEXT, BAGGAGE));
static final Set<PropagationStyle> DEFAULT_PROPAGATION_STYLE =
new LinkedHashSet<>(asList(PropagationStyle.DATADOG));
public static final boolean DEFAULT_PROPAGATION_B3_PADDING_ENABLED = true;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Claude] All other constants in this class are package-private (static final). Making this one public is inconsistent. If tests in other packages need it, consider exposing it via Config instead, or document why this one constant needs broader visibility.

static final int DEFAULT_TRACE_BAGGAGE_MAX_ITEMS = 64;
static final int DEFAULT_TRACE_BAGGAGE_MAX_BYTES = 8192;
static final List<String> DEFAULT_TRACE_BAGGAGE_TAG_KEYS =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,6 @@
import datadog.trace.util.AgentTaskScheduler;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
Expand All @@ -140,11 +139,8 @@
*/
public class CoreTracer implements AgentTracer.TracerAPI, TracerFlare.Reporter {
private static final Logger log = LoggerFactory.getLogger(CoreTracer.class);
// UINT64 max value
public static final BigInteger TRACE_ID_MAX =
BigInteger.valueOf(2).pow(64).subtract(BigInteger.ONE);

public static final CoreTracerBuilder builder() {
public static CoreTracerBuilder builder() {
return new CoreTracerBuilder();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package datadog.trace.core.propagation;

import static datadog.trace.api.config.TracerConfig.PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED;
import static datadog.trace.bootstrap.ActiveSubsystems.APPSEC_ACTIVE;
import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap;
import static datadog.trace.core.propagation.B3HttpCodec.B3_KEY;
Expand All @@ -9,6 +10,7 @@
import static datadog.trace.core.propagation.B3HttpCodec.SAMPLING_PRIORITY_KEY;
import static datadog.trace.core.propagation.B3HttpCodec.SPAN_ID_KEY;
import static datadog.trace.core.propagation.B3HttpCodec.TRACE_ID_KEY;
import static datadog.trace.core.propagation.HttpCodecTestHelper.headers;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonMap;
import static org.junit.jupiter.api.Assertions.assertEquals;
Expand All @@ -25,15 +27,14 @@
import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter;
import datadog.trace.test.util.DDJavaSpecification;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.converter.ConvertWith;
import org.tabletest.junit.TableTest;

@WithConfig(key = "propagation.extract.log_header_names.enabled", value = "true")
@WithConfig(key = PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED, value = "true")
class B3HttpExtractorTest extends DDJavaSpecification {
private static final String SOME_HEADER = "SOME_HEADER";
private static final String SOME_TAG = "some-tag";
Expand Down Expand Up @@ -74,14 +75,14 @@ void extractHttpHeaders(
String spanIdHex,
Integer samplingPriority,
@ConvertWith(PrioritySamplingConverter.class) byte expectedSamplingPriority) {
Map<String, String> headers = new HashMap<>();
headers.put("", "empty key");
headers.put(TRACE_ID_KEY.toUpperCase(), traceIdHex);
headers.put(SPAN_ID_KEY.toUpperCase(), spanIdHex);
headers.put(SOME_HEADER, SOME_VALUE);
if (samplingPriority != null) {
headers.put(SAMPLING_PRIORITY_KEY, samplingPriority.toString());
}
// spotless:off
Map<String, String> headers = headers(
"", "empty key",
TRACE_ID_KEY, traceIdHex,
SPAN_ID_KEY, spanIdHex,
SOME_HEADER, SOME_VALUE,
SAMPLING_PRIORITY_KEY, samplingPriority != null ? samplingPriority.toString() : null);
// spotless:on

ExtractedContext context = (ExtractedContext) extractor.extract(headers, stringValuesMap());

Expand All @@ -107,13 +108,16 @@ void extractHttpHeadersWithB3HeaderAtTheBeginning(
@ConvertWith(PrioritySamplingConverter.class) byte expectedSamplingPriority) {
String traceIdHex = "1";
String spanIdHex = "2";
Map<String, String> headers = new LinkedHashMap<>();
headers.put("", "empty key");
headers.put(B3_KEY, b3);
headers.put(TRACE_ID_KEY.toUpperCase(), traceIdHex);
headers.put(SPAN_ID_KEY.toUpperCase(), spanIdHex);
headers.put(SOME_HEADER, SOME_VALUE);
headers.put(SAMPLING_PRIORITY_KEY, SAMPLING_PRIORITY_ACCEPT);
// spotless:off
Map<String, String> headers = headers(
"", "empty key",
B3_KEY, b3,
TRACE_ID_KEY, traceIdHex,
SPAN_ID_KEY, spanIdHex,
SOME_HEADER, SOME_VALUE,
SAMPLING_PRIORITY_KEY, SAMPLING_PRIORITY_ACCEPT
);
// spotless:on

ExtractedContext context =
(ExtractedContext) this.extractor.extract(headers, stringValuesMap());
Expand All @@ -136,13 +140,16 @@ void extractHttpHeadersWithB3HeaderAtTheEnd(
@ConvertWith(PrioritySamplingConverter.class) byte expectedSamplingPriority) {
String traceIdHex = "1";
String spanIdHex = "2";
Map<String, String> headers = new LinkedHashMap<>();
headers.put("", "empty key");
headers.put(TRACE_ID_KEY.toUpperCase(), traceIdHex);
headers.put(SPAN_ID_KEY.toUpperCase(), spanIdHex);
headers.put(B3_KEY, b3);
headers.put(SOME_HEADER, SOME_VALUE);
headers.put(SAMPLING_PRIORITY_KEY, SAMPLING_PRIORITY_ACCEPT);
// spotless:off
Map<String, String> headers = headers(
"", "empty key",
TRACE_ID_KEY, traceIdHex,
SPAN_ID_KEY, spanIdHex,
B3_KEY, b3,
SOME_HEADER, SOME_VALUE,
SAMPLING_PRIORITY_KEY, SAMPLING_PRIORITY_ACCEPT
);
// spotless:on

TagContext context = this.extractor.extract(headers, stringValuesMap());

Expand Down Expand Up @@ -188,9 +195,12 @@ private Map<String, Object> expectedB3Tags(TagContext context) {
})
void extract128BitIdTruncatesIdTo64Bit(
String traceId, String spanId, String expectedTraceIdHex, Long expectedSpanId) {
Map<String, String> headers = new HashMap<>();
headers.put(TRACE_ID_KEY.toUpperCase(), traceId);
headers.put(SPAN_ID_KEY.toUpperCase(), spanId);
// spotless:off
Map<String, String> headers = headers(
TRACE_ID_KEY, traceId,
SPAN_ID_KEY, spanId
);
// spotless:on

TagContext context = this.extractor.extract(headers, stringValuesMap());

Expand Down Expand Up @@ -224,11 +234,14 @@ void extractHeaderTagsWithNoPropagation() {
@Test
void extractHeadersWithForwarding() {
String forwarded = "for=" + FORWARDED_IP + ":" + FORWARDED_PORT;
Map<String, String> tagOnlyCtx = singletonMap("Forwarded", forwarded);
Map<String, String> fullCtx = new HashMap<>();
fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1");
fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2");
fullCtx.put("Forwarded", forwarded);
Map<String, String> tagOnlyCtx = headers("Forwarded", forwarded);
// spotless:off
Map<String, String> fullCtx = headers(
TRACE_ID_KEY, "1",
SPAN_ID_KEY, "2",
"Forwarded", forwarded
);
// spotless:on

TagContext context = extractor.extract(tagOnlyCtx, stringValuesMap());

Expand All @@ -246,14 +259,18 @@ void extractHeadersWithForwarding() {

@Test
void extractHeadersWithXForwarding() {
Map<String, String> tagOnlyCtx = new HashMap<>();
tagOnlyCtx.put("X-Forwarded-For", FORWARDED_IP);
tagOnlyCtx.put("X-Forwarded-Port", FORWARDED_PORT);
Map<String, String> fullCtx = new HashMap<>();
fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1");
fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2");
fullCtx.put("x-forwarded-for", FORWARDED_IP);
fullCtx.put("x-forwarded-port", FORWARDED_PORT);
// spotless:off
Map<String, String> tagOnlyCtx = headers(
"X-Forwarded-For", FORWARDED_IP,
"X-Forwarded-Port", FORWARDED_PORT
);
Map<String, String> fullCtx = headers(
TRACE_ID_KEY, "1",
SPAN_ID_KEY, "2",
"x-forwarded-for", FORWARDED_IP,
"x-forwarded-port", FORWARDED_PORT
);
// spotless:on

TagContext context = extractor.extract(tagOnlyCtx, stringValuesMap());

Expand All @@ -272,16 +289,18 @@ void extractHeadersWithXForwarding() {

@Test
void extractEmptyHeadersReturnsNull() {
assertNull(
extractor.extract(singletonMap("ignored-header", "ignored-value"), stringValuesMap()));
assertNull(extractor.extract(headers("ignored-header", "ignored-value"), stringValuesMap()));
}

@Test
void extractHttpHeadersWithInvalidNonNumericId() {
Map<String, String> headers = new HashMap<>();
headers.put(TRACE_ID_KEY.toUpperCase(), "traceId");
headers.put(SPAN_ID_KEY.toUpperCase(), "spanId");
headers.put(SOME_HEADER, SOME_VALUE);
// spotless:off
Map<String, String> headers = headers(
TRACE_ID_KEY, "traceId",
SPAN_ID_KEY, "spanId",
SOME_HEADER, SOME_VALUE
);
// spotless:on

TagContext context = extractor.extract(headers, stringValuesMap());

Expand All @@ -291,10 +310,13 @@ void extractHttpHeadersWithInvalidNonNumericId() {

@Test
void extractHttpHeadersWithOutOfRangeSpanId() {
Map<String, String> headers = new HashMap<>();
headers.put(TRACE_ID_KEY.toUpperCase(), "0");
headers.put(SPAN_ID_KEY.toUpperCase(), "-1");
headers.put(SOME_HEADER, SOME_VALUE);
// spotless:off
Map<String, String> headers = headers(
TRACE_ID_KEY, "0",
SPAN_ID_KEY, "-1",
SOME_HEADER, SOME_VALUE
);
// spotless:on

TagContext context = extractor.extract(headers, stringValuesMap());

Expand All @@ -314,9 +336,12 @@ void extractHttpHeadersWithOutOfRangeSpanId() {
})
void extractIdsWhileRetainingTheOriginalString(
String traceId, String spanId, long expectedSpanId) {
Map<String, String> headers = new HashMap<>();
headers.put(TRACE_ID_KEY.toUpperCase(), traceId);
headers.put(SPAN_ID_KEY.toUpperCase(), spanId);
// spotless:off
Map<String, String> headers = headers(
TRACE_ID_KEY, traceId,
SPAN_ID_KEY, spanId
);
// spotless:on
B3TraceId expectedTraceId = B3TraceId.fromHex(traceId);

ExtractedContext context = (ExtractedContext) extractor.extract(headers, stringValuesMap());
Expand All @@ -341,17 +366,20 @@ private static String trimmed(String hex) {

@Test
void extractCommonHttpHeaders() {
Map<String, String> headers = new HashMap<>();
headers.put(HttpCodec.USER_AGENT_KEY, "some-user-agent");
headers.put(HttpCodec.X_CLUSTER_CLIENT_IP_KEY, "1.1.1.1");
headers.put(HttpCodec.X_REAL_IP_KEY, "2.2.2.2");
headers.put(HttpCodec.X_CLIENT_IP_KEY, "3.3.3.3");
headers.put(HttpCodec.TRUE_CLIENT_IP_KEY, "4.4.4.4");
headers.put(HttpCodec.FORWARDED_FOR_KEY, "5.5.5.5");
headers.put(HttpCodec.FORWARDED_KEY, "6.6.6.6");
headers.put(HttpCodec.FASTLY_CLIENT_IP_KEY, "7.7.7.7");
headers.put(HttpCodec.CF_CONNECTING_IP_KEY, "8.8.8.8");
headers.put(HttpCodec.CF_CONNECTING_IP_V6_KEY, "9.9.9.9");
// spotless:off
Map<String, String> headers = headers(
HttpCodec.USER_AGENT_KEY, "some-user-agent",
HttpCodec.X_CLUSTER_CLIENT_IP_KEY, "1.1.1.1",
HttpCodec.X_REAL_IP_KEY, "2.2.2.2",
HttpCodec.X_CLIENT_IP_KEY, "3.3.3.3",
HttpCodec.TRUE_CLIENT_IP_KEY, "4.4.4.4",
HttpCodec.FORWARDED_FOR_KEY, "5.5.5.5",
HttpCodec.FORWARDED_KEY, "6.6.6.6",
HttpCodec.FASTLY_CLIENT_IP_KEY, "7.7.7.7",
HttpCodec.CF_CONNECTING_IP_KEY, "8.8.8.8",
HttpCodec.CF_CONNECTING_IP_V6_KEY, "9.9.9.9"
);
// spotless:on

TagContext context = extractor.extract(headers, stringValuesMap());

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package datadog.trace.core.propagation;

import static datadog.trace.api.ConfigDefaults.DEFAULT_PROPAGATION_B3_PADDING_ENABLED;
import static datadog.trace.api.sampling.PrioritySampling.UNSET;
import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap;
import static datadog.trace.core.propagation.B3HttpCodec.B3_KEY;
import static datadog.trace.core.propagation.B3HttpCodec.SAMPLING_PRIORITY_KEY;
import static datadog.trace.core.propagation.B3HttpCodec.SPAN_ID_KEY;
import static datadog.trace.core.propagation.B3HttpCodec.TRACE_ID_KEY;
import static datadog.trace.core.propagation.B3TestHelper.spanIdOrPadded;
import static datadog.trace.core.propagation.B3TestHelper.traceIdOrPadded;
import static datadog.trace.core.propagation.B3TestHelper.trimHex;
import static java.util.Collections.emptyMap;
import static org.junit.jupiter.api.Assertions.assertEquals;

Expand All @@ -28,15 +32,17 @@
import org.junit.jupiter.params.converter.ConvertWith;
import org.tabletest.junit.TableTest;

abstract class B3HttpInjectorTest extends DDCoreJavaSpecification {
class B3HttpInjectorTest extends DDCoreJavaSpecification {

private static final CarrierSetter<Map<String, String>> MAP_SETTER = Map::put;

private HttpCodec.Injector injector;
private HttpCodec.Extractor extractor;
private CoreTracer tracer;

protected abstract boolean tracePropagationB3Padding();
protected boolean tracePropagationB3Padding() {
return DEFAULT_PROPAGATION_B3_PADDING_ENABLED;
}

@BeforeEach
void setup() {
Expand Down Expand Up @@ -77,8 +83,8 @@ void injectHttpHeaders(
Map<String, String> carrier = new HashMap<>();
this.injector.inject(spanContext, carrier, MAP_SETTER);

String traceIdHex = idOrPadded(traceId, 32);
String spanIdHex = idOrPadded(spanId, 16);
String traceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding());
String spanIdHex = spanIdOrPadded(spanId, tracePropagationB3Padding());
assertEquals(traceIdHex, carrier.get(TRACE_ID_KEY));
assertEquals(spanIdHex, carrier.get(SPAN_ID_KEY));

Expand Down Expand Up @@ -113,51 +119,14 @@ void injectHttpHeadersWithExtractedOriginal(String traceId, String spanId) {
Map<String, String> carrier = new HashMap<>();
this.injector.inject(mockedContext, carrier, MAP_SETTER);

String traceIdHex = idOrPadded(traceId, 32);
String spanIdHex = idOrPadded(trimHex(spanId), 16);
String traceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding());
String spanIdHex = spanIdOrPadded(trimHex(spanId), tracePropagationB3Padding());
assertEquals(traceIdHex, carrier.get(TRACE_ID_KEY));
assertEquals(spanIdHex, carrier.get(SPAN_ID_KEY));
assertEquals(traceIdHex + "-" + spanIdHex, carrier.get(B3_KEY));
assertEquals(3, carrier.size());
}

private String idOrPadded(long id, int size) {
return idOrPadded(Long.toHexString(id), size);
}

private String idOrPadded(String id, int size) {
if (!tracePropagationB3Padding()) {
return id.toLowerCase();
}
return padHexLower(id, size);
}

private static String padHexLower(String hex, int size) {
String lower = hex.toLowerCase();
int diff = size - lower.length();
if (diff <= 0) {
return lower;
}
StringBuilder sb = new StringBuilder(size);
for (int i = 0; i < diff; i++) {
sb.append('0');
}
sb.append(lower);
return sb.toString();
}

private static String trimHex(String hex) {
int length = hex.length();
int firstNonZero = 0;
while (firstNonZero < length && hex.charAt(firstNonZero) == '0') {
firstNonZero++;
}
if (firstNonZero == length) {
return "0";
}
return hex.substring(firstNonZero, length);
}

private DDSpanContext mockedSpanContext(TagContext context) {
return mockedSpanContext(context.getTraceId(), context.getSpanId(), UNSET);
}
Expand Down Expand Up @@ -194,11 +163,4 @@ protected boolean tracePropagationB3Padding() {
return false;
}
}

static class B3HttpInjectorPaddedTest extends B3HttpInjectorTest {
@Override
protected boolean tracePropagationB3Padding() {
return true;
}
}
}
Loading
Loading