From 6c3f12acf5d761ca176e6a7d438b4fc62dda6925 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Thu, 18 Dec 2025 10:10:47 +0100 Subject: [PATCH 1/2] Remove RadixTreeCache for int status and protect httpStatus short cache --- .../instrumentation/decorator/BaseDecorator.java | 4 +--- .../main/java/datadog/trace/core/DDSpanContext.java | 12 +++++++++++- .../java/datadog/trace/api/cache/RadixTreeCache.java | 3 --- .../trace/api/cache/RadixTreeCacheTest.groovy | 7 ------- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java index 122e76c5fbd..e07b06c3439 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java @@ -1,6 +1,5 @@ package datadog.trace.bootstrap.instrumentation.decorator; -import static datadog.trace.api.cache.RadixTreeCache.PORTS; import static datadog.trace.api.cache.RadixTreeCache.UNSET_PORT; import static datadog.trace.bootstrap.instrumentation.java.net.HostNameResolver.hostName; @@ -153,9 +152,8 @@ public AgentSpan setPeerPort(AgentSpan span, String port) { public AgentSpan setPeerPort(AgentSpan span, int port) { if (port > UNSET_PORT) { - span.setTag(Tags.PEER_PORT, PORTS.get(port)); + span.setTag(Tags.PEER_PORT, port); } - return span; } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java index 63c09832344..d1b77b76523 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java @@ -1092,7 +1092,7 @@ public void processTagsAndBaggage( samplingPriority != PrioritySampling.UNSET ? samplingPriority : getSamplingPriority(), measured, topLevel, - httpStatusCode == 0 ? null : HTTP_STATUSES.get(httpStatusCode), + httpStatusCode == 0 ? null : shortStatusCodeToString(httpStatusCode), // Get origin from rootSpan.context getOrigin(), longRunningVersion, @@ -1100,6 +1100,16 @@ public void processTagsAndBaggage( } } + private UTF8BytesString shortStatusCodeToString(short httpStatusCode) { + try { + return HTTP_STATUSES.get(httpStatusCode); + } catch (Throwable t) { + // RadixTreeCache seems to have issues on semeru11 - NPE on AtomicReferenceArray cas + // skip the cache in those cases and just create a String + return UTF8BytesString.create(Short.toString(httpStatusCode)); + } + } + void injectW3CBaggageTags(Map baggageItemsWithPropagationTags) { List baggageTagKeys = Config.get().getTraceBaggageTagKeys(); if (baggageTagKeys.isEmpty()) { diff --git a/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java b/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java index d2c1288aa55..1cb2bc65f77 100644 --- a/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java +++ b/internal-api/src/main/java/datadog/trace/api/cache/RadixTreeCache.java @@ -18,9 +18,6 @@ public final class RadixTreeCache { 16, 32, TO_STRING, 200, 201, 301, 307, 400, 401, 403, 404, 500, 502, 503); public static final int UNSET_PORT = 0; - // should cover range [0, 2^16) - public static final RadixTreeCache PORTS = - new RadixTreeCache<>(256, 256, Integer::valueOf, 80, 443, 8080); private final int level1; private final int level2; diff --git a/internal-api/src/test/groovy/datadog/trace/api/cache/RadixTreeCacheTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/cache/RadixTreeCacheTest.groovy index 1b98e00a1ae..4a4f634d955 100644 --- a/internal-api/src/test/groovy/datadog/trace/api/cache/RadixTreeCacheTest.groovy +++ b/internal-api/src/test/groovy/datadog/trace/api/cache/RadixTreeCacheTest.groovy @@ -118,13 +118,6 @@ class RadixTreeCacheTest extends DDSpecification { }) } - def "cache ports"() { - expect: - Integer.valueOf(port) == RadixTreeCache.PORTS.get(port) - where: - port << [0, 80, 443, 4444, 8080, 65535] - } - def "cache HTTP statuses"() { expect: Integer.toString(status) == RadixTreeCache.HTTP_STATUSES.get(status) as String From 3934a156fb6a0c183e654009b8b1555ec8d70dfd Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Thu, 18 Dec 2025 10:41:29 +0100 Subject: [PATCH 2/2] remove port cache from mongo listener --- .../trace/instrumentation/mongo/MongoCommandListener.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/mongo/common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java b/dd-java-agent/instrumentation/mongo/common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java index 3b824fa4188..ad2499ef866 100644 --- a/dd-java-agent/instrumentation/mongo/common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java +++ b/dd-java-agent/instrumentation/mongo/common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommandListener.java @@ -1,7 +1,6 @@ package datadog.trace.instrumentation.mongo; import static datadog.trace.api.Functions.UTF8_ENCODE; -import static datadog.trace.api.cache.RadixTreeCache.PORTS; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; @@ -140,7 +139,7 @@ public void commandStarted(final CommandStartedEvent event) { // may do a DNS lookup ServerAddress serverAddress = event.getConnectionDescription().getServerAddress(); span.setTag(Tags.PEER_HOSTNAME, serverAddress.getHost()) - .setTag(Tags.PEER_PORT, PORTS.get(serverAddress.getPort())) + .setTag(Tags.PEER_PORT, serverAddress.getPort()) .setTag( Tags.DB_OPERATION, COMMAND_NAMES.computeIfAbsent(event.getCommandName(), UTF8_ENCODE));