From c8362af10687997bcf33e89c25be95b4070106a5 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 14:03:30 +0200 Subject: [PATCH 01/15] fix(core): Manually cleaning up AI code --- .../datadog/trace/api/ConfigDefaults.java | 1 + .../core/propagation/B3HttpInjectorTest.java | 62 ++---- .../trace/core/propagation/B3TestHelper.java | 71 +++++++ .../core/propagation/HttpExtractorTest.java | 131 +++++++----- .../core/propagation/HttpInjectorTest.java | 40 ++-- .../main/java/datadog/trace/api/Config.java | 190 +----------------- .../trace/test/util/StringUtils.groovy | 25 --- .../trace/test/util/JavaStringUtils.java | 38 ---- 8 files changed, 181 insertions(+), 377 deletions(-) create mode 100644 dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java delete mode 100644 utils/test-utils/src/main/groovy/datadog/trace/test/util/StringUtils.groovy delete mode 100644 utils/test-utils/src/main/java/datadog/trace/test/util/JavaStringUtils.java diff --git a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java index a88c00db14e..86904e56952 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java @@ -82,6 +82,7 @@ public final class ConfigDefaults { new LinkedHashSet<>(asList(DATADOG, TRACECONTEXT, BAGGAGE)); static final Set DEFAULT_PROPAGATION_STYLE = new LinkedHashSet<>(asList(PropagationStyle.DATADOG)); + public static final boolean DEFAULT_PROPAGATION_B3_PADDING_ENABLED = true; static final int DEFAULT_TRACE_BAGGAGE_MAX_ITEMS = 64; static final int DEFAULT_TRACE_BAGGAGE_MAX_BYTES = 8192; static final List DEFAULT_TRACE_BAGGAGE_TAG_KEYS = diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java index e47fdcebb88..c3d653498ef 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpInjectorTest.java @@ -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; @@ -28,7 +32,7 @@ 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_SETTER = Map::put; @@ -36,7 +40,9 @@ abstract class B3HttpInjectorTest extends DDCoreJavaSpecification { private HttpCodec.Extractor extractor; private CoreTracer tracer; - protected abstract boolean tracePropagationB3Padding(); + protected boolean tracePropagationB3Padding() { + return DEFAULT_PROPAGATION_B3_PADDING_ENABLED; + } @BeforeEach void setup() { @@ -77,8 +83,8 @@ void injectHttpHeaders( Map 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)); @@ -113,51 +119,14 @@ void injectHttpHeadersWithExtractedOriginal(String traceId, String spanId) { Map 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); } @@ -194,11 +163,4 @@ protected boolean tracePropagationB3Padding() { return false; } } - - static class B3HttpInjectorPaddedTest extends B3HttpInjectorTest { - @Override - protected boolean tracePropagationB3Padding() { - return true; - } - } } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java new file mode 100644 index 00000000000..3cc2b1de26e --- /dev/null +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java @@ -0,0 +1,71 @@ +package datadog.trace.core.propagation; + +import datadog.trace.api.DDTraceId; + +/** + * This class contains helper methods for formatting trace and span identifiers for B3 propagation tests. + */ +public final class B3TestHelper { + + private B3TestHelper() {} + + static String traceIdOrPadded(DDTraceId id, boolean padding) { + if (id.toHighOrderLong() == 0) { + return idOrPadded(Long.toHexString(id.toLong()), 32, padding); + } + return id.toHexString(); + } + + static String traceIdOrPadded(long id, boolean padding) { + return idOrPadded(id, 32, padding); + } + + static String traceIdOrPadded(String hexTraceId, boolean padding) { + return idOrPadded(hexTraceId, 32, padding); + } + + static String spanIdOrPadded(long id, boolean padding) { + return idOrPadded(id, 16, padding); + } + + static String spanIdOrPadded(String hexSpanId, boolean padding) { + return idOrPadded(hexSpanId, 16, padding); + } + + private static String idOrPadded(long id, int size, boolean padding) { + return idOrPadded(Long.toHexString(id), size, padding); + } + + private static String idOrPadded(String id, int size, boolean padding) { + if (!padding) { + 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(); + } + + 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); + } +} diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java index 28126cb724b..646492db74d 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java @@ -28,6 +28,10 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.params.converter.ArgumentConversionException; +import org.junit.jupiter.params.converter.ArgumentConverter; +import org.junit.jupiter.params.converter.ConvertWith; import org.tabletest.junit.TableTest; import org.tabletest.junit.TypeConverter; @@ -36,7 +40,8 @@ public class HttpExtractorTest extends DDJavaSpecification { private static final String W3C_TRACE_ID = "00000000000000000000000000000001"; private static final String W3C_SPAN_ID = "123456789abcdef0"; private static final String W3C_TRACE_PARENT = "00-" + W3C_TRACE_ID + "-" + W3C_SPAN_ID + "-01"; - private static final String W3C_TRACE_STATE_WITH_P = "dd=p:456789abcdef0123"; + private static final String W3C_PARENT_ID = "456789abcdef0123"; + private static final String W3C_TRACE_STATE_WITH_P = "dd=p:" + W3C_PARENT_ID; private static final String W3C_TRACE_STATE_NO_P = "dd=s:2,foo=1"; private static final String W3C_SPAN_ID_LSTR = Long.toString(DDSpanId.fromHex(W3C_SPAN_ID)); @@ -49,33 +54,57 @@ public static TracePropagationStyle parseTracePropagationStyle(String value) { return TracePropagationStyle.valueOf(name); } + static class W3cConstantConverter implements ArgumentConverter { + @Override + public Object convert(Object source, ParameterContext context) + throws ArgumentConversionException { + if (source == null) { + return null; + } + switch (source.toString()) { + case "W3C_TRACE_PARENT": + return W3C_TRACE_PARENT; + case "W3C_TRACE_STATE_WITH_P": + return W3C_TRACE_STATE_WITH_P; + case "W3C_TRACE_STATE_NO_P": + return W3C_TRACE_STATE_NO_P; + case "W3C_SPAN_ID_LSTR": + return W3C_SPAN_ID_LSTR; + case "W3C_PARENT_ID": + return W3C_PARENT_ID; + default: + return source; + } + } + } + @TableTest({ - "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | expectedTraceId | expectedSpanId | putDatadogFields | expectDatadogFields | tagContext | extractFirst", - "DATADOG,B3MULTI ids | [DATADOG, B3MULTI] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", - "DATADOG,B3MULTI b3 only | [DATADOG, B3MULTI] | | | 'a' | 'b' | | '10' | '11' | false | false | true | false ", - "DATADOG,B3MULTI b3 only with dd field | [DATADOG, B3MULTI] | | | 'a' | 'b' | | | | true | true | true | false ", - "DATADOG only | [DATADOG] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", - "B3MULTI only | [B3MULTI] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "B3MULTI,DATADOG | [B3MULTI, DATADOG] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "no styles | [] | '1' | '2' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG,B3MULTI invalid datadog trace | [DATADOG, B3MULTI] | 'abc' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "DATADOG only invalid trace | [DATADOG] | 'abc' | '2' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG,B3MULTI dd trace out of range | [DATADOG, B3MULTI] | '18446744073709551616' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "DATADOG,B3MULTI dd span out of range | [DATADOG, B3MULTI] | '1' | '18446744073709551616' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "DATADOG only dd trace out of range | [DATADOG] | '18446744073709551616' | '2' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG only dd span out of range | [DATADOG] | '1' | '18446744073709551616' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG,B3MULTI b3 trace out of range | [DATADOG, B3MULTI] | '1' | '2' | '18446744073709551616' | 'b' | | '1' | '2' | true | false | false | false ", - "DATADOG,B3MULTI b3 span out of range | [DATADOG, B3MULTI] | '1' | '2' | 'a' | '18446744073709551616' | | '1' | '2' | true | false | false | false ", - "NONE | [NONE] | '1' | '2' | | | | | | true | false | true | false ", - "DATADOG,TRACECONTEXT w3c override | [DATADOG, TRACECONTEXT] | '1' | '2' | | | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "DATADOG,TRACECONTEXT,B3MULTI w3c override | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "TRACECONTEXT,DATADOG | [TRACECONTEXT, DATADOG] | '1' | '2' | | | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "TRACECONTEXT,B3MULTI | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "TRACECONTEXT,B3MULTI,DATADOG | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "B3MULTI,DATADOG,TRACECONTEXT | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "TRACECONTEXT only | [TRACECONTEXT] | | | | | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "DATADOG,TRACECONTEXT no dd span | [DATADOG, TRACECONTEXT] | '1' | | | | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '1311768467463790320' | false | false | false | false ", - "DATADOG,TRACECONTEXT extract first | [DATADOG, TRACECONTEXT] | '1' | '2' | | | '00-00000000000000000000000000000001-123456789abcdef0-01' | '1' | '2' | false | false | false | true " + "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | expectedTraceId | expectedSpanId | putDatadogFields | expectDatadogFields | tagContext | extractFirst", + "DATADOG,B3MULTI ids | [DATADOG, B3MULTI] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", + "DATADOG,B3MULTI b3 only | [DATADOG, B3MULTI] | | | 'a' | 'b' | | '10' | '11' | false | false | true | false ", + "DATADOG,B3MULTI b3 only with dd field | [DATADOG, B3MULTI] | | | 'a' | 'b' | | | | true | true | true | false ", + "DATADOG only | [DATADOG] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", + "B3MULTI only | [B3MULTI] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "B3MULTI,DATADOG | [B3MULTI, DATADOG] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "no styles | [] | '1' | '2' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG,B3MULTI invalid datadog trace | [DATADOG, B3MULTI] | 'abc' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "DATADOG only invalid trace | [DATADOG] | 'abc' | '2' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG,B3MULTI dd trace out of range | [DATADOG, B3MULTI] | '18446744073709551616' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "DATADOG,B3MULTI dd span out of range | [DATADOG, B3MULTI] | '1' | '18446744073709551616' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "DATADOG only dd trace out of range | [DATADOG] | '18446744073709551616' | '2' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG only dd span out of range | [DATADOG] | '1' | '18446744073709551616' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG,B3MULTI b3 trace out of range | [DATADOG, B3MULTI] | '1' | '2' | '18446744073709551616' | 'b' | | '1' | '2' | true | false | false | false ", + "DATADOG,B3MULTI b3 span out of range | [DATADOG, B3MULTI] | '1' | '2' | 'a' | '18446744073709551616' | | '1' | '2' | true | false | false | false ", + "NONE | [NONE] | '1' | '2' | | | | | | true | false | true | false ", + "DATADOG,TRACECONTEXT w3c override | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "DATADOG,TRACECONTEXT,B3MULTI w3c override | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT,DATADOG | [TRACECONTEXT, DATADOG] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT,B3MULTI | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT,B3MULTI,DATADOG | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "B3MULTI,DATADOG,TRACECONTEXT | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT only | [TRACECONTEXT] | | | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "DATADOG,TRACECONTEXT no dd span | [DATADOG, TRACECONTEXT] | '1' | | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "DATADOG,TRACECONTEXT extract first | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | '2' | false | false | false | true " }) void extractHttpHeadersUsingStyles( List styles, @@ -83,9 +112,9 @@ void extractHttpHeadersUsingStyles( String datadogSpanId, String b3TraceId, String b3SpanId, - String w3cTraceParent, + @ConvertWith(W3cConstantConverter.class) String w3cTraceParent, String expectedTraceId, - String expectedSpanId, + @ConvertWith(W3cConstantConverter.class) String expectedSpanId, boolean putDatadogFields, boolean expectDatadogFields, boolean tagContext, @@ -137,18 +166,18 @@ void extractHttpHeadersUsingStyles( } @TableTest({ - "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | traceState | expectedTraceId | expectedSpanId | expectedParentId ", - "DATADOG,TRACECONTEXT with traceState p | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | '456789abcdef0123'", - "DATADOG,TRACECONTEXT no traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | | '1' | '1311768467463790320' | '0000000000000002'", - "DATADOG,TRACECONTEXT,B3MULTI with traceState p | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | '456789abcdef0123'", - "TRACECONTEXT,DATADOG with traceState p | [TRACECONTEXT, DATADOG] | '1' | '2' | | | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | ", - "TRACECONTEXT,B3MULTI with traceState p | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | ", - "TRACECONTEXT,B3MULTI,DATADOG with traceState p | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | ", - "B3MULTI,DATADOG,TRACECONTEXT with traceState p | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | '456789abcdef0123'", - "TRACECONTEXT only with traceState p | [TRACECONTEXT] | | | | | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | ", - "B3MULTI,TRACECONTEXT with traceState p | [B3MULTI, TRACECONTEXT] | | | '1' | '2' | 'dd=p:456789abcdef0123' | '1' | '1311768467463790320' | '456789abcdef0123'", - "B3MULTI,DATADOG,TRACECONTEXT no traceState | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | | '1' | '1311768467463790320' | '0000000000000002'", - "DATADOG,TRACECONTEXT no p traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'dd=s:2,foo=1' | '1' | '1311768467463790320' | '0000000000000002'" + "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | traceState | expectedTraceId | expectedSpanId | expectedParentId ", + "DATADOG,TRACECONTEXT with traceState p | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "DATADOG,TRACECONTEXT no traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'", + "DATADOG,TRACECONTEXT,B3MULTI with traceState p | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "TRACECONTEXT,DATADOG with traceState p | [TRACECONTEXT, DATADOG] | '1' | '2' | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "TRACECONTEXT,B3MULTI with traceState p | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "TRACECONTEXT,B3MULTI,DATADOG with traceState p | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "B3MULTI,DATADOG,TRACECONTEXT with traceState p | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "TRACECONTEXT only with traceState p | [TRACECONTEXT] | | | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "B3MULTI,TRACECONTEXT with traceState p | [B3MULTI, TRACECONTEXT] | | | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "B3MULTI,DATADOG,TRACECONTEXT no traceState | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'", + "DATADOG,TRACECONTEXT no p traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_STATE_NO_P' | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'" }) void checkW3CTraceContextOverride( List styles, @@ -156,10 +185,10 @@ void checkW3CTraceContextOverride( String datadogSpanId, String b3TraceId, String b3SpanId, - String traceState, + @ConvertWith(W3cConstantConverter.class) String traceState, String expectedTraceId, - String expectedSpanId, - String expectedParentId) { + @ConvertWith(W3cConstantConverter.class) String expectedSpanId, + @ConvertWith(W3cConstantConverter.class) String expectedParentId) { Config config = mock(Config.class); when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); DynamicConfig dynamicConfig = DynamicConfig.create().apply(); @@ -186,11 +215,11 @@ void checkW3CTraceContextOverride( } @TableTest({ - "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | traceState | expectedSpanLinks ", - "matching trace IDs no links | [DATADOG, B3MULTI, TRACECONTEXT] | '1' | '2' | '1' | 'b' | '00-00000000000000000000000000000001-123456789abcdef0-01' | 'dd=s:2,foo=1' | [] ", - "only tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '2' | 'b' | '00-00000000000000000000000000000001-123456789abcdef0-01' | 'dd=s:2,foo=1' | [TRACECONTEXT] ", - "b3 and tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '1' | 'b' | '00-00000000000000000000000000000001-123456789abcdef0-01' | 'dd=s:2,foo=1' | [B3MULTI, TRACECONTEXT]", - "datadog mismatch from tracecontext | [TRACECONTEXT, B3MULTI, DATADOG] | '2' | '2' | '1' | 'b' | '00-00000000000000000000000000000001-123456789abcdef0-01' | 'dd=s:2,foo=1' | [DATADOG] " + "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | traceState | expectedSpanLinks ", + "matching trace IDs no links | [DATADOG, B3MULTI, TRACECONTEXT] | '1' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [] ", + "only tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '2' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [TRACECONTEXT] ", + "b3 and tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [B3MULTI, TRACECONTEXT]", + "datadog mismatch from tracecontext | [TRACECONTEXT, B3MULTI, DATADOG] | '2' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [DATADOG] " }) void verifyExistenceOfSpanLinks( List styles, @@ -198,8 +227,8 @@ void verifyExistenceOfSpanLinks( String datadogSpanId, String b3TraceId, String b3SpanId, - String w3cTraceParent, - String traceState, + @ConvertWith(W3cConstantConverter.class) String w3cTraceParent, + @ConvertWith(W3cConstantConverter.class) String traceState, List expectedSpanLinks) { Config config = mock(Config.class); when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java index 2bed3a09032..0dc19b1f6fc 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java @@ -1,8 +1,11 @@ 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.core.propagation.B3HttpCodec.B3_KEY; import static datadog.trace.core.propagation.B3HttpCodec.SAMPLING_PRIORITY_KEY; +import static datadog.trace.core.propagation.B3TestHelper.spanIdOrPadded; +import static datadog.trace.core.propagation.B3TestHelper.traceIdOrPadded; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -18,7 +21,6 @@ import datadog.trace.core.DDCoreJavaSpecification; import datadog.trace.core.DDSpanContext; import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; -import datadog.trace.test.util.JavaStringUtils; import java.util.EnumSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -30,27 +32,8 @@ import org.tabletest.junit.TableTest; public class HttpInjectorTest extends DDCoreJavaSpecification { - protected boolean tracePropagationB3Padding() { - return false; - } - - private String idOrPadded(DDTraceId id) { - if (id.toHighOrderLong() == 0) { - return idOrPadded(DDSpanId.toHexString(id.toLong()), 32); - } - return id.toHexString(); - } - - private String idOrPadded(long id) { - return idOrPadded(DDSpanId.toHexString(id), 16); - } - - private String idOrPadded(String id, int size) { - if (!tracePropagationB3Padding()) { - return id.toLowerCase(); - } - return JavaStringUtils.padHexLower(id, size); + return DEFAULT_PROPAGATION_B3_PADDING_ENABLED; } @TableTest({ @@ -92,8 +75,8 @@ void injectHttpHeadersUsingStyles( DDSpanContext mockedContext = mockedContext(tracer, traceId, spanId, samplingPriority, origin, baggage); Map carrier = mock(Map.class); - String b3TraceIdHex = idOrPadded(traceId); - String b3SpanIdHex = idOrPadded(spanId); + String b3TraceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding()); + String b3SpanIdHex = spanIdOrPadded(spanId, tracePropagationB3Padding()); injector.inject(mockedContext, carrier, MapSetter.INSTANCE); @@ -161,8 +144,8 @@ void injectHttpHeadersUsingStyle( DDSpanContext mockedContext = mockedContext(tracer, traceId, spanId, samplingPriority, origin, baggage); Map carrier = mock(Map.class); - String b3TraceIdHex = idOrPadded(traceId); - String b3SpanIdHex = idOrPadded(spanId); + String b3TraceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding()); + String b3SpanIdHex = spanIdOrPadded(spanId, tracePropagationB3Padding()); injector.inject(mockedContext, carrier, MapSetter.INSTANCE); @@ -260,4 +243,11 @@ static DDSpanContext mockedContext( PropagationTags.factory() .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.usr=123")); } + + static class HttpInjectorNonPaddedTest extends HttpInjectorTest { + @Override + protected boolean tracePropagationB3Padding() { + return false; + } + } } diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index 383dea205d2..7d60e418f77 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -2,193 +2,7 @@ import static datadog.environment.JavaVirtualMachine.isJavaVersion; import static datadog.environment.JavaVirtualMachine.isJavaVersionAtLeast; -import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_HOST; -import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_WRITER_TYPE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_ANALYTICS_SAMPLE_RATE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_SAMPLE_DELAY; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_BODY_PARSING_SIZE_LIMIT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_FILE_CONTENT_BYTES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_FILE_CONTENT_COUNT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_STACK_TRACES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_STACK_TRACE_DEPTH; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_REPORTING_INBAND; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_STACK_TRACE_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_TRACE_RATE_LIMIT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_WAF_METRICS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_WAF_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_APP_LOGS_COLLECTION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CASSANDRA_KEYSPACE_STATEMENT_EXTRACTION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_AGENTLESS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_AUTO_CONFIGURATION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_BACKEND_API_TIMEOUT_MILLIS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_VERSION; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_COMMAND_TIMEOUT_MILLIS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_REMOTE_NAME; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UNSHALLOW_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UPLOAD_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_EXCLUDES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_VERSION; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_RESOURCE_FOLDER_NAMES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_SIGNAL_SERVER_HOST; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_SIGNAL_SERVER_PORT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_SOURCE_DATA_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CLIENT_IP_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CLOCK_SYNC_PERIOD; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CODE_ORIGIN_MAX_USER_FRAMES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_COUCHBASE_INTERNAL_SPANS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CWS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_CWS_TLS_REFRESH; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_EXPERIMENTAL_FEATURES_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_OPENLINEAGE_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_OPENLINEAGE_TIMEOUT_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_PARSE_SPARK_PLAN_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_STREAMS_BUCKET_DURATION; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_STREAMS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_ALWAYS_APPEND_SQL_COMMENT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_PROPAGATION_MODE_MODE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_TRACE_PREPARED_STATEMENTS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_MAX_CAPTURED_FRAMES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_ONLY_LOCAL_ROOT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_MAX_EXCEPTION_PER_SECOND; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_SOURCE_FILE_TRACKING_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DISTRIBUTED_DEBUGGER_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DOGSTATSD_PORT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DOGSTATSD_START_DELAY; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_CLASSFILE_DUMP_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_DIAGNOSTICS_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_LOCALVAR_HOISTING_LEVEL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_MAX_PAYLOAD_SIZE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_METRICS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_POLL_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_BATCH_SIZE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_VERIFY_BYTECODE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_BODY_AND_PARAMS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_BODY_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_PARAMS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_GRPC_CLIENT_ERROR_STATUSES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_GRPC_SERVER_ERROR_STATUSES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_HEALTH_METRICS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_CLIENT_ERROR_STATUSES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN; -import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_CLIENT_TAG_QUERY_STRING; -import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_SERVER_ERROR_STATUSES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_SERVER_ROUTE_BASED_NAMING; -import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_SERVER_TAG_QUERY_STRING; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_ANONYMOUS_CLASSES_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_DB_ROWS_TO_TAINT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_DEBUG_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_HARDCODED_SECRET_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_REDACTION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_REDACTION_NAME_PATTERN; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_REDACTION_VALUE_PATTERN; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_STACKTRACE_LEAK_SUPPRESS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_STACK_TRACE_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_TRUNCATION_MAX_VALUE_LENGTH; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_WEAK_CIPHER_ALGORITHMS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_WEAK_HASH_ALGORITHMS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_INJECT_DATADOG_ATTRIBUTE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_INSTRUMENTATION_SOURCE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_JAX_RS_EXCEPTION_AS_ERROR_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_LLM_OBS_AGENTLESS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_INJECTION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_BATCH_SIZE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_QUEUE_SIZE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_CARDINALITY_LIMIT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_EXPERIMENTAL_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_GRPC_PORT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_LOGS_ENDPOINT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_METRICS_ENDPOINT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_PORT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_TRACES_ENDPOINT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_TRACES_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_PARTIAL_FLUSH_MIN_SPANS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_PERF_METRICS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_PRIORITY_SAMPLING_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_PRIORITY_SAMPLING_FORCE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_PROPAGATION_STYLE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_INTEGRITY_CHECK_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_MAX_EXTRA_SERVICES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_MAX_PAYLOAD_SIZE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_POLL_INTERVAL_SECONDS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_TARGETS_KEY; -import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_TARGETS_KEY_ID; -import static datadog.trace.api.ConfigDefaults.DEFAULT_RUM_MAJOR_VERSION; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SCOPE_DEPTH_LIMIT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SCOPE_ITERATION_KEEP_ALIVE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SECURE_RANDOM; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SERVICE_DISCOVERY_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SERVICE_NAME; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SERVLET_ROOT_CONTEXT_SERVICE_NAME; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SITE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SPARK_APP_NAME_AS_SERVICE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SPARK_TASK_HISTOGRAM_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SSI_INJECTION_FORCE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_STARTUP_LOGS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_COMPRESSED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_FLUSH_THRESHOLD; -import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_FORCE_UPLOAD; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_DEBUG_REQUESTS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_HEARTBEAT_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_LOG_COLLECTION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_METRICS_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_128_BIT_TRACEID_GENERATION_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_128_BIT_TRACEID_LOGGING_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_AGENT_PORT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_AGENT_PROTOCOL_VERSION; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_ANALYTICS_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_BYTES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_ITEMS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_TAG_KEYS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_CLOUD_PAYLOAD_TAGGING_SERVICES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_EXPERIMENTAL_FEATURES_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_HTTP_RESOURCE_REMOVE_TRAILING_SLASH; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_KEEP_LATENCY_THRESHOLD_MS; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_LONG_RUNNING_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_LONG_RUNNING_FLUSH_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_POST_PROCESSING_TIMEOUT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_PROPAGATION_BEHAVIOR_EXTRACT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_PROPAGATION_EXTRACT_FIRST; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_PROPAGATION_STYLE; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_RATE_LIMIT; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_REPORT_HOSTNAME; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_RESOLVER_ENABLED; -import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_X_DATADOG_TAGS_MAX_LENGTH; -import static datadog.trace.api.ConfigDefaults.DEFAULT_WEBSOCKET_MESSAGES_INHERIT_SAMPLING; -import static datadog.trace.api.ConfigDefaults.DEFAULT_WEBSOCKET_MESSAGES_SEPARATE_TRACES; -import static datadog.trace.api.ConfigDefaults.DEFAULT_WEBSOCKET_TAG_SESSION_ID; +import static datadog.trace.api.ConfigDefaults.*; import static datadog.trace.api.ConfigSetting.NON_DEFAULT_SEQ_ID; import static datadog.trace.api.DDTags.APM_ENABLED; import static datadog.trace.api.DDTags.HOST_TAG; @@ -1840,7 +1654,7 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins DEFAULT_PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED); tracePropagationStyleB3PaddingEnabled = - isEnabled(true, TRACE_PROPAGATION_STYLE, ".b3.padding.enabled"); + isEnabled(DEFAULT_PROPAGATION_B3_PADDING_ENABLED, TRACE_PROPAGATION_STYLE, ".b3.padding.enabled"); TracePropagationBehaviorExtract tmpTracePropagationBehaviorExtract; try { diff --git a/utils/test-utils/src/main/groovy/datadog/trace/test/util/StringUtils.groovy b/utils/test-utils/src/main/groovy/datadog/trace/test/util/StringUtils.groovy deleted file mode 100644 index 6b1b4c0c00a..00000000000 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/StringUtils.groovy +++ /dev/null @@ -1,25 +0,0 @@ -package datadog.trace.test.util - -class StringUtils { - - static String padHexLower(String hex, int size) { - hex = hex.toLowerCase(Locale.ROOT) - int left = size - hex.length() - if (size > 0) { - return "${'0' * left}${hex}" - } - return hex - } - - static String trimHex(String hex) { - int length = hex.length() - int i = 0 - while (i < length && hex.charAt(i) == '0') { - i++ - } - if (i == length) { - return "0" - } - return hex.substring(i, length) - } -} diff --git a/utils/test-utils/src/main/java/datadog/trace/test/util/JavaStringUtils.java b/utils/test-utils/src/main/java/datadog/trace/test/util/JavaStringUtils.java deleted file mode 100644 index 5a1c91d050e..00000000000 --- a/utils/test-utils/src/main/java/datadog/trace/test/util/JavaStringUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package datadog.trace.test.util; - -import java.util.Locale; - -/** - * Java port of {@link StringUtils}. Will replace {@code StringUtils.groovy} once all Groovy callers - * have been migrated to Java. - */ -public final class JavaStringUtils { - - private JavaStringUtils() {} - - public static String padHexLower(String hex, int size) { - String lower = hex.toLowerCase(Locale.ROOT); - int diff = size - lower.length(); - if (size <= 0 || 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(); - } - - public 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); - } -} From 80efb79fa38205eaa82dc7415502c467a12d9e72 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 14:19:22 +0200 Subject: [PATCH 02/15] fix(core): Manually cleaning up AI code --- .../core/propagation/HttpExtractorTest.java | 2 +- .../HttpInjectorB3PaddingTest.java | 2 +- .../core/propagation/HttpInjectorTest.java | 204 ++++++++++-------- .../trace/core/propagation/MapSetter.java | 15 -- .../core/propagation/W3CHttpInjectorTest.java | 12 +- .../propagation/XRayHttpInjectorTest.java | 6 +- 6 files changed, 122 insertions(+), 119 deletions(-) delete mode 100644 dd-trace-core/src/test/java/datadog/trace/core/propagation/MapSetter.java diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java index 646492db74d..629e04b3889 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java @@ -35,7 +35,7 @@ import org.tabletest.junit.TableTest; import org.tabletest.junit.TypeConverter; -public class HttpExtractorTest extends DDJavaSpecification { +class HttpExtractorTest extends DDJavaSpecification { private static final String W3C_TRACE_ID = "00000000000000000000000000000001"; private static final String W3C_SPAN_ID = "123456789abcdef0"; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorB3PaddingTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorB3PaddingTest.java index d041401e2d5..c65fc25cfa6 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorB3PaddingTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorB3PaddingTest.java @@ -1,6 +1,6 @@ package datadog.trace.core.propagation; -public class HttpInjectorB3PaddingTest extends HttpInjectorTest { +class HttpInjectorB3PaddingTest extends HttpInjectorTest { @Override protected boolean tracePropagationB3Padding() { return true; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java index 0dc19b1f6fc..6d226c82b1c 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java @@ -6,9 +6,12 @@ import static datadog.trace.core.propagation.B3HttpCodec.SAMPLING_PRIORITY_KEY; import static datadog.trace.core.propagation.B3TestHelper.spanIdOrPadded; import static datadog.trace.core.propagation.B3TestHelper.traceIdOrPadded; +import static datadog.trace.core.propagation.DatadogHttpCodec.DATADOG_TAGS_KEY; +import static datadog.trace.core.propagation.PropagationTags.HeaderType.DATADOG; +import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonList; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import datadog.trace.api.Config; @@ -21,17 +24,31 @@ import datadog.trace.core.DDCoreJavaSpecification; import datadog.trace.core.DDSpanContext; import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; -import java.util.EnumSet; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.converter.ConvertWith; import org.tabletest.junit.TableTest; -public class HttpInjectorTest extends DDCoreJavaSpecification { +class HttpInjectorTest extends DDCoreJavaSpecification { + private CoreTracer tracer; + + @BeforeEach + void setup() { + ListWriter writer = new ListWriter(); + tracer = tracerBuilder().writer(writer).build(); + } + + @AfterEach + void tearDown() { + tracer.close(); + } + protected boolean tracePropagationB3Padding() { return DEFAULT_PROPAGATION_B3_PADDING_ENABLED; } @@ -53,62 +70,58 @@ protected boolean tracePropagationB3Padding() { "B3MULTI only keep saipan | [B3MULTI] | PrioritySampling.SAMPLER_KEEP | 'saipan'", "B3MULTI,DATADOG keep saipan | [B3MULTI, DATADOG] | PrioritySampling.SAMPLER_KEEP | 'saipan'" }) - @SuppressWarnings("unchecked") void injectHttpHeadersUsingStyles( List styles, @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, String origin) { - Set styleSet = new LinkedHashSet<>(styles); - Config config = mock(Config.class); - when(config.getTracePropagationStylesToInject()).thenReturn(styleSet); - when(config.isTracePropagationStyleB3PaddingEnabled()).thenReturn(tracePropagationB3Padding()); - HttpCodec.Injector injector = - HttpCodec.createInjector( - config, config.getTracePropagationStylesToInject(), new LinkedHashMap<>()); + HttpCodec.Injector injector = createInjector(styles, emptyMap()); + DDTraceId traceId = DDTraceId.ONE; long spanId = 2; - ListWriter writer = new ListWriter(); - CoreTracer tracer = tracerBuilder().writer(writer).build(); - Map baggage = new LinkedHashMap<>(); + Map baggage = new HashMap<>(); baggage.put("k1", "v1"); baggage.put("k2", "v2"); - DDSpanContext mockedContext = - mockedContext(tracer, traceId, spanId, samplingPriority, origin, baggage); - Map carrier = mock(Map.class); - String b3TraceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding()); - String b3SpanIdHex = spanIdOrPadded(spanId, tracePropagationB3Padding()); + DDSpanContext mockedContext = mockedContext(traceId, spanId, samplingPriority, origin, baggage); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + Map carrier = new HashMap<>(); + injector.inject(mockedContext, carrier, Map::put); - if (styleSet.contains(TracePropagationStyle.DATADOG)) { - verify(carrier).put(DatadogHttpCodec.TRACE_ID_KEY, traceId.toString()); - verify(carrier).put(DatadogHttpCodec.SPAN_ID_KEY, Long.toString(spanId)); - verify(carrier).put(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k1", "v1"); - verify(carrier).put(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k2", "v2"); + String b3TraceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding()); + String b3SpanIdHex = spanIdOrPadded(spanId, tracePropagationB3Padding()); + int expectedSize = 0; + if (styles.contains(TracePropagationStyle.DATADOG)) { + assertEquals(traceId.toString(), carrier.get(DatadogHttpCodec.TRACE_ID_KEY)); + assertEquals(Long.toString(spanId), carrier.get(DatadogHttpCodec.SPAN_ID_KEY)); + assertEquals("v1", carrier.get(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k1")); + assertEquals("v2", carrier.get(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k2")); + assertEquals("_dd.p.usr=123", carrier.get(DATADOG_TAGS_KEY)); + expectedSize += 5; if (samplingPriority != UNSET) { - verify(carrier) - .put(DatadogHttpCodec.SAMPLING_PRIORITY_KEY, Integer.toString(samplingPriority)); + assertEquals(Integer.toString(samplingPriority), carrier.get(DatadogHttpCodec.SAMPLING_PRIORITY_KEY)); + expectedSize++; } if (origin != null) { - verify(carrier).put(DatadogHttpCodec.ORIGIN_KEY, origin); + assertEquals(origin, carrier.get(DatadogHttpCodec.ORIGIN_KEY)); + expectedSize++; } - verify(carrier).put("x-datadog-tags", "_dd.p.usr=123"); } - if (styleSet.contains(TracePropagationStyle.B3MULTI)) { - verify(carrier).put(B3HttpCodec.TRACE_ID_KEY, b3TraceIdHex); - verify(carrier).put(B3HttpCodec.SPAN_ID_KEY, b3SpanIdHex); + if (styles.contains(TracePropagationStyle.B3MULTI)) { + assertEquals(b3TraceIdHex, carrier.get(B3HttpCodec.TRACE_ID_KEY)); + assertEquals(b3SpanIdHex, carrier.get(B3HttpCodec.SPAN_ID_KEY)); + expectedSize += 2; if (samplingPriority != UNSET) { - verify(carrier).put(SAMPLING_PRIORITY_KEY, "1"); + assertEquals("1", carrier.get(SAMPLING_PRIORITY_KEY)); + expectedSize++; } } - if (styleSet.contains(TracePropagationStyle.B3SINGLE)) { - if (samplingPriority != UNSET) { - verify(carrier).put(B3_KEY, b3TraceIdHex + "-" + b3SpanIdHex + "-1"); - } else { - verify(carrier).put(B3_KEY, b3TraceIdHex + "-" + b3SpanIdHex); - } + if (styles.contains(TracePropagationStyle.B3SINGLE)) { + String expectedB3Value = samplingPriority != UNSET + ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" + : b3TraceIdHex + "-" + b3SpanIdHex; + assertEquals(expectedB3Value, carrier.get(B3_KEY)); + expectedSize++; } - verifyNoMoreInteractions(carrier); + assertEquals(expectedSize, carrier.size()); } @TableTest({ @@ -123,60 +136,60 @@ void injectHttpHeadersUsingStyles( "B3MULTI keep no origin | B3MULTI | PrioritySampling.SAMPLER_KEEP | ", "B3MULTI keep saipan | B3MULTI | PrioritySampling.SAMPLER_KEEP | 'saipan'" }) - @SuppressWarnings("unchecked") void injectHttpHeadersUsingStyle( TracePropagationStyle style, @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, String origin) { - Config config = mock(Config.class); - when(config.isTracePropagationStyleB3PaddingEnabled()).thenReturn(tracePropagationB3Padding()); - Map mapping = new LinkedHashMap<>(); + Map mapping = new HashMap<>(); mapping.put("some-baggage-item", "SOME_HEADER"); - HttpCodec.Injector injector = HttpCodec.createInjector(config, EnumSet.of(style), mapping); + HttpCodec.Injector injector = createInjector(singletonList(style), mapping); + DDTraceId traceId = DDTraceId.ONE; long spanId = 2; - ListWriter writer = new ListWriter(); - CoreTracer tracer = tracerBuilder().writer(writer).build(); Map baggage = new LinkedHashMap<>(); baggage.put("k1", "v1"); baggage.put("k2", "v2"); baggage.put("some-baggage-item", "some-baggage-value"); - DDSpanContext mockedContext = - mockedContext(tracer, traceId, spanId, samplingPriority, origin, baggage); - Map carrier = mock(Map.class); - String b3TraceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding()); - String b3SpanIdHex = spanIdOrPadded(spanId, tracePropagationB3Padding()); + DDSpanContext mockedContext = mockedContext(traceId, spanId, samplingPriority, origin, baggage); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + Map carrier = new HashMap<>(); + injector.inject(mockedContext, carrier, Map::put); + String b3TraceIdHex = traceIdOrPadded(traceId, tracePropagationB3Padding()); + String b3SpanIdHex = spanIdOrPadded(spanId, tracePropagationB3Padding()); + int expectedSize = 0; if (style == TracePropagationStyle.DATADOG) { - verify(carrier).put(DatadogHttpCodec.TRACE_ID_KEY, traceId.toString()); - verify(carrier).put(DatadogHttpCodec.SPAN_ID_KEY, Long.toString(spanId)); - verify(carrier).put(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k1", "v1"); - verify(carrier).put(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k2", "v2"); - verify(carrier).put("SOME_HEADER", "some-baggage-value"); + assertEquals(traceId.toString(), carrier.get(DatadogHttpCodec.TRACE_ID_KEY)); + assertEquals(Long.toString(spanId), carrier.get(DatadogHttpCodec.SPAN_ID_KEY)); + assertEquals("v1", carrier.get(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k1")); + assertEquals("v2", carrier.get(DatadogHttpCodec.OT_BAGGAGE_PREFIX + "k2")); + assertEquals("some-baggage-value", carrier.get("SOME_HEADER")); + assertEquals("_dd.p.usr=123", carrier.get(DATADOG_TAGS_KEY)); + expectedSize = 6; if (samplingPriority != UNSET) { - verify(carrier) - .put(DatadogHttpCodec.SAMPLING_PRIORITY_KEY, Integer.toString(samplingPriority)); + assertEquals(Integer.toString(samplingPriority), carrier.get(DatadogHttpCodec.SAMPLING_PRIORITY_KEY)); + expectedSize++; } if (origin != null) { - verify(carrier).put(DatadogHttpCodec.ORIGIN_KEY, origin); + assertEquals(origin, carrier.get(DatadogHttpCodec.ORIGIN_KEY)); + expectedSize++; } - verify(carrier).put("x-datadog-tags", "_dd.p.usr=123"); } else if (style == TracePropagationStyle.B3MULTI) { - verify(carrier).put(B3HttpCodec.TRACE_ID_KEY, b3TraceIdHex); - verify(carrier).put(B3HttpCodec.SPAN_ID_KEY, b3SpanIdHex); + assertEquals(b3TraceIdHex, carrier.get(B3HttpCodec.TRACE_ID_KEY)); + assertEquals(b3SpanIdHex, carrier.get(B3HttpCodec.SPAN_ID_KEY)); + expectedSize = 2; if (samplingPriority != UNSET) { - verify(carrier).put(SAMPLING_PRIORITY_KEY, "1"); + assertEquals("1", carrier.get(SAMPLING_PRIORITY_KEY)); + expectedSize++; } } else if (style == TracePropagationStyle.B3SINGLE) { - if (samplingPriority != UNSET) { - verify(carrier).put(B3_KEY, b3TraceIdHex + "-" + b3SpanIdHex + "-1"); - } else { - verify(carrier).put(B3_KEY, b3TraceIdHex + "-" + b3SpanIdHex); - } + String expectedB3Value = samplingPriority != UNSET + ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" + : b3TraceIdHex + "-" + b3SpanIdHex; + assertEquals(expectedB3Value, carrier.get(B3_KEY)); + expectedSize++; } - verifyNoMoreInteractions(carrier); + assertEquals(expectedSize, carrier.size()); } @TableTest({ @@ -185,11 +198,8 @@ void injectHttpHeadersUsingStyle( "tracecontext encoding | TRACECONTEXT", "haystack encoding | HAYSTACK " }) - @SuppressWarnings("unchecked") void encodeBaggageInHttpHeadersUsingStyle(TracePropagationStyle style) { - Config config = mock(Config.class); - when(config.isTracePropagationStyleB3PaddingEnabled()).thenReturn(tracePropagationB3Padding()); - Map baggage = new LinkedHashMap<>(); + Map baggage = new HashMap<>(); baggage.put("alpha", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); baggage.put("num", "01234567890"); baggage.put("whitespace", "ab \tcd"); @@ -197,25 +207,34 @@ void encodeBaggageInHttpHeadersUsingStyle(TracePropagationStyle style) { baggage.put("excluded", "ab',:\\cd"); Map mapping = baggage.keySet().stream().collect(Collectors.toMap(key -> key, key -> key)); - HttpCodec.Injector injector = HttpCodec.createInjector(config, EnumSet.of(style), mapping); + HttpCodec.Injector injector = createInjector(singletonList(style), mapping); + DDTraceId traceId = DDTraceId.ONE; long spanId = 2; - ListWriter writer = new ListWriter(); - CoreTracer tracer = tracerBuilder().writer(writer).build(); - DDSpanContext mockedContext = mockedContext(tracer, traceId, spanId, UNSET, null, baggage); - Map carrier = mock(Map.class); + DDSpanContext mockedContext = mockedContext(traceId, spanId, UNSET, null, baggage); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + Map carrier = new HashMap<>(); + injector.inject(mockedContext, carrier, Map::put); - verify(carrier).put("alpha", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); - verify(carrier).put("num", "01234567890"); - verify(carrier).put("whitespace", "ab%20%09cd"); - verify(carrier).put("specials", "ab.-*_cd"); - verify(carrier).put("excluded", "ab%27%2C%3A%5Ccd"); + assertEquals("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", carrier.get("alpha")); + assertEquals("01234567890", carrier.get("num")); + assertEquals("ab%20%09cd", carrier.get("whitespace")); + assertEquals("ab.-*_cd", carrier.get("specials")); + assertEquals("ab%27%2C%3A%5Ccd", carrier.get("excluded")); + } + + HttpCodec.Injector createInjector(List overriddenStyles, Map invertedBaggageMapping) { + Config config = mock(Config.class); + if (overriddenStyles != null) { + LinkedHashSet orderedSet = new LinkedHashSet<>(overriddenStyles); + when(config.getTracePropagationStylesToInject()).thenReturn(orderedSet); + } + when(config.isTracePropagationStyleB3PaddingEnabled()).thenReturn(tracePropagationB3Padding()); + return HttpCodec.createInjector( + config, config.getTracePropagationStylesToInject(), invertedBaggageMapping); } - static DDSpanContext mockedContext( - CoreTracer tracer, + DDSpanContext mockedContext( DDTraceId traceId, long spanId, int samplingPriority, @@ -235,13 +254,12 @@ static DDSpanContext mockedContext( false, "fakeType", 0, - tracer.createTraceCollector(DDTraceId.ONE), + this.tracer.createTraceCollector(DDTraceId.ONE), null, null, NoopPathwayContext.INSTANCE, false, - PropagationTags.factory() - .fromHeaderValue(PropagationTags.HeaderType.DATADOG, "_dd.p.usr=123")); + PropagationTags.factory().fromHeaderValue(DATADOG, "_dd.p.usr=123")); } static class HttpInjectorNonPaddedTest extends HttpInjectorTest { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/MapSetter.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/MapSetter.java deleted file mode 100644 index fda7aa39ccf..00000000000 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/MapSetter.java +++ /dev/null @@ -1,15 +0,0 @@ -package datadog.trace.core.propagation; - -import datadog.context.propagation.CarrierSetter; -import java.util.Map; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -public class MapSetter implements CarrierSetter> { - public static final MapSetter INSTANCE = new MapSetter(); - - @Override - public void set(Map carrier, String key, String value) { - carrier.put(key, value); - } -} diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java index 0ffdf1e6e6c..3dbe187f7a3 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java @@ -74,7 +74,7 @@ void injectHttpHeaders( expected.put(OT_BAGGAGE_PREFIX + "k2", "v2"); expected.put("SOME_CUSTOM_HEADER", "some-value"); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + injector.inject(mockedContext, carrier, Map::put); assertEquals(expected, carrier); @@ -102,7 +102,7 @@ void injectHttpHeadersWithEndToEnd() { mockedContext.beginEndToEnd(); Map carrier = new LinkedHashMap<>(); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + injector.inject(mockedContext, carrier, Map::put); Map expected = new LinkedHashMap<>(); expected.put(TRACE_PARENT_KEY, buildTraceParent("1", "2", PrioritySampling.UNSET)); @@ -135,7 +135,7 @@ void injectTheDecisionMakerTag() { mockedContext.setSamplingPriority(PrioritySampling.USER_KEEP, MANUAL); Map carrier = new LinkedHashMap<>(); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + injector.inject(mockedContext, carrier, Map::put); Map expected = new LinkedHashMap<>(); expected.put(TRACE_PARENT_KEY, buildTraceParent("1", "2", PrioritySampling.USER_KEEP)); @@ -158,7 +158,7 @@ void updateLastParentIdOnChildSpan() { long rootSpanId = rootSpan.getSpanId(); AgentScope rootScope = tracer.activateSpan(rootSpan); - injector.inject((DDSpanContext) rootSpan.context(), carrier, MapSetter.INSTANCE); + injector.inject((DDSpanContext) rootSpan.context(), carrier, Map::put); long lastParentId = extractLastParentId(carrier); // trace state has root span id as last parent @@ -168,7 +168,7 @@ void updateLastParentIdOnChildSpan() { AgentSpan childSpan = tracer.startSpan("test", "child"); long childSpanId = childSpan.getSpanId(); carrier.clear(); - injector.inject((DDSpanContext) childSpan.context(), carrier, MapSetter.INSTANCE); + injector.inject((DDSpanContext) childSpan.context(), carrier, Map::put); lastParentId = extractLastParentId(carrier); // trace state has child span id as last parent @@ -177,7 +177,7 @@ void updateLastParentIdOnChildSpan() { // injecting root span again childSpan.finish(); carrier.clear(); - injector.inject((DDSpanContext) rootSpan.context(), carrier, MapSetter.INSTANCE); + injector.inject((DDSpanContext) rootSpan.context(), carrier, Map::put); lastParentId = extractLastParentId(carrier); // trace state has root span is as last parent again diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java index dc7a123f262..3995c9942ec 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java @@ -74,7 +74,7 @@ void injectHttpHeaders( Map carrier = mock(Map.class); clearInvocations(timeSource); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + injector.inject(mockedContext, carrier, Map::put); verify(timeSource).getCurrentTimeMillis(); verify(carrier).put("X-Amzn-Trace-Id", expectedTraceHeader); @@ -125,7 +125,7 @@ void injectHttpHeadersWithExtractedOriginal( Map carrier = mock(Map.class); clearInvocations(timeSource); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + injector.inject(mockedContext, carrier, Map::put); verify(timeSource).getCurrentTimeMillis(); verify(carrier).put("X-Amzn-Trace-Id", expectedTraceHeader); @@ -159,7 +159,7 @@ void injectHttpHeadersWithEndToEnd() { Map carrier = mock(Map.class); mockedContext.beginEndToEnd(); - injector.inject(mockedContext, carrier, MapSetter.INSTANCE); + injector.inject(mockedContext, carrier, Map::put); // 2 calls: CoreTracer constructor + beginEndToEnd() verify(timeSource, times(2)).getCurrentTimeNanos(); From 102cb742ee223d4267ea56fb84fb58ec783dcd65 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 14:48:02 +0200 Subject: [PATCH 03/15] fix(core): Manually cleaning up AI code --- .../datadog/trace/core/propagation/B3HttpExtractorTest.java | 3 ++- .../java/datadog/trace/core/propagation/HttpExtractorTest.java | 2 +- .../java/datadog/trace/core/propagation/HttpInjectorTest.java | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java index d171f282323..3553f41a919 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java @@ -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; @@ -33,7 +34,7 @@ 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"; diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java index 629e04b3889..321a73856d4 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java @@ -46,7 +46,7 @@ class HttpExtractorTest extends DDJavaSpecification { private static final String W3C_SPAN_ID_LSTR = Long.toString(DDSpanId.fromHex(W3C_SPAN_ID)); @TypeConverter - public static TracePropagationStyle parseTracePropagationStyle(String value) { + static TracePropagationStyle parseTracePropagationStyle(String value) { String name = value.trim(); if (name.startsWith("TracePropagationStyle.")) { name = name.substring("TracePropagationStyle.".length()); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java index 6d226c82b1c..837a344659f 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java @@ -25,7 +25,6 @@ import datadog.trace.core.DDSpanContext; import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -146,7 +145,7 @@ void injectHttpHeadersUsingStyle( DDTraceId traceId = DDTraceId.ONE; long spanId = 2; - Map baggage = new LinkedHashMap<>(); + Map baggage = new HashMap<>(); baggage.put("k1", "v1"); baggage.put("k2", "v2"); baggage.put("some-baggage-item", "some-baggage-value"); From 6992c2b9d0bac807c683b584d88de08f36d9e36c Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 16:24:12 +0200 Subject: [PATCH 04/15] fix(core): Manually cleaning up AI code --- .../java/datadog/trace/core/CoreTracer.java | 6 +- .../trace/core/propagation/B3TestHelper.java | 3 +- .../propagation/DatadogHttpExtractorTest.java | 59 ++++--- .../propagation/DatadogHttpInjectorTest.java | 15 +- .../HaystackHttpExtractorTest.java | 24 +-- .../propagation/HaystackHttpInjectorTest.java | 33 ++-- .../core/propagation/HttpExtractorTest.java | 86 ++++----- .../core/propagation/HttpInjectorTest.java | 25 ++- .../propagation/NoneHttpExtractorTest.java | 166 +++++++++--------- .../core/propagation/W3CHttpInjectorTest.java | 17 +- .../propagation/XRayHttpInjectorTest.java | 21 +-- .../main/java/datadog/trace/api/Config.java | 3 +- .../utils/tabletest/TraceIdConverter.java | 46 +++++ 13 files changed, 291 insertions(+), 213 deletions(-) create mode 100644 utils/junit-utils/src/main/java/datadog/trace/junit/utils/tabletest/TraceIdConverter.java diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 49d808ea835..375480a8792 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -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; @@ -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(); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java index 3cc2b1de26e..f8867c2b1cf 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3TestHelper.java @@ -3,7 +3,8 @@ import datadog.trace.api.DDTraceId; /** - * This class contains helper methods for formatting trace and span identifiers for B3 propagation tests. + * This class contains helper methods for formatting trace and span identifiers for B3 propagation + * tests. */ public final class B3TestHelper { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java index 5262bebd1b3..495e9a20a40 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java @@ -7,14 +7,13 @@ import static datadog.trace.api.sampling.PrioritySampling.UNSET; import static datadog.trace.bootstrap.ActiveSubsystems.APPSEC_ACTIVE; import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap; -import static datadog.trace.core.CoreTracer.TRACE_ID_MAX; import static datadog.trace.core.propagation.DatadogHttpCodec.DATADOG_TAGS_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.ORIGIN_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.OT_BAGGAGE_PREFIX; import static datadog.trace.core.propagation.DatadogHttpCodec.SAMPLING_PRIORITY_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.SPAN_ID_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.TRACE_ID_KEY; -import static java.math.BigInteger.ONE; +import static datadog.trace.junit.utils.tabletest.TraceIdConverter.TRACE_ID_MAX_PLUS_1; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -32,6 +31,7 @@ import datadog.trace.bootstrap.instrumentation.api.TagContext; import datadog.trace.junit.utils.config.WithConfig; import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; +import datadog.trace.junit.utils.tabletest.TraceIdConverter; import datadog.trace.test.util.DDJavaSpecification; import java.util.HashMap; import java.util.Map; @@ -79,15 +79,15 @@ void teardown() { } @TableTest({ - "scenario | traceId | spanId | samplingPriority | origin ", - "unset no origin | '1' | '2' | PrioritySampling.UNSET | ", - "keep with origin | '2' | '3' | PrioritySampling.SAMPLER_KEEP | 'saipan'", - "uint64 max unset | '18446744073709551615' | '18446744073709551614' | PrioritySampling.UNSET | 'saipan'", - "uint64 max-1 keep | '18446744073709551614' | '18446744073709551615' | PrioritySampling.SAMPLER_KEEP | 'saipan'" + "scenario | traceId | spanId | samplingPriority | origin ", + "unset no origin | '1' | '2' | PrioritySampling.UNSET | ", + "keep with origin | '2' | '3' | PrioritySampling.SAMPLER_KEEP | 'saipan'", + "uint64 max unset | 'TRACE_ID_MAX' | 'TRACE_ID_MAX-1' | PrioritySampling.UNSET | 'saipan'", + "uint64 max-1 keep | 'TRACE_ID_MAX-1' | 'TRACE_ID_MAX' | PrioritySampling.SAMPLER_KEEP | 'saipan'" }) void extractHttpHeaders( - String traceId, - String spanId, + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, String origin) { Map headers = new HashMap<>(); @@ -314,9 +314,8 @@ void extractHttpHeadersWithInvalidNonNumericId() { @Test void extractHttpHeadersWithOutOfRangeTraceId() { - String outOfRangeTraceId = TRACE_ID_MAX.add(ONE).toString(); Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), outOfRangeTraceId); + headers.put(TRACE_ID_KEY.toUpperCase(), TRACE_ID_MAX_PLUS_1); headers.put(SPAN_ID_KEY.toUpperCase(), "0"); headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); @@ -342,17 +341,20 @@ void extractHttpHeadersWithOutOfRangeSpanId() { } @TableTest({ - "scenario | traceId | spanId | expectExtraction", - "negative traceId | '-1' | '1' | false ", - "negative spanId | '1' | '-1' | false ", - "zero traceId | '0' | '1' | false ", - "zero spanId | '1' | '0' | true ", - "uint64 max traceId | '18446744073709551615' | '1' | true ", - "out-of-range traceId | '18446744073709551616' | '1' | false ", - "uint64 max spanId | '1' | '18446744073709551615' | true ", - "out-of-range spanId | '1' | '18446744073709551616' | false " + "scenario | traceId | spanId | expectExtraction", + "negative traceId | '-1' | '1' | false ", + "negative spanId | '1' | '-1' | false ", + "zero traceId | '0' | '1' | false ", + "zero spanId | '1' | '0' | true ", + "uint64 max traceId | 'TRACE_ID_MAX' | '1' | true ", + "out-of-range traceId | 'TRACE_ID_MAX+1' | '1' | false ", + "uint64 max spanId | '1' | 'TRACE_ID_MAX' | true ", + "out-of-range spanId | '1' | 'TRACE_ID_MAX+1' | false " }) - void moreIdRangeValidation(String traceId, String spanId, boolean expectExtraction) { + void moreIdRangeValidation( + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, + boolean expectExtraction) { Map headers = new HashMap<>(); headers.put(TRACE_ID_KEY.toUpperCase(), traceId); headers.put(SPAN_ID_KEY.toUpperCase(), spanId); @@ -401,13 +403,16 @@ void extractHttpHeadersWithEndToEnd(String traceId, String spanId, long endToEnd } @TableTest({ - "scenario | traceId | spanId | ctxCreated", - "negative traceId | '-1' | '1' | false ", - "negative spanId | '1' | '-1' | false ", - "zero traceId | '0' | '1' | true ", - "uint64 max-1 ids | '18446744073709551614' | '18446744073709551614' | true " + "scenario | traceId | spanId | ctxCreated", + "negative traceId | '-1' | '1' | false ", + "negative spanId | '1' | '-1' | false ", + "zero traceId | '0' | '1' | true ", + "uint64 max-1 ids | 'TRACE_ID_MAX-1' | 'TRACE_ID_MAX-1' | true " }) - void baggageIsMappedOnContextCreation(String traceId, String spanId, boolean ctxCreated) { + void baggageIsMappedOnContextCreation( + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, + boolean ctxCreated) { Map headers = new HashMap<>(); headers.put(TRACE_ID_KEY.toUpperCase(), traceId); headers.put(SPAN_ID_KEY.toUpperCase(), spanId); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java index 1369bc5fd82..b76f8f810d1 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpInjectorTest.java @@ -23,6 +23,7 @@ import datadog.trace.core.DDCoreJavaSpecification; import datadog.trace.core.DDSpanContext; import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; +import datadog.trace.junit.utils.tabletest.TraceIdConverter; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.AfterEach; @@ -50,15 +51,15 @@ void tearDown() { } @TableTest({ - "scenario | traceId | spanId | samplingPriority | origin ", - "unset no origin | '1' | '2' | PrioritySampling.UNSET | ", - "keep with origin | '1' | '2' | PrioritySampling.SAMPLER_KEEP | 'saipan'", - "uint64 max unset | '18446744073709551615' | '18446744073709551614' | PrioritySampling.UNSET | 'saipan'", - "uint64 max-1 keep | '18446744073709551614' | '18446744073709551615' | PrioritySampling.SAMPLER_KEEP | " + "scenario | traceId | spanId | samplingPriority | origin ", + "unset no origin | '1' | '2' | PrioritySampling.UNSET | ", + "keep with origin | '1' | '2' | PrioritySampling.SAMPLER_KEEP | 'saipan'", + "uint64 max unset | 'TRACE_ID_MAX' | 'TRACE_ID_MAX-1' | PrioritySampling.UNSET | 'saipan'", + "uint64 max-1 keep | 'TRACE_ID_MAX-1' | 'TRACE_ID_MAX' | PrioritySampling.SAMPLER_KEEP | " }) void injectHttpHeaders( - String traceId, - String spanId, + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, String origin) { Map baggage = new HashMap<>(); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java index 524ca59fa61..111fbc0c2d5 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java @@ -4,13 +4,12 @@ import static datadog.trace.api.sampling.PrioritySampling.SAMPLER_KEEP; import static datadog.trace.bootstrap.ActiveSubsystems.APPSEC_ACTIVE; import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap; -import static datadog.trace.core.CoreTracer.TRACE_ID_MAX; import static datadog.trace.core.propagation.HaystackHttpCodec.HAYSTACK_SPAN_ID_BAGGAGE_KEY; import static datadog.trace.core.propagation.HaystackHttpCodec.HAYSTACK_TRACE_ID_BAGGAGE_KEY; import static datadog.trace.core.propagation.HaystackHttpCodec.OT_BAGGAGE_PREFIX; import static datadog.trace.core.propagation.HaystackHttpCodec.SPAN_ID_KEY; import static datadog.trace.core.propagation.HaystackHttpCodec.TRACE_ID_KEY; -import static java.math.BigInteger.ONE; +import static datadog.trace.junit.utils.tabletest.TraceIdConverter.TRACE_ID_MAX_MINUS_1; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -24,12 +23,14 @@ import datadog.trace.api.DynamicConfig; import datadog.trace.bootstrap.instrumentation.api.TagContext; import datadog.trace.junit.utils.config.WithConfig; +import datadog.trace.junit.utils.tabletest.TraceIdConverter; import datadog.trace.test.util.DDJavaSpecification; import java.util.HashMap; 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") @@ -70,13 +71,17 @@ void teardown() { } @TableTest({ - "scenario | traceId | spanId | traceUuid | spanUuid ", - "small ids | '1' | '2' | '44617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", - "incrementing ids | '2' | '3' | '44617461-646f-6721-0000-000000000002' | '44617461-646f-6721-0000-000000000003'", - "uint64 max | '18446744073709551615' | '18446744073709551609' | '44617461-646f-6721-ffff-ffffffffffff' | '44617461-646f-6721-ffff-fffffffffff9'", - "uint64 max-1 | '18446744073709551614' | '18446744073709551608' | '44617461-646f-6721-ffff-fffffffffffe' | '44617461-646f-6721-ffff-fffffffffff8'" + "scenario | traceId | spanId | traceUuid | spanUuid ", + "small ids | '1' | '2' | '44617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", + "incrementing ids | '2' | '3' | '44617461-646f-6721-0000-000000000002' | '44617461-646f-6721-0000-000000000003'", + "uint64 max | 'TRACE_ID_MAX' | '18446744073709551609' | '44617461-646f-6721-ffff-ffffffffffff' | '44617461-646f-6721-ffff-fffffffffff9'", + "uint64 max-1 | 'TRACE_ID_MAX-1' | '18446744073709551608' | '44617461-646f-6721-ffff-fffffffffffe' | '44617461-646f-6721-ffff-fffffffffff8'" }) - void extractHttpHeaders(String traceId, String spanId, String traceUuid, String spanUuid) { + void extractHttpHeaders( + @ConvertWith(TraceIdConverter.class) String traceId, + String spanId, + String traceUuid, + String spanUuid) { Map headers = new HashMap<>(); headers.put("", "empty key"); headers.put(TRACE_ID_KEY.toUpperCase(), traceUuid); @@ -192,9 +197,8 @@ void extractHttpHeadersWithInvalidNonNumericId() { @Test void extractHttpHeadersWithOutOfRangeTraceId() { - String outOfRangeTraceId = TRACE_ID_MAX.add(ONE).toString(); Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), outOfRangeTraceId); + headers.put(TRACE_ID_KEY.toUpperCase(), TRACE_ID_MAX_MINUS_1); headers.put(SPAN_ID_KEY.toUpperCase(), "0"); headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpInjectorTest.java index 7e5b02e76f5..e8b5f1151fe 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpInjectorTest.java @@ -19,10 +19,12 @@ import datadog.trace.core.CoreTracer; import datadog.trace.core.DDCoreJavaSpecification; import datadog.trace.core.DDSpanContext; +import datadog.trace.junit.utils.tabletest.TraceIdConverter; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.params.converter.ConvertWith; import org.tabletest.junit.TableTest; class HaystackHttpInjectorTest extends DDCoreJavaSpecification { @@ -47,13 +49,17 @@ void tearDown() { } @TableTest({ - "scenario | traceId | spanId | traceUuid | spanUuid ", - "small ids | '1' | '2' | '44617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", - "small ids duplicate | '1' | '2' | '44617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", - "uint64 max trace | '18446744073709551615' | '18446744073709551614' | '44617461-646f-6721-ffff-ffffffffffff' | '44617461-646f-6721-ffff-fffffffffffe'", - "uint64 max-1 trace | '18446744073709551614' | '18446744073709551615' | '44617461-646f-6721-ffff-fffffffffffe' | '44617461-646f-6721-ffff-ffffffffffff'" + "scenario | traceId | spanId | traceUuid | spanUuid ", + "small ids | '1' | '2' | '44617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", + "small ids duplicate | '1' | '2' | '44617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", + "uint64 max trace | 'TRACE_ID_MAX' | 'TRACE_ID_MAX-1' | '44617461-646f-6721-ffff-ffffffffffff' | '44617461-646f-6721-ffff-fffffffffffe'", + "uint64 max-1 trace | 'TRACE_ID_MAX-1' | 'TRACE_ID_MAX' | '44617461-646f-6721-ffff-fffffffffffe' | '44617461-646f-6721-ffff-ffffffffffff'" }) - void injectHttpHeaders(String traceId, String spanId, String traceUuid, String spanUuid) { + void injectHttpHeaders( + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, + String traceUuid, + String spanUuid) { Map baggage = new HashMap<>(); baggage.put("k1", "v1"); baggage.put("k2", "v2"); @@ -77,14 +83,17 @@ void injectHttpHeaders(String traceId, String spanId, String traceUuid, String s } @TableTest({ - "scenario | traceId | spanId | traceUuid | spanUuid ", - "small ids | '1' | '2' | '54617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", - "small ids duplicate | '1' | '2' | '54617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", - "uint64 max trace | '18446744073709551615' | '18446744073709551614' | '54617461-646f-6721-ffff-ffffffffffff' | '44617461-646f-6721-ffff-fffffffffffe'", - "uint64 max-1 trace | '18446744073709551614' | '18446744073709551615' | '54617461-646f-6721-ffff-fffffffffffe' | '44617461-646f-6721-ffff-ffffffffffff'" + "scenario | traceId | spanId | traceUuid | spanUuid ", + "small ids | '1' | '2' | '54617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", + "small ids duplicate | '1' | '2' | '54617461-646f-6721-0000-000000000001' | '44617461-646f-6721-0000-000000000002'", + "uint64 max trace | 'TRACE_ID_MAX' | 'TRACE_ID_MAX-1' | '54617461-646f-6721-ffff-ffffffffffff' | '44617461-646f-6721-ffff-fffffffffffe'", + "uint64 max-1 trace | 'TRACE_ID_MAX-1' | 'TRACE_ID_MAX' | '54617461-646f-6721-ffff-fffffffffffe' | '44617461-646f-6721-ffff-ffffffffffff'" }) void injectHttpHeadersWithHaystackTraceIdInBaggage( - String traceId, String spanId, String traceUuid, String spanUuid) { + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, + String traceUuid, + String spanUuid) { Map baggage = new HashMap<>(); baggage.put("k1", "v1"); baggage.put("k2", "v2"); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java index 321a73856d4..e9e171e648f 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java @@ -79,32 +79,32 @@ public Object convert(Object source, ParameterContext context) } @TableTest({ - "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | expectedTraceId | expectedSpanId | putDatadogFields | expectDatadogFields | tagContext | extractFirst", - "DATADOG,B3MULTI ids | [DATADOG, B3MULTI] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", - "DATADOG,B3MULTI b3 only | [DATADOG, B3MULTI] | | | 'a' | 'b' | | '10' | '11' | false | false | true | false ", - "DATADOG,B3MULTI b3 only with dd field | [DATADOG, B3MULTI] | | | 'a' | 'b' | | | | true | true | true | false ", - "DATADOG only | [DATADOG] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", - "B3MULTI only | [B3MULTI] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "B3MULTI,DATADOG | [B3MULTI, DATADOG] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "no styles | [] | '1' | '2' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG,B3MULTI invalid datadog trace | [DATADOG, B3MULTI] | 'abc' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "DATADOG only invalid trace | [DATADOG] | 'abc' | '2' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG,B3MULTI dd trace out of range | [DATADOG, B3MULTI] | '18446744073709551616' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "DATADOG,B3MULTI dd span out of range | [DATADOG, B3MULTI] | '1' | '18446744073709551616' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", - "DATADOG only dd trace out of range | [DATADOG] | '18446744073709551616' | '2' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG only dd span out of range | [DATADOG] | '1' | '18446744073709551616' | 'a' | 'b' | | | | false | false | false | false ", - "DATADOG,B3MULTI b3 trace out of range | [DATADOG, B3MULTI] | '1' | '2' | '18446744073709551616' | 'b' | | '1' | '2' | true | false | false | false ", - "DATADOG,B3MULTI b3 span out of range | [DATADOG, B3MULTI] | '1' | '2' | 'a' | '18446744073709551616' | | '1' | '2' | true | false | false | false ", - "NONE | [NONE] | '1' | '2' | | | | | | true | false | true | false ", - "DATADOG,TRACECONTEXT w3c override | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "DATADOG,TRACECONTEXT,B3MULTI w3c override | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "TRACECONTEXT,DATADOG | [TRACECONTEXT, DATADOG] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "TRACECONTEXT,B3MULTI | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "TRACECONTEXT,B3MULTI,DATADOG | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "B3MULTI,DATADOG,TRACECONTEXT | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "TRACECONTEXT only | [TRACECONTEXT] | | | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "DATADOG,TRACECONTEXT no dd span | [DATADOG, TRACECONTEXT] | '1' | | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", - "DATADOG,TRACECONTEXT extract first | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | '2' | false | false | false | true " + "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | expectedTraceId | expectedSpanId | putDatadogFields | expectDatadogFields | tagContext | extractFirst", + "DATADOG,B3MULTI ids | [DATADOG, B3MULTI] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", + "DATADOG,B3MULTI b3 only | [DATADOG, B3MULTI] | | | 'a' | 'b' | | '10' | '11' | false | false | true | false ", + "DATADOG,B3MULTI b3 only with dd field | [DATADOG, B3MULTI] | | | 'a' | 'b' | | | | true | true | true | false ", + "DATADOG only | [DATADOG] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", + "B3MULTI only | [B3MULTI] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "B3MULTI,DATADOG | [B3MULTI, DATADOG] | '1' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "no styles | [] | '1' | '2' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG,B3MULTI invalid datadog trace | [DATADOG, B3MULTI] | 'abc' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "DATADOG only invalid trace | [DATADOG] | 'abc' | '2' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG,B3MULTI dd trace out of range | [DATADOG, B3MULTI] | '18446744073709551616' | '2' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "DATADOG,B3MULTI dd span out of range | [DATADOG, B3MULTI] | '1' | '18446744073709551616' | 'a' | 'b' | | '10' | '11' | false | false | false | false ", + "DATADOG only dd trace out of range | [DATADOG] | '18446744073709551616' | '2' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG only dd span out of range | [DATADOG] | '1' | '18446744073709551616' | 'a' | 'b' | | | | false | false | false | false ", + "DATADOG,B3MULTI b3 trace out of range | [DATADOG, B3MULTI] | '1' | '2' | '18446744073709551616' | 'b' | | '1' | '2' | true | false | false | false ", + "DATADOG,B3MULTI b3 span out of range | [DATADOG, B3MULTI] | '1' | '2' | 'a' | '18446744073709551616' | | '1' | '2' | true | false | false | false ", + "NONE | [NONE] | '1' | '2' | | | | | | true | false | true | false ", + "DATADOG,TRACECONTEXT w3c override | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "DATADOG,TRACECONTEXT,B3MULTI w3c override | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT,DATADOG | [TRACECONTEXT, DATADOG] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT,B3MULTI | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT,B3MULTI,DATADOG | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "B3MULTI,DATADOG,TRACECONTEXT | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "TRACECONTEXT only | [TRACECONTEXT] | | | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "DATADOG,TRACECONTEXT no dd span | [DATADOG, TRACECONTEXT] | '1' | | | | 'W3C_TRACE_PARENT' | '1' | 'W3C_SPAN_ID_LSTR' | false | false | false | false ", + "DATADOG,TRACECONTEXT extract first | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_PARENT' | '1' | '2' | false | false | false | true " }) void extractHttpHeadersUsingStyles( List styles, @@ -166,18 +166,18 @@ void extractHttpHeadersUsingStyles( } @TableTest({ - "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | traceState | expectedTraceId | expectedSpanId | expectedParentId ", - "DATADOG,TRACECONTEXT with traceState p | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", - "DATADOG,TRACECONTEXT no traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'", - "DATADOG,TRACECONTEXT,B3MULTI with traceState p | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", - "TRACECONTEXT,DATADOG with traceState p | [TRACECONTEXT, DATADOG] | '1' | '2' | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", - "TRACECONTEXT,B3MULTI with traceState p | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", - "TRACECONTEXT,B3MULTI,DATADOG with traceState p | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", - "B3MULTI,DATADOG,TRACECONTEXT with traceState p | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", - "TRACECONTEXT only with traceState p | [TRACECONTEXT] | | | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", - "B3MULTI,TRACECONTEXT with traceState p | [B3MULTI, TRACECONTEXT] | | | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", - "B3MULTI,DATADOG,TRACECONTEXT no traceState | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'", - "DATADOG,TRACECONTEXT no p traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_STATE_NO_P' | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'" + "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | traceState | expectedTraceId | expectedSpanId | expectedParentId ", + "DATADOG,TRACECONTEXT with traceState p | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "DATADOG,TRACECONTEXT no traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'", + "DATADOG,TRACECONTEXT,B3MULTI with traceState p | [DATADOG, TRACECONTEXT, B3MULTI] | '1' | '2' | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "TRACECONTEXT,DATADOG with traceState p | [TRACECONTEXT, DATADOG] | '1' | '2' | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "TRACECONTEXT,B3MULTI with traceState p | [TRACECONTEXT, B3MULTI] | | | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "TRACECONTEXT,B3MULTI,DATADOG with traceState p | [TRACECONTEXT, B3MULTI, DATADOG] | '1' | '2' | '1' | '4' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "B3MULTI,DATADOG,TRACECONTEXT with traceState p | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "TRACECONTEXT only with traceState p | [TRACECONTEXT] | | | | | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | ", + "B3MULTI,TRACECONTEXT with traceState p | [B3MULTI, TRACECONTEXT] | | | '1' | '2' | 'W3C_TRACE_STATE_WITH_P' | '1' | 'W3C_SPAN_ID_LSTR' | 'W3C_PARENT_ID' ", + "B3MULTI,DATADOG,TRACECONTEXT no traceState | [B3MULTI, DATADOG, TRACECONTEXT] | '1' | '2' | '1' | '4' | | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'", + "DATADOG,TRACECONTEXT no p traceState | [DATADOG, TRACECONTEXT] | '1' | '2' | | | 'W3C_TRACE_STATE_NO_P' | '1' | 'W3C_SPAN_ID_LSTR' | '0000000000000002'" }) void checkW3CTraceContextOverride( List styles, @@ -215,11 +215,11 @@ void checkW3CTraceContextOverride( } @TableTest({ - "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | traceState | expectedSpanLinks ", - "matching trace IDs no links | [DATADOG, B3MULTI, TRACECONTEXT] | '1' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [] ", - "only tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '2' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [TRACECONTEXT] ", - "b3 and tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [B3MULTI, TRACECONTEXT]", - "datadog mismatch from tracecontext | [TRACECONTEXT, B3MULTI, DATADOG] | '2' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [DATADOG] " + "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | traceState | expectedSpanLinks ", + "matching trace IDs no links | [DATADOG, B3MULTI, TRACECONTEXT] | '1' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [] ", + "only tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '2' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [TRACECONTEXT] ", + "b3 and tracecontext mismatch | [DATADOG, B3MULTI, TRACECONTEXT] | '2' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [B3MULTI, TRACECONTEXT]", + "datadog mismatch from tracecontext | [TRACECONTEXT, B3MULTI, DATADOG] | '2' | '2' | '1' | 'b' | 'W3C_TRACE_PARENT' | 'W3C_TRACE_STATE_NO_P' | [DATADOG] " }) void verifyExistenceOfSpanLinks( List styles, diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java index 837a344659f..abd959426e3 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpInjectorTest.java @@ -96,7 +96,9 @@ void injectHttpHeadersUsingStyles( assertEquals("_dd.p.usr=123", carrier.get(DATADOG_TAGS_KEY)); expectedSize += 5; if (samplingPriority != UNSET) { - assertEquals(Integer.toString(samplingPriority), carrier.get(DatadogHttpCodec.SAMPLING_PRIORITY_KEY)); + assertEquals( + Integer.toString(samplingPriority), + carrier.get(DatadogHttpCodec.SAMPLING_PRIORITY_KEY)); expectedSize++; } if (origin != null) { @@ -114,9 +116,10 @@ void injectHttpHeadersUsingStyles( } } if (styles.contains(TracePropagationStyle.B3SINGLE)) { - String expectedB3Value = samplingPriority != UNSET - ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" - : b3TraceIdHex + "-" + b3SpanIdHex; + String expectedB3Value = + samplingPriority != UNSET + ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" + : b3TraceIdHex + "-" + b3SpanIdHex; assertEquals(expectedB3Value, carrier.get(B3_KEY)); expectedSize++; } @@ -166,7 +169,9 @@ void injectHttpHeadersUsingStyle( assertEquals("_dd.p.usr=123", carrier.get(DATADOG_TAGS_KEY)); expectedSize = 6; if (samplingPriority != UNSET) { - assertEquals(Integer.toString(samplingPriority), carrier.get(DatadogHttpCodec.SAMPLING_PRIORITY_KEY)); + assertEquals( + Integer.toString(samplingPriority), + carrier.get(DatadogHttpCodec.SAMPLING_PRIORITY_KEY)); expectedSize++; } if (origin != null) { @@ -182,9 +187,10 @@ void injectHttpHeadersUsingStyle( expectedSize++; } } else if (style == TracePropagationStyle.B3SINGLE) { - String expectedB3Value = samplingPriority != UNSET - ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" - : b3TraceIdHex + "-" + b3SpanIdHex; + String expectedB3Value = + samplingPriority != UNSET + ? b3TraceIdHex + "-" + b3SpanIdHex + "-1" + : b3TraceIdHex + "-" + b3SpanIdHex; assertEquals(expectedB3Value, carrier.get(B3_KEY)); expectedSize++; } @@ -222,7 +228,8 @@ void encodeBaggageInHttpHeadersUsingStyle(TracePropagationStyle style) { assertEquals("ab%27%2C%3A%5Ccd", carrier.get("excluded")); } - HttpCodec.Injector createInjector(List overriddenStyles, Map invertedBaggageMapping) { + HttpCodec.Injector createInjector( + List overriddenStyles, Map invertedBaggageMapping) { Config config = mock(Config.class); if (overriddenStyles != null) { LinkedHashSet orderedSet = new LinkedHashSet<>(overriddenStyles); diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java index 6481c2ff456..432573564a9 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java @@ -1,14 +1,15 @@ package datadog.trace.core.propagation; +import static datadog.trace.api.config.TracerConfig.PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED; +import static datadog.trace.api.config.TracerConfig.REQUEST_HEADER_TAGS_COMMA_ALLOWED; import static datadog.trace.api.sampling.PrioritySampling.UNSET; +import static datadog.trace.bootstrap.ActiveSubsystems.APPSEC_ACTIVE; import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap; import static datadog.trace.core.propagation.DatadogHttpCodec.DATADOG_TAGS_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.ORIGIN_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.OT_BAGGAGE_PREFIX; -import static datadog.trace.core.propagation.DatadogHttpCodec.SAMPLING_PRIORITY_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.SPAN_ID_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.TRACE_ID_KEY; -import static datadog.trace.junit.utils.config.WithConfigExtension.injectEnvConfig; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -24,12 +25,11 @@ import datadog.trace.api.DynamicConfig; import datadog.trace.api.config.TracerConfig; import datadog.trace.api.internal.util.LongStringUtils; -import datadog.trace.bootstrap.ActiveSubsystems; import datadog.trace.bootstrap.instrumentation.api.TagContext; import datadog.trace.junit.utils.config.WithConfig; -import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; +import datadog.trace.junit.utils.tabletest.TraceIdConverter; import datadog.trace.test.util.DDJavaSpecification; -import java.util.LinkedHashMap; +import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -39,9 +39,8 @@ import org.junit.jupiter.params.provider.ValueSource; 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 NoneHttpExtractorTest extends DDJavaSpecification { - private static final String SOME_HEADER = "SOME_HEADER"; private static final String SOME_CUSTOM_BAGGAGE_HEADER = "SOME_CUSTOM_BAGGAGE_HEADER"; private static final String SOME_CUSTOM_BAGGAGE_HEADER_2 = "SOME_CUSTOM_BAGGAGE_HEADER_2"; @@ -49,58 +48,41 @@ class NoneHttpExtractorTest extends DDJavaSpecification { private static final String SOME_BAGGAGE = "some-baggage"; private static final String SOME_CASE_SENSITIVE_BAGGAGE = "some-CaseSensitive-baggage"; - private DynamicConfig dynamicConfig; - private HttpCodec.Extractor lazyExtractor; + private HttpCodec.Extractor extractor; private boolean origAppSecActive; @BeforeEach void setup() { - Map baggageMap = new LinkedHashMap<>(); + Map baggageMap = new HashMap<>(); baggageMap.put(SOME_CUSTOM_BAGGAGE_HEADER, SOME_BAGGAGE); baggageMap.put(SOME_CUSTOM_BAGGAGE_HEADER_2, SOME_CASE_SENSITIVE_BAGGAGE); - dynamicConfig = + DynamicConfig dynamicConfig = DynamicConfig.create() .setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)) .setBaggageMapping(baggageMap) .apply(); - origAppSecActive = ActiveSubsystems.APPSEC_ACTIVE; - ActiveSubsystems.APPSEC_ACTIVE = true; + this.extractor = NoneCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); + + this.origAppSecActive = APPSEC_ACTIVE; + APPSEC_ACTIVE = true; } @AfterEach void teardown() { - ActiveSubsystems.APPSEC_ACTIVE = origAppSecActive; - extractor().cleanup(); - } - - private HttpCodec.Extractor extractor() { - if (lazyExtractor == null) { - lazyExtractor = createExtractor(); - } - return lazyExtractor; - } - - private HttpCodec.Extractor createExtractor() { - return NoneCodec.newExtractor(Config.get(), () -> dynamicConfig.captureTraceConfig()); + APPSEC_ACTIVE = origAppSecActive; + this.extractor.cleanup(); } @TableTest({ - "scenario | traceId | spanId | samplingPriority | origin | allowComma", - "no origin comma | '1' | '2' | PrioritySampling.UNSET | | true ", - "no origin no comma | '2' | '3' | PrioritySampling.UNSET | | false ", - "uint64 max comma | '18446744073709551615' | '18446744073709551614' | PrioritySampling.UNSET | | true ", - "uint64 max-1 | '18446744073709551614' | '18446744073709551615' | PrioritySampling.UNSET | | false " + "scenario | traceId | spanId ", + "no origin | '1' | '2' ", + "uint64 max | 'TRACE_ID_MAX' | 'TRACE_ID_MAX-1'", + "uint64 max-1 | 'TRACE_ID_MAX-1' | 'TRACE_ID_MAX' " }) void extractHttpHeaders( - String traceId, - String spanId, - @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, - String origin, - boolean allowComma) { - injectEnvConfig( - "DD_TRACE_REQUEST_HEADER_TAGS_COMMA_ALLOWED", String.valueOf(allowComma), false); - HttpCodec.Extractor extractor = createExtractor(); - Map headers = new LinkedHashMap<>(); + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId) { + Map headers = new HashMap<>(); headers.put("", "empty key"); headers.put(TRACE_ID_KEY.toUpperCase(), traceId); headers.put(SPAN_ID_KEY.toUpperCase(), spanId); @@ -109,38 +91,66 @@ void extractHttpHeaders( headers.put(SOME_HEADER, "my-interesting-info,and-more"); headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); - if (samplingPriority != UNSET) { - headers.put(SAMPLING_PRIORITY_KEY, String.valueOf(samplingPriority)); - } - if (origin != null) { - headers.put(ORIGIN_KEY, origin); - } - String expectedTagValue = allowComma ? "my-interesting-info,and-more" : "my-interesting-info"; - TagContext context = extractor.extract(headers, stringValuesMap()); + TagContext context = this.extractor.extract(headers, stringValuesMap()); + + assertEquals(DDTraceId.ZERO, context.getTraceId()); + assertEquals(DDSpanId.ZERO, context.getSpanId()); + Map expectedBaggage = new HashMap<>(); + expectedBaggage.put(SOME_BAGGAGE, "my-interesting-baggage-info"); + expectedBaggage.put(SOME_CASE_SENSITIVE_BAGGAGE, "my-interesting-baggage-info-2"); + assertEquals(expectedBaggage, context.getBaggage()); + assertEquals(singletonMap(SOME_TAG, "my-interesting-info,and-more"), context.getTags()); + assertEquals(UNSET, context.getSamplingPriority()); + assertNull(context.getOrigin()); + } + + @WithConfig(key = REQUEST_HEADER_TAGS_COMMA_ALLOWED, value = "false") + @Test + void extractHttpHeadersWithoutComma() { + // Recreate extractor with the comma-disallowed config + this.extractor.cleanup(); + Map baggageMap = new HashMap<>(); + baggageMap.put(SOME_CUSTOM_BAGGAGE_HEADER, SOME_BAGGAGE); + baggageMap.put(SOME_CUSTOM_BAGGAGE_HEADER_2, SOME_CASE_SENSITIVE_BAGGAGE); + DynamicConfig dynamicConfig = + DynamicConfig.create() + .setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)) + .setBaggageMapping(baggageMap) + .apply(); + this.extractor = NoneCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); + + Map headers = new HashMap<>(); + headers.put("", "empty key"); + headers.put(TRACE_ID_KEY.toUpperCase(), "2"); + headers.put(SPAN_ID_KEY.toUpperCase(), "3"); + headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); + headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); + headers.put(SOME_HEADER, "my-interesting-info,and-more"); + headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); + headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + + TagContext context = this.extractor.extract(headers, stringValuesMap()); assertEquals(DDTraceId.ZERO, context.getTraceId()); assertEquals(DDSpanId.ZERO, context.getSpanId()); - Map expectedBaggage = new LinkedHashMap<>(); + Map expectedBaggage = new HashMap<>(); expectedBaggage.put(SOME_BAGGAGE, "my-interesting-baggage-info"); expectedBaggage.put(SOME_CASE_SENSITIVE_BAGGAGE, "my-interesting-baggage-info-2"); assertEquals(expectedBaggage, context.getBaggage()); - assertEquals(singletonMap(SOME_TAG, expectedTagValue), context.getTags()); - assertEquals(samplingPriority, context.getSamplingPriority()); - assertEquals(origin, asString(context.getOrigin())); - extractor.cleanup(); + assertEquals(singletonMap(SOME_TAG, "my-interesting-info"), context.getTags()); } @ParameterizedTest @ValueSource(booleans = {false, true}) void extractHeaderTagsWithNoPropagation(boolean withOrigin) { - Map headers = new LinkedHashMap<>(); + Map headers = new HashMap<>(); if (withOrigin) { headers.put(ORIGIN_KEY, "my-origin"); } headers.put(SOME_HEADER, "my-interesting-info"); - TagContext context = extractor().extract(headers, stringValuesMap()); + TagContext context = this.extractor.extract(headers, stringValuesMap()); assertFalse(context instanceof ExtractedContext); assertEquals(singletonMap(SOME_TAG, "my-interesting-info"), context.getTags()); @@ -153,18 +163,18 @@ void extractHeadersWithForwarding() { String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; Map tagOnlyCtx = singletonMap("Forwarded", forwarded); - Map fullCtx = new LinkedHashMap<>(); + Map fullCtx = new HashMap<>(); fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); fullCtx.put("Forwarded", forwarded); - TagContext context = extractor().extract(tagOnlyCtx, stringValuesMap()); + TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); assertNotNull(context); assertFalse(context instanceof ExtractedContext); assertEquals(forwarded, context.getForwarded()); - context = extractor().extract(fullCtx, stringValuesMap()); + context = this.extractor.extract(fullCtx, stringValuesMap()); assertFalse(context instanceof ExtractedContext); assertEquals(DDTraceId.ZERO, context.getTraceId()); @@ -176,23 +186,23 @@ void extractHeadersWithForwarding() { void extractHeadersWithXForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; - Map tagOnlyCtx = new LinkedHashMap<>(); + Map tagOnlyCtx = new HashMap<>(); tagOnlyCtx.put("X-Forwarded-For", forwardedIp); tagOnlyCtx.put("X-Forwarded-Port", forwardedPort); - Map fullCtx = new LinkedHashMap<>(); + Map fullCtx = new HashMap<>(); fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); fullCtx.put("x-forwarded-for", forwardedIp); fullCtx.put("x-forwarded-port", forwardedPort); - TagContext context = extractor().extract(tagOnlyCtx, stringValuesMap()); + TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); assertNotNull(context); assertFalse(context instanceof ExtractedContext); assertEquals(forwardedIp, context.getXForwardedFor()); assertEquals(forwardedPort, context.getXForwardedPort()); - context = extractor().extract(fullCtx, stringValuesMap()); + context = this.extractor.extract(fullCtx, stringValuesMap()); assertFalse(context instanceof ExtractedContext); assertEquals(DDTraceId.ZERO, context.getTraceId()); @@ -204,17 +214,17 @@ void extractHeadersWithXForwarding() { @Test void extractEmptyHeadersReturnsNull() { assertNull( - extractor().extract(singletonMap("ignored-header", "ignored-value"), stringValuesMap())); + this.extractor.extract(singletonMap("ignored-header", "ignored-value"), stringValuesMap())); } @Test @WithConfig(key = TracerConfig.TRACE_CLIENT_IP_RESOLVER_ENABLED, value = "false") void extractHeadersWithIpResolutionDisabled() { - Map tagOnlyCtx = new LinkedHashMap<>(); + Map tagOnlyCtx = new HashMap<>(); tagOnlyCtx.put("X-Forwarded-For", "::1"); tagOnlyCtx.put("User-agent", "foo/bar"); - TagContext context = extractor().extract(tagOnlyCtx, stringValuesMap()); + TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); assertNotNull(context); assertNull(context.getXForwardedFor()); @@ -223,12 +233,12 @@ void extractHeadersWithIpResolutionDisabled() { @Test void extractHeadersWithIpResolutionDisabledAppsecDisabled() { - ActiveSubsystems.APPSEC_ACTIVE = false; - Map tagOnlyCtx = new LinkedHashMap<>(); + APPSEC_ACTIVE = false; + Map tagOnlyCtx = new HashMap<>(); tagOnlyCtx.put("X-Forwarded-For", "::1"); tagOnlyCtx.put("User-agent", "foo/bar"); - TagContext context = extractor().extract(tagOnlyCtx, stringValuesMap()); + TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); assertNotNull(context); assertNull(context.getXForwardedFor()); @@ -237,11 +247,11 @@ void extractHeadersWithIpResolutionDisabledAppsecDisabled() { @Test @WithConfig(key = TracerConfig.TRACE_CLIENT_IP_HEADER, value = "my-header") void customIpHeaderCollectionDoesNotDisableStandardIpHeaderCollection() { - Map tagOnlyCtx = new LinkedHashMap<>(); + Map tagOnlyCtx = new HashMap<>(); tagOnlyCtx.put("X-Forwarded-For", "::1"); tagOnlyCtx.put("My-Header", "8.8.8.8"); - TagContext context = extractor().extract(tagOnlyCtx, stringValuesMap()); + TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); assertNotNull(context); assertEquals("::1", context.getXForwardedFor()); @@ -259,7 +269,7 @@ void customIpHeaderCollectionDoesNotDisableStandardIpHeaderCollection() { void extractHttpHeadersWith128BitTraceId(String hexId) { DD128bTraceId traceId = DD128bTraceId.fromHex(hexId); boolean is128bTrace = traceId.toHighOrderLong() != 0; - Map headers = new LinkedHashMap<>(); + Map headers = new HashMap<>(); headers.put(TRACE_ID_KEY.toUpperCase(), traceId.toString()); headers.put(SPAN_ID_KEY.toUpperCase(), "2"); headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); @@ -271,7 +281,7 @@ void extractHttpHeadersWith128BitTraceId(String hexId) { "_dd.p.tid=" + LongStringUtils.toHexStringPadded(traceId.toHighOrderLong(), 16)); } - TagContext context = extractor().extract(headers, stringValuesMap()); + TagContext context = this.extractor.extract(headers, stringValuesMap()); assertEquals(DDTraceId.ZERO, context.getTraceId()); assertEquals(DDSpanId.ZERO, context.getSpanId()); @@ -281,14 +291,14 @@ void extractHttpHeadersWith128BitTraceId(String hexId) { @Test void extractHttpHeadersWithInvalidNonNumericId() { - Map headers = new LinkedHashMap<>(); + Map headers = new HashMap<>(); headers.put(TRACE_ID_KEY.toUpperCase(), "traceId"); headers.put(SPAN_ID_KEY.toUpperCase(), "spanId"); headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); headers.put(SOME_HEADER, "my-interesting-info"); - TagContext context = extractor().extract(headers, stringValuesMap()); + TagContext context = this.extractor.extract(headers, stringValuesMap()); assertInstanceOf(TagContext.class, context); assertEquals(singletonMap(SOME_TAG, "my-interesting-info"), context.getTags()); @@ -296,7 +306,7 @@ void extractHttpHeadersWithInvalidNonNumericId() { @Test void extractCommonHttpHeaders() { - Map headers = new LinkedHashMap<>(); + Map 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"); @@ -308,7 +318,7 @@ void extractCommonHttpHeaders() { headers.put(HttpCodec.CF_CONNECTING_IP_KEY, "8.8.8.8"); headers.put(HttpCodec.CF_CONNECTING_IP_V6_KEY, "9.9.9.9"); - TagContext context = extractor().extract(headers, stringValuesMap()); + TagContext context = this.extractor.extract(headers, stringValuesMap()); assertEquals("some-user-agent", context.getUserAgent()); assertEquals("1.1.1.1", context.getXClusterClientIp()); @@ -321,8 +331,4 @@ void extractCommonHttpHeaders() { assertEquals("8.8.8.8", context.getCfConnectingIp()); assertEquals("9.9.9.9", context.getCfConnectingIpv6()); } - - private static String asString(CharSequence cs) { - return cs == null ? null : cs.toString(); - } } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java index 3dbe187f7a3..c580db9aa17 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpInjectorTest.java @@ -18,6 +18,7 @@ import datadog.trace.core.DDCoreJavaSpecification; import datadog.trace.core.DDSpanContext; import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; +import datadog.trace.junit.utils.tabletest.TraceIdConverter; import java.util.LinkedHashMap; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -37,16 +38,16 @@ void setup() { } @TableTest({ - "scenario | traceId | spanId | samplingPriority | origin | tracestate ", - "unset 1->2 | 1 | 2 | PrioritySampling.UNSET | | 'dd=p:0000000000000002;t.usr:123' ", - "keep 1->4 saipan | 1 | 4 | PrioritySampling.SAMPLER_KEEP | saipan | 'dd=s:1;o:saipan;p:0000000000000004;t.usr:123'", - "unset max->max-1 saipan | 18446744073709551615 | 18446744073709551614 | PrioritySampling.UNSET | saipan | 'dd=o:saipan;p:fffffffffffffffe;t.usr:123' ", - "keep max-1->max | 18446744073709551614 | 18446744073709551615 | PrioritySampling.SAMPLER_KEEP | | 'dd=s:1;p:ffffffffffffffff;t.usr:123' ", - "drop max-1->max | 18446744073709551614 | 18446744073709551615 | PrioritySampling.SAMPLER_DROP | | 'dd=s:0;p:ffffffffffffffff;t.usr:123' " + "scenario | traceId | spanId | samplingPriority | origin | tracestate ", + "unset 1->2 | 1 | 2 | PrioritySampling.UNSET | | 'dd=p:0000000000000002;t.usr:123' ", + "keep 1->4 saipan | 1 | 4 | PrioritySampling.SAMPLER_KEEP | saipan | 'dd=s:1;o:saipan;p:0000000000000004;t.usr:123'", + "unset max->max-1 saipan | TRACE_ID_MAX | TRACE_ID_MAX-1 | PrioritySampling.UNSET | saipan | 'dd=o:saipan;p:fffffffffffffffe;t.usr:123' ", + "keep max-1->max | TRACE_ID_MAX-1 | TRACE_ID_MAX | PrioritySampling.SAMPLER_KEEP | | 'dd=s:1;p:ffffffffffffffff;t.usr:123' ", + "drop max-1->max | TRACE_ID_MAX-1 | TRACE_ID_MAX | PrioritySampling.SAMPLER_DROP | | 'dd=s:0;p:ffffffffffffffff;t.usr:123' " }) void injectHttpHeaders( - String traceId, - String spanId, + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, String origin, String tracestate) { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java index 3995c9942ec..bfbf9190f04 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java @@ -24,6 +24,7 @@ import datadog.trace.core.DDSpanContext; import datadog.trace.core.datastreams.DataStreamsMonitoring; import datadog.trace.junit.utils.tabletest.PrioritySamplingConverter; +import datadog.trace.junit.utils.tabletest.TraceIdConverter; import java.util.LinkedHashMap; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -41,19 +42,19 @@ void setup() { } @TableTest({ - "scenario | traceId | spanId | samplingPriority | expectedTraceHeader ", - "unset 1->2 | 1 | 2 | PrioritySampling.UNSET | 'Root=1-633c7675-000000000000000000000001;Parent=0000000000000002;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v' ", - "keep 2->3 | 2 | 3 | PrioritySampling.SAMPLER_KEEP | 'Root=1-633c7675-000000000000000000000002;Parent=0000000000000003;Sampled=1;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", - "drop 4->5 | 4 | 5 | PrioritySampling.SAMPLER_DROP | 'Root=1-633c7675-000000000000000000000004;Parent=0000000000000005;Sampled=0;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", - "user keep 5->6 | 5 | 6 | PrioritySampling.USER_KEEP | 'Root=1-633c7675-000000000000000000000005;Parent=0000000000000006;Sampled=1;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", - "user drop 6->7 | 6 | 7 | PrioritySampling.USER_DROP | 'Root=1-633c7675-000000000000000000000006;Parent=0000000000000007;Sampled=0;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", - "unset max->max-1 | 18446744073709551615 | 18446744073709551614 | PrioritySampling.UNSET | 'Root=1-633c7675-00000000ffffffffffffffff;Parent=fffffffffffffffe;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v' ", - "keep max-1->max | 18446744073709551614 | 18446744073709551615 | PrioritySampling.SAMPLER_KEEP | 'Root=1-633c7675-00000000fffffffffffffffe;Parent=ffffffffffffffff;Sampled=1;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'" + "scenario | traceId | spanId | samplingPriority | expectedTraceHeader ", + "unset 1->2 | 1 | 2 | PrioritySampling.UNSET | 'Root=1-633c7675-000000000000000000000001;Parent=0000000000000002;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v' ", + "keep 2->3 | 2 | 3 | PrioritySampling.SAMPLER_KEEP | 'Root=1-633c7675-000000000000000000000002;Parent=0000000000000003;Sampled=1;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", + "drop 4->5 | 4 | 5 | PrioritySampling.SAMPLER_DROP | 'Root=1-633c7675-000000000000000000000004;Parent=0000000000000005;Sampled=0;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", + "user keep 5->6 | 5 | 6 | PrioritySampling.USER_KEEP | 'Root=1-633c7675-000000000000000000000005;Parent=0000000000000006;Sampled=1;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", + "user drop 6->7 | 6 | 7 | PrioritySampling.USER_DROP | 'Root=1-633c7675-000000000000000000000006;Parent=0000000000000007;Sampled=0;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'", + "unset max->max-1 | TRACE_ID_MAX | TRACE_ID_MAX-1 | PrioritySampling.UNSET | 'Root=1-633c7675-00000000ffffffffffffffff;Parent=fffffffffffffffe;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v' ", + "keep max-1->max | TRACE_ID_MAX-1 | TRACE_ID_MAX | PrioritySampling.SAMPLER_KEEP | 'Root=1-633c7675-00000000fffffffffffffffe;Parent=ffffffffffffffff;Sampled=1;_dd.origin=fakeOrigin;SOME_CUSTOM_HEADER=some-value;k=v'" }) @SuppressWarnings("unchecked") void injectHttpHeaders( - String traceId, - String spanId, + @ConvertWith(TraceIdConverter.class) String traceId, + @ConvertWith(TraceIdConverter.class) String spanId, @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, String expectedTraceHeader) { ListWriter writer = new ListWriter(); diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index 7d60e418f77..e3f88accd66 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -1654,7 +1654,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins DEFAULT_PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED); tracePropagationStyleB3PaddingEnabled = - isEnabled(DEFAULT_PROPAGATION_B3_PADDING_ENABLED, TRACE_PROPAGATION_STYLE, ".b3.padding.enabled"); + isEnabled( + DEFAULT_PROPAGATION_B3_PADDING_ENABLED, TRACE_PROPAGATION_STYLE, ".b3.padding.enabled"); TracePropagationBehaviorExtract tmpTracePropagationBehaviorExtract; try { diff --git a/utils/junit-utils/src/main/java/datadog/trace/junit/utils/tabletest/TraceIdConverter.java b/utils/junit-utils/src/main/java/datadog/trace/junit/utils/tabletest/TraceIdConverter.java new file mode 100644 index 00000000000..00dce0b20ea --- /dev/null +++ b/utils/junit-utils/src/main/java/datadog/trace/junit/utils/tabletest/TraceIdConverter.java @@ -0,0 +1,46 @@ +package datadog.trace.junit.utils.tabletest; + +import static java.math.BigInteger.ONE; + +import java.math.BigInteger; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.params.converter.ArgumentConversionException; +import org.junit.jupiter.params.converter.ArgumentConverter; + +/** + * Converts symbolic trace/span ID names to their decimal string representation. + * + *

Supported names: + * + *

    + *
  • {@code TRACE_ID_MAX} — max unsigned 64-bit value (18446744073709551615 = 2⁶⁴ − 1) + *
  • {@code TRACE_ID_MAX-1} — max minus one (18446744073709551614 = 2⁶⁴ − 2) + *
  • {@code TRACE_ID_MAX+1} — first out-of-range value (18446744073709551616 = 2⁶⁴) + *
+ * + *

All other values are passed through unchanged. + */ +public class TraceIdConverter implements ArgumentConverter { + // 2^64 - 1 + public static final String TRACE_ID_MAX = Long.toUnsignedString(-1L); + // 2^64 - 2 + public static final String TRACE_ID_MAX_MINUS_1 = Long.toUnsignedString(-2L); + // 2^64 (first out-of-range value) + public static final String TRACE_ID_MAX_PLUS_1 = new BigInteger(TRACE_ID_MAX).add(ONE).toString(); + + @Override + public Object convert(Object source, ParameterContext context) + throws ArgumentConversionException { + if (source == null) return null; + switch (source.toString()) { + case "TRACE_ID_MAX": + return TRACE_ID_MAX; + case "TRACE_ID_MAX-1": + return TRACE_ID_MAX_MINUS_1; + case "TRACE_ID_MAX+1": + return TRACE_ID_MAX_PLUS_1; + default: + return source.toString(); + } + } +} From e70dc91847dd8799348933de9c8b380ee3512f22 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 17:06:19 +0200 Subject: [PATCH 05/15] fix(core): Revert dumb AI --- .../main/java/datadog/trace/api/Config.java | 189 +++++++++++++++++- 1 file changed, 188 insertions(+), 1 deletion(-) diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index e3f88accd66..9a62f644004 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -2,7 +2,194 @@ import static datadog.environment.JavaVirtualMachine.isJavaVersion; import static datadog.environment.JavaVirtualMachine.isJavaVersionAtLeast; -import static datadog.trace.api.ConfigDefaults.*; +import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_HOST; +import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_AGENT_WRITER_TYPE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_ANALYTICS_SAMPLE_RATE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_ENDPOINT_COLLECTION_MESSAGE_LIMIT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_API_SECURITY_SAMPLE_DELAY; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_BODY_PARSING_SIZE_LIMIT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_FILE_CONTENT_BYTES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_FILE_CONTENT_COUNT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_STACK_TRACES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_MAX_STACK_TRACE_DEPTH; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_REPORTING_INBAND; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_STACK_TRACE_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_TRACE_RATE_LIMIT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_WAF_METRICS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APPSEC_WAF_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_APP_LOGS_COLLECTION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CASSANDRA_KEYSPACE_STATEMENT_EXTRACTION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_AGENTLESS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_AUTO_CONFIGURATION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_BACKEND_API_TIMEOUT_MILLIS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_BUILD_INSTRUMENTATION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_AUTO_CONFIGURATION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_COMPILER_PLUGIN_VERSION; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_COMMAND_TIMEOUT_MILLIS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_REMOTE_NAME; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UNSHALLOW_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UPLOAD_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_GIT_UPLOAD_TIMEOUT_MILLIS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_EXCLUDES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_JACOCO_PLUGIN_VERSION; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_RESOURCE_FOLDER_NAMES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_SIGNAL_SERVER_HOST; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_SIGNAL_SERVER_PORT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CIVISIBILITY_SOURCE_DATA_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CLIENT_IP_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CLOCK_SYNC_PERIOD; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CODE_ORIGIN_MAX_USER_FRAMES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_COUCHBASE_INTERNAL_SPANS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CWS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_CWS_TLS_REFRESH; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_EXPERIMENTAL_FEATURES_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_OPENLINEAGE_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_OPENLINEAGE_TIMEOUT_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_JOBS_PARSE_SPARK_PLAN_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_STREAMS_BUCKET_DURATION; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DATA_STREAMS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_CLIENT_HOST_SPLIT_BY_HOST; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_ALWAYS_APPEND_SQL_COMMENT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_PROPAGATION_MODE_MODE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_TRACE_PREPARED_STATEMENTS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_MAX_CAPTURED_FRAMES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_ONLY_LOCAL_ROOT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_MAX_EXCEPTION_PER_SECOND; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_SOURCE_FILE_TRACKING_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DISTRIBUTED_DEBUGGER_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DOGSTATSD_PORT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DOGSTATSD_START_DELAY; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_CAPTURE_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_CLASSFILE_DUMP_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_DIAGNOSTICS_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_LOCALVAR_HOISTING_LEVEL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_MAX_PAYLOAD_SIZE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_METRICS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_POLL_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_BATCH_SIZE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_UPLOAD_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_DYNAMIC_INSTRUMENTATION_VERIFY_BYTECODE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_BODY_AND_PARAMS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_BODY_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_ELASTICSEARCH_PARAMS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_GRPC_CLIENT_ERROR_STATUSES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_GRPC_SERVER_ERROR_STATUSES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_HEALTH_METRICS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_CLIENT_ERROR_STATUSES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN; +import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_CLIENT_TAG_QUERY_STRING; +import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_SERVER_ERROR_STATUSES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_SERVER_ROUTE_BASED_NAMING; +import static datadog.trace.api.ConfigDefaults.DEFAULT_HTTP_SERVER_TAG_QUERY_STRING; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_ANONYMOUS_CLASSES_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_DB_ROWS_TO_TAINT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_DEBUG_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_HARDCODED_SECRET_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_REDACTION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_REDACTION_NAME_PATTERN; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_REDACTION_VALUE_PATTERN; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_STACKTRACE_LEAK_SUPPRESS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_STACK_TRACE_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_TRUNCATION_MAX_VALUE_LENGTH; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_WEAK_CIPHER_ALGORITHMS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_IAST_WEAK_HASH_ALGORITHMS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_INJECT_DATADOG_ATTRIBUTE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_INSTRUMENTATION_SOURCE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_JAX_RS_EXCEPTION_AS_ERROR_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_LLM_OBS_AGENTLESS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_INJECTION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_BATCH_SIZE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_QUEUE_SIZE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_OTEL_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_CARDINALITY_LIMIT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_EXPERIMENTAL_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_GRPC_PORT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_LOGS_ENDPOINT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_METRICS_ENDPOINT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_PORT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_TRACES_ENDPOINT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_TRACES_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_PARTIAL_FLUSH_MIN_SPANS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_PERF_METRICS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_PRIORITY_SAMPLING_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_PRIORITY_SAMPLING_FORCE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_PROPAGATION_B3_PADDING_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_PROPAGATION_EXTRACT_LOG_HEADER_NAMES_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_PROPAGATION_STYLE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_INTEGRITY_CHECK_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_MAX_EXTRA_SERVICES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_MAX_PAYLOAD_SIZE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_POLL_INTERVAL_SECONDS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_TARGETS_KEY; +import static datadog.trace.api.ConfigDefaults.DEFAULT_REMOTE_CONFIG_TARGETS_KEY_ID; +import static datadog.trace.api.ConfigDefaults.DEFAULT_RUM_MAJOR_VERSION; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SCOPE_DEPTH_LIMIT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SCOPE_ITERATION_KEEP_ALIVE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SECURE_RANDOM; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SERVICE_DISCOVERY_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SERVICE_NAME; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SERVLET_ROOT_CONTEXT_SERVICE_NAME; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SITE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SPARK_APP_NAME_AS_SERVICE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SPARK_TASK_HISTOGRAM_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SSI_INJECTION_FORCE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_STARTUP_LOGS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_COMPRESSED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_FLUSH_THRESHOLD; +import static datadog.trace.api.ConfigDefaults.DEFAULT_SYMBOL_DATABASE_FORCE_UPLOAD; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_DEBUG_REQUESTS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_HEARTBEAT_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_LOG_COLLECTION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TELEMETRY_METRICS_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_128_BIT_TRACEID_GENERATION_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_128_BIT_TRACEID_LOGGING_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_AGENT_PORT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_AGENT_PROTOCOL_VERSION; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_ANALYTICS_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_BYTES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_ITEMS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_TAG_KEYS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_CLOUD_PAYLOAD_TAGGING_SERVICES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_EXPERIMENTAL_FEATURES_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_HTTP_RESOURCE_REMOVE_TRAILING_SLASH; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_KEEP_LATENCY_THRESHOLD_MS; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_LONG_RUNNING_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_LONG_RUNNING_FLUSH_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_LONG_RUNNING_INITIAL_FLUSH_INTERVAL; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_POST_PROCESSING_TIMEOUT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_PROPAGATION_BEHAVIOR_EXTRACT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_PROPAGATION_EXTRACT_FIRST; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_PROPAGATION_STYLE; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_RATE_LIMIT; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_REPORT_HOSTNAME; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_RESOLVER_ENABLED; +import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_X_DATADOG_TAGS_MAX_LENGTH; +import static datadog.trace.api.ConfigDefaults.DEFAULT_WEBSOCKET_MESSAGES_INHERIT_SAMPLING; +import static datadog.trace.api.ConfigDefaults.DEFAULT_WEBSOCKET_MESSAGES_SEPARATE_TRACES; +import static datadog.trace.api.ConfigDefaults.DEFAULT_WEBSOCKET_TAG_SESSION_ID; import static datadog.trace.api.ConfigSetting.NON_DEFAULT_SEQ_ID; import static datadog.trace.api.DDTags.APM_ENABLED; import static datadog.trace.api.DDTags.HOST_TAG; From e38fa745a86453058af6853912923185be675194 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 17:24:22 +0200 Subject: [PATCH 06/15] fix(core): Manually cleaning up AI code --- .../core/propagation/HttpExtractorTest.java | 105 +++++++++--------- 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java index e9e171e648f..0ddc1f9fcd0 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java @@ -45,39 +45,6 @@ class HttpExtractorTest extends DDJavaSpecification { private static final String W3C_TRACE_STATE_NO_P = "dd=s:2,foo=1"; private static final String W3C_SPAN_ID_LSTR = Long.toString(DDSpanId.fromHex(W3C_SPAN_ID)); - @TypeConverter - static TracePropagationStyle parseTracePropagationStyle(String value) { - String name = value.trim(); - if (name.startsWith("TracePropagationStyle.")) { - name = name.substring("TracePropagationStyle.".length()); - } - return TracePropagationStyle.valueOf(name); - } - - static class W3cConstantConverter implements ArgumentConverter { - @Override - public Object convert(Object source, ParameterContext context) - throws ArgumentConversionException { - if (source == null) { - return null; - } - switch (source.toString()) { - case "W3C_TRACE_PARENT": - return W3C_TRACE_PARENT; - case "W3C_TRACE_STATE_WITH_P": - return W3C_TRACE_STATE_WITH_P; - case "W3C_TRACE_STATE_NO_P": - return W3C_TRACE_STATE_NO_P; - case "W3C_SPAN_ID_LSTR": - return W3C_SPAN_ID_LSTR; - case "W3C_PARENT_ID": - return W3C_PARENT_ID; - default: - return source; - } - } - } - @TableTest({ "scenario | styles | datadogTraceId | datadogSpanId | b3TraceId | b3SpanId | w3cTraceParent | expectedTraceId | expectedSpanId | putDatadogFields | expectDatadogFields | tagContext | extractFirst", "DATADOG,B3MULTI ids | [DATADOG, B3MULTI] | '1' | '2' | 'a' | 'b' | | '1' | '2' | true | true | false | false ", @@ -119,16 +86,7 @@ void extractHttpHeadersUsingStyles( boolean expectDatadogFields, boolean tagContext, boolean extractFirst) { - Config config = mock(Config.class); - when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); - when(config.isTracePropagationExtractFirst()).thenReturn(extractFirst); - DynamicConfig dynamicConfig = - DynamicConfig.create() - .setHeaderTags(singletonMap("SOME_HEADER", "some-tag")) - .setBaggageMapping(emptyMap()) - .apply(); - HttpCodec.Extractor extractor = - HttpCodec.createExtractor(config, dynamicConfig::captureTraceConfig); + HttpCodec.Extractor extractor = createExtractor(styles, extractFirst, singletonMap("SOME_HEADER", "some-tag")); // spotless:off Map headers = headers( @@ -189,11 +147,7 @@ void checkW3CTraceContextOverride( String expectedTraceId, @ConvertWith(W3cConstantConverter.class) String expectedSpanId, @ConvertWith(W3cConstantConverter.class) String expectedParentId) { - Config config = mock(Config.class); - when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); - DynamicConfig dynamicConfig = DynamicConfig.create().apply(); - HttpCodec.Extractor extractor = - HttpCodec.createExtractor(config, dynamicConfig::captureTraceConfig); + HttpCodec.Extractor extractor = createExtractor(styles); // spotless:off Map headers = headers( @@ -230,11 +184,7 @@ void verifyExistenceOfSpanLinks( @ConvertWith(W3cConstantConverter.class) String w3cTraceParent, @ConvertWith(W3cConstantConverter.class) String traceState, List expectedSpanLinks) { - Config config = mock(Config.class); - when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); - DynamicConfig dynamicConfig = DynamicConfig.create().apply(); - HttpCodec.Extractor extractor = - HttpCodec.createExtractor(config, dynamicConfig::captureTraceConfig); + HttpCodec.Extractor extractor = createExtractor(styles); // spotless:off Map headers = headers( @@ -264,6 +214,22 @@ private static Set orderedSetOf(List(styles); } + private static HttpCodec.Extractor createExtractor(List styles) { + return createExtractor(styles, false, emptyMap()); + } + + private static HttpCodec.Extractor createExtractor(List styles, boolean extractFirst, Map headerTags) { + Config config = mock(Config.class); + when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); + when(config.isTracePropagationExtractFirst()).thenReturn(extractFirst); + DynamicConfig dynamicConfig = + DynamicConfig.create() + .setHeaderTags(headerTags) + .setBaggageMapping(emptyMap()) + .apply(); + return HttpCodec.createExtractor(config, dynamicConfig::captureTraceConfig); + } + private static Map headers(String... headerKeysAndValues) { HashMap headers = new HashMap<>(); for (int i = 0; i < headerKeysAndValues.length / 2; i++) { @@ -276,4 +242,37 @@ private static Map headers(String... headerKeysAndValues) { } return headers; } + + @TypeConverter + static TracePropagationStyle parseTracePropagationStyle(String value) { + String name = value.trim(); + if (name.startsWith("TracePropagationStyle.")) { + name = name.substring("TracePropagationStyle.".length()); + } + return TracePropagationStyle.valueOf(name); + } + + static class W3cConstantConverter implements ArgumentConverter { + @Override + public Object convert(Object source, ParameterContext context) + throws ArgumentConversionException { + if (source == null) { + return null; + } + switch (source.toString()) { + case "W3C_TRACE_PARENT": + return W3C_TRACE_PARENT; + case "W3C_TRACE_STATE_WITH_P": + return W3C_TRACE_STATE_WITH_P; + case "W3C_TRACE_STATE_NO_P": + return W3C_TRACE_STATE_NO_P; + case "W3C_SPAN_ID_LSTR": + return W3C_SPAN_ID_LSTR; + case "W3C_PARENT_ID": + return W3C_PARENT_ID; + default: + return source; + } + } + } } From f5b19f9d9427441752efe72b460268d486a966e4 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 17:55:32 +0200 Subject: [PATCH 07/15] fix(core): Manually cleaning up AI code --- .../core/propagation/B3HttpExtractorTest.java | 150 +++++++++++------- 1 file changed, 89 insertions(+), 61 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java index 3553f41a919..612d54ff15d 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java @@ -10,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; @@ -26,7 +27,6 @@ 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; @@ -75,14 +75,14 @@ void extractHttpHeaders( String spanIdHex, Integer samplingPriority, @ConvertWith(PrioritySamplingConverter.class) byte expectedSamplingPriority) { - Map 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 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()); @@ -108,13 +108,16 @@ void extractHttpHeadersWithB3HeaderAtTheBeginning( @ConvertWith(PrioritySamplingConverter.class) byte expectedSamplingPriority) { String traceIdHex = "1"; String spanIdHex = "2"; - Map 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 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()); @@ -137,13 +140,16 @@ void extractHttpHeadersWithB3HeaderAtTheEnd( @ConvertWith(PrioritySamplingConverter.class) byte expectedSamplingPriority) { String traceIdHex = "1"; String spanIdHex = "2"; - Map 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 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()); @@ -189,9 +195,12 @@ private Map expectedB3Tags(TagContext context) { }) void extract128BitIdTruncatesIdTo64Bit( String traceId, String spanId, String expectedTraceIdHex, Long expectedSpanId) { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -225,11 +234,14 @@ void extractHeaderTagsWithNoPropagation() { @Test void extractHeadersWithForwarding() { String forwarded = "for=" + FORWARDED_IP + ":" + FORWARDED_PORT; - Map tagOnlyCtx = singletonMap("Forwarded", forwarded); - Map fullCtx = new HashMap<>(); - fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); - fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); - fullCtx.put("Forwarded", forwarded); + Map tagOnlyCtx = headers("Forwarded", forwarded); + // spotless:off + Map fullCtx = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + "Forwarded", forwarded + ); + // spotless:on TagContext context = extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -247,14 +259,18 @@ void extractHeadersWithForwarding() { @Test void extractHeadersWithXForwarding() { - Map tagOnlyCtx = new HashMap<>(); - tagOnlyCtx.put("X-Forwarded-For", FORWARDED_IP); - tagOnlyCtx.put("X-Forwarded-Port", FORWARDED_PORT); - Map 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 tagOnlyCtx = headers( + "X-Forwarded-For", FORWARDED_IP, + "X-Forwarded-Port", FORWARDED_PORT + ); + Map 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()); @@ -279,10 +295,13 @@ void extractEmptyHeadersReturnsNull() { @Test void extractHttpHeadersWithInvalidNonNumericId() { - Map 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 headers = headers( + TRACE_ID_KEY, "traceId", + SPAN_ID_KEY, "spanId", + SOME_HEADER, SOME_VALUE + ); + // spotless:on TagContext context = extractor.extract(headers, stringValuesMap()); @@ -292,10 +311,13 @@ void extractHttpHeadersWithInvalidNonNumericId() { @Test void extractHttpHeadersWithOutOfRangeSpanId() { - Map 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 headers = headers( + TRACE_ID_KEY, "0", + SPAN_ID_KEY, "-1", + SOME_HEADER, SOME_VALUE + ); + // spotless:on TagContext context = extractor.extract(headers, stringValuesMap()); @@ -315,9 +337,12 @@ void extractHttpHeadersWithOutOfRangeSpanId() { }) void extractIdsWhileRetainingTheOriginalString( String traceId, String spanId, long expectedSpanId) { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId + ); + // spotless:on B3TraceId expectedTraceId = B3TraceId.fromHex(traceId); ExtractedContext context = (ExtractedContext) extractor.extract(headers, stringValuesMap()); @@ -342,17 +367,20 @@ private static String trimmed(String hex) { @Test void extractCommonHttpHeaders() { - Map 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 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()); From bc51bcd1826bb43be006babdfbc8d007873c160f Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:01:12 +0200 Subject: [PATCH 08/15] fix(core): Manually cleaning up AI code --- .../propagation/DatadogHttpExtractorTest.java | 225 ++++++++++-------- 1 file changed, 129 insertions(+), 96 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java index 495e9a20a40..771116102b1 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java @@ -13,6 +13,7 @@ import static datadog.trace.core.propagation.DatadogHttpCodec.SAMPLING_PRIORITY_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.SPAN_ID_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.TRACE_ID_KEY; +import static datadog.trace.core.propagation.HttpCodecTestHelper.headers; import static datadog.trace.junit.utils.tabletest.TraceIdConverter.TRACE_ID_MAX_PLUS_1; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -90,21 +91,20 @@ void extractHttpHeaders( @ConvertWith(TraceIdConverter.class) String spanId, @ConvertWith(PrioritySamplingConverter.class) byte samplingPriority, String origin) { - Map headers = new HashMap<>(); - headers.put("", "empty key"); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info,and-more"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); - if (samplingPriority != UNSET) { - headers.put(SAMPLING_PRIORITY_KEY, String.valueOf(samplingPriority)); - } - if (origin != null) { - headers.put(ORIGIN_KEY, origin); - } + // spotless:off + Map headers = headers( + "", "empty key", + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId, + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info,and-more", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2", + SAMPLING_PRIORITY_KEY, samplingPriority != UNSET ? String.valueOf(samplingPriority) : null, + ORIGIN_KEY, origin + ); + // spotless:on ExtractedContext context = (ExtractedContext) extractor.extract(headers, stringValuesMap()); @@ -130,11 +130,14 @@ void extractHttpHeadersWithoutComma() { DynamicConfig.create().setHeaderTags(singletonMap(SOME_HEADER, SOME_TAG)).apply(); this.extractor = DatadogHttpCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), "1"); - headers.put(SPAN_ID_KEY.toUpperCase(), "2"); String headerWithComma = "my-interesting-info,and-more"; - headers.put(SOME_HEADER, headerWithComma); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + SOME_HEADER, headerWithComma + ); + // spotless:on ExtractedContext context = (ExtractedContext) this.extractor.extract(headers, stringValuesMap()); @@ -146,11 +149,12 @@ void extractHttpHeadersWithoutComma() { @ParameterizedTest @ValueSource(booleans = {false, true}) void extractHeaderTagsWithNoPropagation(boolean withOrigin) { - Map headers = new HashMap<>(); - if (withOrigin) { - headers.put(ORIGIN_KEY, "my-origin"); - } - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + ORIGIN_KEY, withOrigin ? "my-origin" : null, + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -167,10 +171,13 @@ void extractHeadersWithForwarding() { String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; Map tagOnlyCtx = singletonMap("Forwarded", forwarded); - Map fullCtx = new HashMap<>(); - fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); - fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); - fullCtx.put("Forwarded", forwarded); + // spotless:off + Map fullCtx = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + "Forwarded", forwarded + ); + // spotless:on TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -190,14 +197,18 @@ void extractHeadersWithForwarding() { void extractHeadersWithXForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; - Map tagOnlyCtx = new HashMap<>(); - tagOnlyCtx.put("X-Forwarded-For", forwardedIp); - tagOnlyCtx.put("X-Forwarded-Port", forwardedPort); - Map fullCtx = new HashMap<>(); - fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); - fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); - fullCtx.put("x-forwarded-for", forwardedIp); - fullCtx.put("x-forwarded-port", forwardedPort); + // spotless:off + Map tagOnlyCtx = headers( + "X-Forwarded-For", forwardedIp, + "X-Forwarded-Port", forwardedPort + ); + Map fullCtx = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + "x-forwarded-for", forwardedIp, + "x-forwarded-port", forwardedPort + ); + // spotless:on TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -273,17 +284,18 @@ void extractHttpHeadersWith128BitTraceId(String hexId) { DD128bTraceId traceId = DD128bTraceId.fromHex(hexId); boolean is128bTrace = traceId.toHighOrderLong() != 0; - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId.toString()); - headers.put(SPAN_ID_KEY.toUpperCase(), "2"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); - if (is128bTrace) { - headers.put( - DATADOG_TAGS_KEY.toUpperCase(), - "_dd.p.tid=" + LongStringUtils.toHexStringPadded(traceId.toHighOrderLong(), 16)); - } + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId.toString(), + SPAN_ID_KEY, "2", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info", + DATADOG_TAGS_KEY, is128bTrace ? + "_dd.p.tid=" + LongStringUtils.toHexStringPadded(traceId.toHighOrderLong(), 16) : + null + ); + // spotless:on ExtractedContext context = (ExtractedContext) this.extractor.extract(headers, stringValuesMap()); @@ -300,12 +312,15 @@ void extractHttpHeadersWith128BitTraceId(String hexId) { @Test void extractHttpHeadersWithInvalidNonNumericId() { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), "traceId"); - headers.put(SPAN_ID_KEY.toUpperCase(), "spanId"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, "traceId", + SPAN_ID_KEY, "spanId", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -314,12 +329,15 @@ void extractHttpHeadersWithInvalidNonNumericId() { @Test void extractHttpHeadersWithOutOfRangeTraceId() { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), TRACE_ID_MAX_PLUS_1); - headers.put(SPAN_ID_KEY.toUpperCase(), "0"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, TRACE_ID_MAX_PLUS_1, + SPAN_ID_KEY, "0", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -328,12 +346,15 @@ void extractHttpHeadersWithOutOfRangeTraceId() { @Test void extractHttpHeadersWithOutOfRangeSpanId() { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), "0"); - headers.put(SPAN_ID_KEY.toUpperCase(), "-1"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, "0", + SPAN_ID_KEY, "-1", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -355,9 +376,12 @@ void moreIdRangeValidation( @ConvertWith(TraceIdConverter.class) String traceId, @ConvertWith(TraceIdConverter.class) String spanId, boolean expectExtraction) { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -376,16 +400,19 @@ void moreIdRangeValidation( "epoch 2021 | '2' | '3' | 1610001234 " }) void extractHttpHeadersWithEndToEnd(String traceId, String spanId, long endToEndStartTime) { - Map headers = new HashMap<>(); - headers.put("", "empty key"); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "t0").toUpperCase(), String.valueOf(endToEndStartTime)); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + // spotless:off + Map headers = headers( + "", "empty key", + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId, + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "t0", String.valueOf(endToEndStartTime), + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2" + ); + // spotless:on ExtractedContext context = (ExtractedContext) this.extractor.extract(headers, stringValuesMap()); @@ -413,13 +440,16 @@ void baggageIsMappedOnContextCreation( @ConvertWith(TraceIdConverter.class) String traceId, @ConvertWith(TraceIdConverter.class) String spanId, boolean ctxCreated) { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "mappedBaggageValue"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_ARBITRARY_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId, + SOME_CUSTOM_BAGGAGE_HEADER, "mappedBaggageValue", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_ARBITRARY_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -437,17 +467,20 @@ void baggageIsMappedOnContextCreation( @Test void extractCommonHttpHeaders() { - Map 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 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 = this.extractor.extract(headers, stringValuesMap()); From 17234f4fe9d460f98e23719eb4250d2c20a17372 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:03:21 +0200 Subject: [PATCH 09/15] fix(core): Manually cleaning up AI code --- .../HaystackHttpExtractorTest.java | 150 +++++++++++------- 1 file changed, 89 insertions(+), 61 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java index 111fbc0c2d5..8400c4ce6d2 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java @@ -9,6 +9,7 @@ import static datadog.trace.core.propagation.HaystackHttpCodec.OT_BAGGAGE_PREFIX; import static datadog.trace.core.propagation.HaystackHttpCodec.SPAN_ID_KEY; import static datadog.trace.core.propagation.HaystackHttpCodec.TRACE_ID_KEY; +import static datadog.trace.core.propagation.HttpCodecTestHelper.headers; import static datadog.trace.junit.utils.tabletest.TraceIdConverter.TRACE_ID_MAX_MINUS_1; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -82,16 +83,19 @@ void extractHttpHeaders( String spanId, String traceUuid, String spanUuid) { - Map headers = new HashMap<>(); - headers.put("", "empty key"); - headers.put(TRACE_ID_KEY.toUpperCase(), traceUuid); - headers.put(SPAN_ID_KEY.toUpperCase(), spanUuid); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "%76%32"); // v2 encoded once - headers.put((OT_BAGGAGE_PREFIX + "k3").toUpperCase(), "%25%37%36%25%33%33"); // v3 encoded twice - headers.put(SOME_HEADER, "my-interesting-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + // spotless:off + Map headers = headers( + "", "empty key", + TRACE_ID_KEY, traceUuid, + SPAN_ID_KEY, spanUuid, + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "%76%32", // v2 encoded once + OT_BAGGAGE_PREFIX + "k3", "%25%37%36%25%33%33", // v3 encoded twice + SOME_HEADER, "my-interesting-info", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2" + ); + // spotless:on ExtractedContext context = (ExtractedContext) this.extractor.extract(headers, stringValuesMap()); @@ -128,10 +132,13 @@ void extractHeadersWithForwarding() { String forwardedPort = "123"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; Map tagOnlyCtx = singletonMap("Forwarded", forwarded); - Map fullCtx = new HashMap<>(); - fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); - fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); - fullCtx.put("Forwarded", forwarded); + // spotless:off + Map fullCtx = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + "Forwarded", forwarded + ); + // spotless:on TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -151,14 +158,18 @@ void extractHeadersWithForwarding() { void extractHeadersWithXForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "123"; - Map tagOnlyCtx = new HashMap<>(); - tagOnlyCtx.put("X-Forwarded-For", forwardedIp); - tagOnlyCtx.put("X-Forwarded-Port", forwardedPort); - Map fullCtx = new HashMap<>(); - fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); - fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); - fullCtx.put("x-forwarded-for", forwardedIp); - fullCtx.put("x-forwarded-port", forwardedPort); + // spotless:off + Map tagOnlyCtx = headers( + "X-Forwarded-For", forwardedIp, + "X-Forwarded-Port", forwardedPort + ); + Map fullCtx = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + "x-forwarded-for", forwardedIp, + "x-forwarded-port", forwardedPort + ); + // spotless:on TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -183,12 +194,15 @@ void extractEmptyHeadersReturnsNull() { @Test void extractHttpHeadersWithInvalidNonNumericId() { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), "traceId"); - headers.put(SPAN_ID_KEY.toUpperCase(), "spanId"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, "traceId", + SPAN_ID_KEY, "spanId", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -197,12 +211,15 @@ void extractHttpHeadersWithInvalidNonNumericId() { @Test void extractHttpHeadersWithOutOfRangeTraceId() { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), TRACE_ID_MAX_MINUS_1); - headers.put(SPAN_ID_KEY.toUpperCase(), "0"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, TRACE_ID_MAX_MINUS_1, + SPAN_ID_KEY, "0", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -211,12 +228,15 @@ void extractHttpHeadersWithOutOfRangeTraceId() { @Test void extractHttpHeadersWithOutOfRangeSpanId() { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), "0"); - headers.put(SPAN_ID_KEY.toUpperCase(), "-1"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, "0", + SPAN_ID_KEY, "-1", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -231,13 +251,16 @@ void extractHttpHeadersWithOutOfRangeSpanId() { "uuid format | '44617461-646f-6721-463a-c35c9f6413ad' | '44617461-646f-6721-463a-c35c9f6413ad' | true " }) void baggageIsMappedOnContextCreation(String traceId, String spanId, boolean ctxCreated) { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "mappedBaggageValue"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_ARBITRARY_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId, + SOME_CUSTOM_BAGGAGE_HEADER, "mappedBaggageValue", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_ARBITRARY_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -278,9 +301,11 @@ void extract128BitIdTruncatesIdTo64Bit( Long expectedTraceIdLong, long expectedSpanId, boolean ctxCreated) { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -297,17 +322,20 @@ void extract128BitIdTruncatesIdTo64Bit( @Test void extractCommonHttpHeaders() { - Map 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 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 = this.extractor.extract(headers, stringValuesMap()); From 3766f252fe15bc9558e3e4faafb5f054e5d3b1cb Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:03:36 +0200 Subject: [PATCH 10/15] fix(core): Manually cleaning up AI code --- .../core/propagation/HttpCodecTestHelper.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpCodecTestHelper.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpCodecTestHelper.java index 00e0d460572..a109c935cf7 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpCodecTestHelper.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpCodecTestHelper.java @@ -2,6 +2,8 @@ import datadog.trace.api.Config; import datadog.trace.api.TraceConfig; +import java.util.HashMap; +import java.util.Map; import java.util.function.Supplier; /** Helper class used only for tests to bridge package-private classes */ @@ -14,4 +16,17 @@ public static HttpCodec.Extractor newW3cHttpCodecExtractor( Config config, Supplier traceConfigSupplier) { return W3CHttpCodec.newExtractor(config, traceConfigSupplier); } + + static Map headers(String... headerKeysAndValues) { + HashMap headers = new HashMap<>(); + for (int i = 0; i < headerKeysAndValues.length / 2; i++) { + String headerValue = headerKeysAndValues[i * 2 + 1]; + if (headerValue == null) { + continue; + } + String headerName = headerKeysAndValues[i * 2].toUpperCase(); + headers.put(headerName, headerValue); + } + return headers; + } } From b0480cea88760f4f88eb4c76a56299dd66c7271a Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:04:12 +0200 Subject: [PATCH 11/15] fix(core): Manually cleaning up AI code --- .../core/propagation/HttpExtractorTest.java | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java index 0ddc1f9fcd0..eb9727cc4a7 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HttpExtractorTest.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap; import static datadog.trace.core.propagation.B3HttpCodec.B3_SPAN_ID; import static datadog.trace.core.propagation.B3HttpCodec.B3_TRACE_ID; +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; @@ -22,7 +23,6 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpanLink; import datadog.trace.bootstrap.instrumentation.api.TagContext; import datadog.trace.test.util.DDJavaSpecification; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -86,7 +86,8 @@ void extractHttpHeadersUsingStyles( boolean expectDatadogFields, boolean tagContext, boolean extractFirst) { - HttpCodec.Extractor extractor = createExtractor(styles, extractFirst, singletonMap("SOME_HEADER", "some-tag")); + HttpCodec.Extractor extractor = + createExtractor(styles, extractFirst, singletonMap("SOME_HEADER", "some-tag")); // spotless:off Map headers = headers( @@ -218,31 +219,16 @@ private static HttpCodec.Extractor createExtractor(List s return createExtractor(styles, false, emptyMap()); } - private static HttpCodec.Extractor createExtractor(List styles, boolean extractFirst, Map headerTags) { + private static HttpCodec.Extractor createExtractor( + List styles, boolean extractFirst, Map headerTags) { Config config = mock(Config.class); when(config.getTracePropagationStylesToExtract()).thenReturn(orderedSetOf(styles)); - when(config.isTracePropagationExtractFirst()).thenReturn(extractFirst); + when(config.isTracePropagationExtractFirst()).thenReturn(extractFirst); DynamicConfig dynamicConfig = - DynamicConfig.create() - .setHeaderTags(headerTags) - .setBaggageMapping(emptyMap()) - .apply(); + DynamicConfig.create().setHeaderTags(headerTags).setBaggageMapping(emptyMap()).apply(); return HttpCodec.createExtractor(config, dynamicConfig::captureTraceConfig); } - private static Map headers(String... headerKeysAndValues) { - HashMap headers = new HashMap<>(); - for (int i = 0; i < headerKeysAndValues.length / 2; i++) { - String headerValue = headerKeysAndValues[i * 2 + 1]; - if (headerValue == null) { - continue; - } - String headerName = headerKeysAndValues[i * 2].toUpperCase(); - headers.put(headerName, headerValue); - } - return headers; - } - @TypeConverter static TracePropagationStyle parseTracePropagationStyle(String value) { String name = value.trim(); From bffba018bc72c97c8e8a80708311787ada1fa2b5 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:08:27 +0200 Subject: [PATCH 12/15] fix(core): Manually cleaning up AI code --- .../propagation/DatadogHttpExtractorTest.java | 6 +- .../propagation/NoneHttpExtractorTest.java | 151 ++++++++++-------- 2 files changed, 90 insertions(+), 67 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java index 771116102b1..18692f8c4fb 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java @@ -291,9 +291,9 @@ void extractHttpHeadersWith128BitTraceId(String hexId) { OT_BAGGAGE_PREFIX + "k1", "v1", OT_BAGGAGE_PREFIX + "k2", "v2", SOME_HEADER, "my-interesting-info", - DATADOG_TAGS_KEY, is128bTrace ? - "_dd.p.tid=" + LongStringUtils.toHexStringPadded(traceId.toHighOrderLong(), 16) : - null + DATADOG_TAGS_KEY, is128bTrace + ? "_dd.p.tid=" + LongStringUtils.toHexStringPadded(traceId.toHighOrderLong(), 16) + : null ); // spotless:on diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java index 432573564a9..2eedf620fab 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java @@ -10,6 +10,7 @@ import static datadog.trace.core.propagation.DatadogHttpCodec.OT_BAGGAGE_PREFIX; import static datadog.trace.core.propagation.DatadogHttpCodec.SPAN_ID_KEY; import static datadog.trace.core.propagation.DatadogHttpCodec.TRACE_ID_KEY; +import static datadog.trace.core.propagation.HttpCodecTestHelper.headers; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -82,15 +83,18 @@ void teardown() { void extractHttpHeaders( @ConvertWith(TraceIdConverter.class) String traceId, @ConvertWith(TraceIdConverter.class) String spanId) { - Map headers = new HashMap<>(); - headers.put("", "empty key"); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId); - headers.put(SPAN_ID_KEY.toUpperCase(), spanId); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info,and-more"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + // spotless:off + Map headers = headers( + "", "empty key", + TRACE_ID_KEY, traceId, + SPAN_ID_KEY, spanId, + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info,and-more", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -120,15 +124,18 @@ void extractHttpHeadersWithoutComma() { .apply(); this.extractor = NoneCodec.newExtractor(Config.get(), dynamicConfig::captureTraceConfig); - Map headers = new HashMap<>(); - headers.put("", "empty key"); - headers.put(TRACE_ID_KEY.toUpperCase(), "2"); - headers.put(SPAN_ID_KEY.toUpperCase(), "3"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info,and-more"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + // spotless:off + Map headers = headers( + "", "empty key", + TRACE_ID_KEY, "2", + SPAN_ID_KEY, "3", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info,and-more", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -144,11 +151,12 @@ void extractHttpHeadersWithoutComma() { @ParameterizedTest @ValueSource(booleans = {false, true}) void extractHeaderTagsWithNoPropagation(boolean withOrigin) { - Map headers = new HashMap<>(); - if (withOrigin) { - headers.put(ORIGIN_KEY, "my-origin"); - } - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + ORIGIN_KEY, withOrigin ? "my-origin" : null, + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -162,11 +170,16 @@ void extractHeadersWithForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; - Map tagOnlyCtx = singletonMap("Forwarded", forwarded); - Map fullCtx = new HashMap<>(); - fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); - fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); - fullCtx.put("Forwarded", forwarded); + Map tagOnlyCtx = headers( + "Forwarded", forwarded + ); + // spotless:off + Map fullCtx = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + "Forwarded", forwarded + ); + // spotless:on TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -186,14 +199,18 @@ void extractHeadersWithForwarding() { void extractHeadersWithXForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; - Map tagOnlyCtx = new HashMap<>(); - tagOnlyCtx.put("X-Forwarded-For", forwardedIp); - tagOnlyCtx.put("X-Forwarded-Port", forwardedPort); - Map fullCtx = new HashMap<>(); - fullCtx.put(TRACE_ID_KEY.toUpperCase(), "1"); - fullCtx.put(SPAN_ID_KEY.toUpperCase(), "2"); - fullCtx.put("x-forwarded-for", forwardedIp); - fullCtx.put("x-forwarded-port", forwardedPort); + // spotless:off + Map tagOnlyCtx = headers( + "X-Forwarded-For", forwardedIp, + "X-Forwarded-Port", forwardedPort + ); + Map fullCtx = headers( + TRACE_ID_KEY, "1", + SPAN_ID_KEY, "2", + "x-forwarded-for", forwardedIp, + "x-forwarded-port", forwardedPort + ); + // spotless:on TagContext context = this.extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -269,17 +286,18 @@ void customIpHeaderCollectionDoesNotDisableStandardIpHeaderCollection() { void extractHttpHeadersWith128BitTraceId(String hexId) { DD128bTraceId traceId = DD128bTraceId.fromHex(hexId); boolean is128bTrace = traceId.toHighOrderLong() != 0; - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), traceId.toString()); - headers.put(SPAN_ID_KEY.toUpperCase(), "2"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); - if (is128bTrace) { - headers.put( - DATADOG_TAGS_KEY.toUpperCase(), - "_dd.p.tid=" + LongStringUtils.toHexStringPadded(traceId.toHighOrderLong(), 16)); - } + // spotless:off + Map headers = headers( + TRACE_ID_KEY, traceId.toString(), + SPAN_ID_KEY, "2", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info", + DATADOG_TAGS_KEY, is128bTrace + ? "_dd.p.tid=" + LongStringUtils.toHexStringPadded(traceId.toHighOrderLong(), 16) + : null + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -291,12 +309,15 @@ void extractHttpHeadersWith128BitTraceId(String hexId) { @Test void extractHttpHeadersWithInvalidNonNumericId() { - Map headers = new HashMap<>(); - headers.put(TRACE_ID_KEY.toUpperCase(), "traceId"); - headers.put(SPAN_ID_KEY.toUpperCase(), "spanId"); - headers.put((OT_BAGGAGE_PREFIX + "k1").toUpperCase(), "v1"); - headers.put((OT_BAGGAGE_PREFIX + "k2").toUpperCase(), "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + TRACE_ID_KEY, "traceId", + SPAN_ID_KEY,"spanId", + OT_BAGGAGE_PREFIX + "k1", "v1", + OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -306,17 +327,19 @@ void extractHttpHeadersWithInvalidNonNumericId() { @Test void extractCommonHttpHeaders() { - Map 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 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 = this.extractor.extract(headers, stringValuesMap()); From 39559e07c0cfa9decad63b742738acd1419e6ca4 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:11:35 +0200 Subject: [PATCH 13/15] fix(core): Manually cleaning up AI code --- .../propagation/W3CHttpExtractorTest.java | 134 ++++++++++-------- 1 file changed, 74 insertions(+), 60 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java index f72e1068b5e..6f5037a0668 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java @@ -1,6 +1,7 @@ package datadog.trace.core.propagation; import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap; +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; @@ -110,10 +111,7 @@ void extractTraceparent( String traceIdHex, long spanId, @ConvertWith(PrioritySamplingConverter.class) byte priority) { - Map headers = new LinkedHashMap<>(); - if (traceparent != null) { - headers.put(W3CHttpCodec.TRACE_PARENT_KEY, traceparent); - } + Map headers = headers(W3CHttpCodec.TRACE_PARENT_KEY, traceparent); TagContext result = extractor().extract(headers, stringValuesMap()); @@ -154,15 +152,18 @@ void extractTraceparentTracestateAndHttpHeaders( @ConvertWith(PrioritySamplingConverter.class) byte priority, @ConvertWith(SamplingMechanismConverter.class) Byte decisionMaker, String origin) { - Map headers = new LinkedHashMap<>(); - headers.put("", "empty key"); - headers.put(W3CHttpCodec.TRACE_PARENT_KEY.toUpperCase(), traceparent); - headers.put(W3CHttpCodec.TRACE_STATE_KEY.toUpperCase(), tracestate); - headers.put(W3CHttpCodec.OT_BAGGAGE_PREFIX.toUpperCase() + "k1", "v1"); - headers.put(W3CHttpCodec.OT_BAGGAGE_PREFIX.toUpperCase() + "k2", "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + // spotless:off + Map headers = headers( + "", "empty key", + W3CHttpCodec.TRACE_PARENT_KEY, traceparent, + W3CHttpCodec.TRACE_STATE_KEY, tracestate, + W3CHttpCodec.OT_BAGGAGE_PREFIX + "k1", "v1", + W3CHttpCodec.OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2" + ); + // spotless:on ExtractedContext context = (ExtractedContext) extractor().extract(headers, stringValuesMap()); @@ -203,12 +204,15 @@ void extractHeadersWithForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; - Map tagOnlyCtx = singletonMap("Forwarded", forwarded); - Map fullCtx = new LinkedHashMap<>(); - fullCtx.put( - W3CHttpCodec.TRACE_PARENT_KEY.toUpperCase(), - "00-00000000000000000000000000000001-0000000000000002-01"); - fullCtx.put("Forwarded", forwarded); + Map tagOnlyCtx = headers( + "Forwarded", forwarded + ); + // spotless:off + Map fullCtx = headers( + W3CHttpCodec.TRACE_PARENT_KEY, "00-00000000000000000000000000000001-0000000000000002-01", + "Forwarded", forwarded + ); + // spotless:on TagContext context = extractor().extract(tagOnlyCtx, stringValuesMap()); @@ -228,15 +232,17 @@ void extractHeadersWithForwarding() { void extractHeadersWithXForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; - Map tagOnlyCtx = new LinkedHashMap<>(); - tagOnlyCtx.put("X-Forwarded-For", forwardedIp); - tagOnlyCtx.put("X-Forwarded-Port", forwardedPort); - Map fullCtx = new LinkedHashMap<>(); - fullCtx.put( - W3CHttpCodec.TRACE_PARENT_KEY.toUpperCase(), - "00-00000000000000000000000000000001-0000000000000002-01"); - fullCtx.put("x-forwarded-for", forwardedIp); - fullCtx.put("x-forwarded-port", forwardedPort); + // spotless:off + Map tagOnlyCtx = headers( + "X-Forwarded-For", forwardedIp, + "X-Forwarded-Port", forwardedPort + ); + Map fullCtx = headers( + W3CHttpCodec.TRACE_PARENT_KEY, "00-00000000000000000000000000000001-0000000000000002-01", + "x-forwarded-for", forwardedIp, + "x-forwarded-port", forwardedPort + ); + // spotless:on TagContext context = extractor().extract(tagOnlyCtx, stringValuesMap()); @@ -307,18 +313,18 @@ void customIpHeaderCollectionDoesNotDisableStandardIpHeaderCollection() { "non-zero start time | 1610001234 " }) void extractHttpHeadersWithEndToEnd(long endToEndStartTime) { - Map headers = new LinkedHashMap<>(); - headers.put("", "empty key"); - headers.put( - W3CHttpCodec.TRACE_PARENT_KEY.toUpperCase(), - "00-00000000000000000000000000000001-123456789abcdef0-01"); - headers.put(W3CHttpCodec.OT_BAGGAGE_PREFIX.toUpperCase() + "k1", "v1"); - headers.put( - W3CHttpCodec.OT_BAGGAGE_PREFIX.toUpperCase() + "t0", String.valueOf(endToEndStartTime)); - headers.put(W3CHttpCodec.OT_BAGGAGE_PREFIX.toUpperCase() + "k2", "v2"); - headers.put(SOME_HEADER, "my-interesting-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + // spotless:off + Map headers = headers( + "", "empty key", + W3CHttpCodec.TRACE_PARENT_KEY, "00-00000000000000000000000000000001-123456789abcdef0-01", + W3CHttpCodec.OT_BAGGAGE_PREFIX + "k1", "v1", + W3CHttpCodec.OT_BAGGAGE_PREFIX + "t0", String.valueOf(endToEndStartTime), + W3CHttpCodec.OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_HEADER, "my-interesting-info", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2" + ); + // spotless:on ExtractedContext context = (ExtractedContext) extractor().extract(headers, stringValuesMap()); @@ -341,12 +347,15 @@ void extractHttpHeadersWithEndToEnd(long endToEndStartTime) { "valid traceparent | true | '00-00000000000000000000000000000001-0000000000000001-01'" }) void baggageIsMappedOnContextCreation(boolean tpValid, String traceparent) { - Map headers = new LinkedHashMap<>(); - headers.put(W3CHttpCodec.TRACE_PARENT_KEY, traceparent); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "mappedBaggageValue"); - headers.put(W3CHttpCodec.OT_BAGGAGE_PREFIX.toUpperCase() + "k1", "v1"); - headers.put(W3CHttpCodec.OT_BAGGAGE_PREFIX.toUpperCase() + "k2", "v2"); - headers.put(SOME_ARBITRARY_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + W3CHttpCodec.TRACE_PARENT_KEY, traceparent, + SOME_CUSTOM_BAGGAGE_HEADER, "mappedBaggageValue", + W3CHttpCodec.OT_BAGGAGE_PREFIX + "k1", "v1", + W3CHttpCodec.OT_BAGGAGE_PREFIX + "k2", "v2", + SOME_ARBITRARY_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = extractor().extract(headers, stringValuesMap()); @@ -364,17 +373,20 @@ void baggageIsMappedOnContextCreation(boolean tpValid, String traceparent) { @Test void extractCommonHttpHeaders() { - Map headers = new LinkedHashMap<>(); - 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 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()); @@ -398,9 +410,11 @@ void extractCommonHttpHeaders() { }) void markInconsistentTidAsPropagationError( String traceparent, String tracestate, boolean consistent) { - Map headers = new LinkedHashMap<>(); - headers.put(W3CHttpCodec.TRACE_PARENT_KEY.toUpperCase(), traceparent); - headers.put(W3CHttpCodec.TRACE_STATE_KEY.toUpperCase(), tracestate); + // spotless:off + Map headers = headers( + W3CHttpCodec.TRACE_PARENT_KEY, traceparent, + W3CHttpCodec.TRACE_STATE_KEY, tracestate); + // spotless:on ExtractedContext context = (ExtractedContext) extractor().extract(headers, stringValuesMap()); From 4a4b757ea9c66cb9da6edad0d433ade5a87a2f5e Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:14:01 +0200 Subject: [PATCH 14/15] fix(core): Manually cleaning up AI code --- .../propagation/XRayHttpExtractorTest.java | 82 +++++++++++-------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java index 06c63192cab..fe64c172070 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java @@ -1,6 +1,7 @@ package datadog.trace.core.propagation; import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap; +import static datadog.trace.core.propagation.HttpCodecTestHelper.headers; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -70,18 +71,19 @@ void extractHttpHeaders( String spanId, String samplingPriority, @ConvertWith(PrioritySamplingConverter.class) byte expectedSamplingPriority) { - Map headers = new LinkedHashMap<>(); - headers.put( - "X-Amzn-Trace-Id", - "Root=1-00000000-00000000" + // spotless:off + Map headers = headers( + "X-Amzn-Trace-Id", "Root=1-00000000-00000000" + padLeft(traceId, 16, '0') + ";Parent=" + padLeft(spanId, 16, '0') + samplingPriority - + ";=empty key;empty value=;=;;"); - headers.put(SOME_HEADER, "my-interesting-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info"); - headers.put(SOME_CUSTOM_BAGGAGE_HEADER_2, "my-interesting-baggage-info-2"); + + ";=empty key;empty value=;=;;", + SOME_HEADER, "my-interesting-info", + SOME_CUSTOM_BAGGAGE_HEADER, "my-interesting-baggage-info", + SOME_CUSTOM_BAGGAGE_HEADER_2,"my-interesting-baggage-info-2" + ); + // spotless:on ExtractedContext context = (ExtractedContext) extractor.extract(headers, stringValuesMap()); @@ -113,10 +115,12 @@ void extractHeadersWithForwarding() { String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; Map tagOnlyCtx = singletonMap("Forwarded", forwarded); - Map fullCtx = new LinkedHashMap<>(); - fullCtx.put( - "x-amzn-trace-id", "Root=1-00000000-000000000000000000000001;Parent=0000000000000002"); - fullCtx.put("Forwarded", forwarded); + // spotless:off + Map fullCtx = headers( + "x-amzn-trace-id", "Root=1-00000000-000000000000000000000001;Parent=0000000000000002", + "Forwarded", forwarded + ); + // spotless:on TagContext context = extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -136,14 +140,17 @@ void extractHeadersWithForwarding() { void extractHeadersWithXForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; - Map tagOnlyCtx = new LinkedHashMap<>(); - tagOnlyCtx.put("X-Forwarded-For", forwardedIp); - tagOnlyCtx.put("X-Forwarded-Port", forwardedPort); - Map fullCtx = new LinkedHashMap<>(); - fullCtx.put( - "x-amzn-trace-id", "Root=1-00000000-000000000000000000000001;Parent=0000000000000002"); - fullCtx.put("x-forwarded-for", forwardedIp); - fullCtx.put("x-forwarded-port", forwardedPort); + // spotless:off + Map tagOnlyCtx = headers( + "X-Forwarded-For", forwardedIp, + "X-Forwarded-Port", forwardedPort + ); + Map fullCtx = headers( + "x-amzn-trace-id", "Root=1-00000000-000000000000000000000001;Parent=0000000000000002", + "x-forwarded-for", forwardedIp, + "x-forwarded-port", forwardedPort + ); + // spotless:on TagContext context = extractor.extract(tagOnlyCtx, stringValuesMap()); @@ -169,10 +176,12 @@ void noContextWithEmptyHeaders() { @Test void noContextWithInvalidNonNumericId() { - Map headers = new LinkedHashMap<>(); - headers.put( - "x-amzn-trace-Id", "Root=1-00000000-00000000000000000traceId;Parent=0000000000spanId"); - headers.put(SOME_HEADER, "my-interesting-info"); + // spotless:off + Map headers = headers( + "x-amzn-trace-Id", "Root=1-00000000-00000000000000000traceId;Parent=0000000000spanId", + SOME_HEADER, "my-interesting-info" + ); + // spotless:on TagContext context = extractor.extract(headers, stringValuesMap()); @@ -259,17 +268,20 @@ void extractHeadersWithEndToEnd(String traceId, String spanId, long endToEndStar @Test void extractCommonHttpHeaders() { - Map headers = new LinkedHashMap<>(); - 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 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()); From ea8157950359505e4fba4d16e3c0edab30ca445b Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 5 Jun 2026 18:19:52 +0200 Subject: [PATCH 15/15] fix(core): Manually cleaning up AI code --- .../core/propagation/B3HttpExtractorTest.java | 3 +-- .../propagation/DatadogHttpExtractorTest.java | 4 ++-- .../propagation/HaystackHttpExtractorTest.java | 4 ++-- .../core/propagation/NoneHttpExtractorTest.java | 6 ++---- .../core/propagation/W3CHttpExtractorTest.java | 9 +++------ .../core/propagation/XRayHttpExtractorTest.java | 15 +++++++-------- .../core/propagation/XRayHttpInjectorTest.java | 3 ++- 7 files changed, 19 insertions(+), 25 deletions(-) diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java index 612d54ff15d..9ec455ff233 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/B3HttpExtractorTest.java @@ -289,8 +289,7 @@ void extractHeadersWithXForwarding() { @Test void extractEmptyHeadersReturnsNull() { - assertNull( - extractor.extract(singletonMap("ignored-header", "ignored-value"), stringValuesMap())); + assertNull(extractor.extract(headers("ignored-header", "ignored-value"), stringValuesMap())); } @Test diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java index 18692f8c4fb..fcd680711ff 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/DatadogHttpExtractorTest.java @@ -170,7 +170,7 @@ void extractHeadersWithForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; - Map tagOnlyCtx = singletonMap("Forwarded", forwarded); + Map tagOnlyCtx = headers("Forwarded", forwarded); // spotless:off Map fullCtx = headers( TRACE_ID_KEY, "1", @@ -227,7 +227,7 @@ void extractHeadersWithXForwarding() { @Test void extractEmptyHeadersReturnsNull() { - Map headers = singletonMap("ignored-header", "ignored-value"); + Map headers = headers("ignored-header", "ignored-value"); assertNull(this.extractor.extract(headers, stringValuesMap())); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java index 8400c4ce6d2..59e9d9dfb66 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/HaystackHttpExtractorTest.java @@ -118,7 +118,7 @@ void extractHttpHeaders( @Test void extractHeaderTagsWithNoPropagation() { - Map headers = singletonMap(SOME_HEADER, "my-interesting-info"); + Map headers = headers(SOME_HEADER, "my-interesting-info"); TagContext context = this.extractor.extract(headers, stringValuesMap()); @@ -131,7 +131,7 @@ void extractHeadersWithForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "123"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; - Map tagOnlyCtx = singletonMap("Forwarded", forwarded); + Map tagOnlyCtx = headers("Forwarded", forwarded); // spotless:off Map fullCtx = headers( TRACE_ID_KEY, "1", diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java index 2eedf620fab..81d885b0b2f 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/NoneHttpExtractorTest.java @@ -170,9 +170,7 @@ void extractHeadersWithForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; - Map tagOnlyCtx = headers( - "Forwarded", forwarded - ); + Map tagOnlyCtx = headers("Forwarded", forwarded); // spotless:off Map fullCtx = headers( TRACE_ID_KEY, "1", @@ -231,7 +229,7 @@ void extractHeadersWithXForwarding() { @Test void extractEmptyHeadersReturnsNull() { assertNull( - this.extractor.extract(singletonMap("ignored-header", "ignored-value"), stringValuesMap())); + this.extractor.extract(headers("ignored-header", "ignored-value"), stringValuesMap())); } @Test diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java index 6f5037a0668..8ee8c4ecf33 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CHttpExtractorTest.java @@ -191,7 +191,7 @@ void extractTraceparentTracestateAndHttpHeaders( @Test void extractHeaderTagsWithNoPropagation() { - Map headers = singletonMap(SOME_HEADER, "my-interesting-info"); + Map headers = headers(SOME_HEADER, "my-interesting-info"); TagContext context = extractor().extract(headers, stringValuesMap()); @@ -204,9 +204,7 @@ void extractHeadersWithForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; - Map tagOnlyCtx = headers( - "Forwarded", forwarded - ); + Map tagOnlyCtx = headers("Forwarded", forwarded); // spotless:off Map fullCtx = headers( W3CHttpCodec.TRACE_PARENT_KEY, "00-00000000000000000000000000000001-0000000000000002-01", @@ -262,8 +260,7 @@ void extractHeadersWithXForwarding() { @Test void extractEmptyHeadersReturnsNull() { - assertNull( - extractor().extract(singletonMap("ignored-header", "ignored-value"), stringValuesMap())); + assertNull(extractor().extract(headers("ignored-header", "ignored-value"), stringValuesMap())); } @Test diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java index fe64c172070..ca9dac478ff 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpExtractorTest.java @@ -101,7 +101,7 @@ void extractHttpHeaders( @Test void extractHeaderTagsWithNoPropagation() { - Map headers = singletonMap(SOME_HEADER, "my-interesting-info"); + Map headers = headers(SOME_HEADER, "my-interesting-info"); TagContext context = extractor.extract(headers, stringValuesMap()); @@ -114,7 +114,7 @@ void extractHeadersWithForwarding() { String forwardedIp = "1.2.3.4"; String forwardedPort = "1234"; String forwarded = "for=" + forwardedIp + ":" + forwardedPort; - Map tagOnlyCtx = singletonMap("Forwarded", forwarded); + Map tagOnlyCtx = headers("Forwarded", forwarded); // spotless:off Map fullCtx = headers( "x-amzn-trace-id", "Root=1-00000000-000000000000000000000001;Parent=0000000000000002", @@ -170,8 +170,7 @@ void extractHeadersWithXForwarding() { @Test void noContextWithEmptyHeaders() { - assertNull( - extractor.extract(singletonMap("ignored-header", "ignored-value"), stringValuesMap())); + assertNull(extractor.extract(headers("ignored-header", "ignored-value"), stringValuesMap())); } @Test @@ -191,7 +190,7 @@ void noContextWithInvalidNonNumericId() { @Test void noContextWithTooLargeTraceId() { Map headers = - singletonMap( + headers( "X-Amzn-Trace-Id", "Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8"); TagContext context = extractor.extract(headers, stringValuesMap()); @@ -202,7 +201,7 @@ void noContextWithTooLargeTraceId() { @Test void extractHttpHeadersWithNonZeroEpoch() { Map headers = - singletonMap( + headers( "X-Amzn-Trace-Id", "Root=1-5759e988-00000000e1be46a994272793;Parent=53995c3f42cd8ad8"); TagContext context = extractor.extract(headers, stringValuesMap()); @@ -223,7 +222,7 @@ void extractHttpHeadersWithNonZeroEpoch() { void extractIdsWhileRetainingTheOriginalString( String traceId, String spanId, String expectedTraceIdHex, long expectedSpanId) { Map headers = - singletonMap( + headers( "X-Amzn-Trace-Id", "Root=1-00000000-00000000" + padLeft(traceId, 16, '0') @@ -245,7 +244,7 @@ void extractIdsWhileRetainingTheOriginalString( }) void extractHeadersWithEndToEnd(String traceId, String spanId, long endToEndStartTime) { Map headers = - singletonMap( + headers( "X-Amzn-Trace-Id", "Root=1-00000000-00000000" + padLeft(traceId, 16, '0') diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java index bfbf9190f04..886d686c9e3 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/XRayHttpInjectorTest.java @@ -1,6 +1,7 @@ package datadog.trace.core.propagation; import static datadog.trace.bootstrap.instrumentation.api.ContextVisitors.stringValuesMap; +import static datadog.trace.core.propagation.HttpCodecTestHelper.headers; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; import static org.mockito.Mockito.clearInvocations; @@ -106,7 +107,7 @@ void injectHttpHeadersWithExtractedOriginal( .timeSource(timeSource) .build(); Map headers = - singletonMap( + headers( "X-Amzn-Trace-Id", "Root=1-00000000-00000000" + padLeft(traceId, 16, '0')