From 9d22372beff2995e17848ff2aa4a65bd97ac30d6 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 17 Oct 2025 23:07:47 +0100 Subject: [PATCH 1/3] Fix forbiddenApiFilters (should be a # between the class and method, not .) --- gradle/forbiddenApiFilters/main.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/forbiddenApiFilters/main.txt b/gradle/forbiddenApiFilters/main.txt index 2cffd42a752..b197062e67c 100644 --- a/gradle/forbiddenApiFilters/main.txt +++ b/gradle/forbiddenApiFilters/main.txt @@ -8,7 +8,7 @@ java.lang.String#replaceAll(java.lang.String,java.lang.String) java.lang.String#replaceFirst(java.lang.String,java.lang.String) # can initialize java.util.logging when ACCP is installed, prefer RandomUtils instead -java.util.UUID.randomUUID() +java.util.UUID#randomUUID() # prefer the NameMatchers/HierarchyMatchers equivalent instead net.bytebuddy.matcher.ElementMatchers#named(java.lang.String) From 9cc0667d225ba0d79add234d26d799704209f774 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Fri, 17 Oct 2025 23:28:20 +0100 Subject: [PATCH 2/3] Prefer RandomUtils.randomUUID() as it avoids triggering early initialization of JUL --- .../netty40/server/HttpServerResponseTracingHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java index 47399950b44..4c97c1a52bb 100644 --- a/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java +++ b/dd-java-agent/instrumentation/netty/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerResponseTracingHandler.java @@ -9,13 +9,13 @@ import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.websocket.HandlerContext; +import datadog.trace.util.RandomUtils; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOutboundHandlerAdapter; import io.netty.channel.ChannelPromise; import io.netty.handler.codec.http.HttpResponse; import io.netty.handler.codec.http.HttpResponseStatus; -import java.util.UUID; @ChannelHandler.Sharable public class HttpServerResponseTracingHandler extends ChannelOutboundHandlerAdapter { @@ -49,7 +49,7 @@ public void write(final ChannelHandlerContext ctx, final Object msg, final Chann String channelId = ctx.channel() .attr(CHANNEL_ID) - .setIfAbsent(UUID.randomUUID().toString().substring(0, 8)); + .setIfAbsent(RandomUtils.randomUUID().toString().substring(0, 8)); ctx.channel() .attr(WEBSOCKET_SENDER_HANDLER_CONTEXT) .set(new HandlerContext.Sender(span, channelId)); From fdfbe33c0679f75e4bd541f396c6997d6b518b7a Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Sat, 18 Oct 2025 02:36:42 +0100 Subject: [PATCH 3/3] Ignore use of UUID.randomUUID() in test/benchmark code --- dd-java-agent/agent-iast/build.gradle | 4 ++++ dd-java-agent/agent-tooling/build.gradle | 1 + .../groovy/datadog/trace/agent/test/utils/ClasspathUtils.java | 3 +++ 3 files changed, 8 insertions(+) diff --git a/dd-java-agent/agent-iast/build.gradle b/dd-java-agent/agent-iast/build.gradle index 1a41d10ccdf..0ab8963d012 100644 --- a/dd-java-agent/agent-iast/build.gradle +++ b/dd-java-agent/agent-iast/build.gradle @@ -109,6 +109,10 @@ jmh { duplicateClassesStrategy = DuplicatesStrategy.EXCLUDE } +tasks.named("forbiddenApisJmh") { + ignoreFailures = true +} + sourceSets { test { java { diff --git a/dd-java-agent/agent-tooling/build.gradle b/dd-java-agent/agent-tooling/build.gradle index e8b8aae0763..c14abdfefea 100644 --- a/dd-java-agent/agent-tooling/build.gradle +++ b/dd-java-agent/agent-tooling/build.gradle @@ -83,6 +83,7 @@ tasks.named("forbiddenApisTest_java11") { // it will fail due to missing JDK >= 9 classes // java.lang.ClassNotFoundException: java.lang.invoke.StringConcatFactory failOnMissingClasses = false + ignoreFailures = true } tasks.named("compileTestJava") { diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java index 9b3f42adae2..06535303ff4 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java @@ -2,6 +2,7 @@ import static datadog.trace.util.Strings.getResourceName; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -45,6 +46,7 @@ public static byte[] convertToByteArray(final Class clazz) throws IOException * @return the location of the newly created jar. * @throws IOException if the jar file cannot be created. */ + @SuppressForbidden public static URL createJarWithClasses(final ClassLoader loader, final String... resourceNames) throws IOException { final File tmpJar = File.createTempFile(UUID.randomUUID().toString(), ".jar"); @@ -75,6 +77,7 @@ public static URL createJarWithClasses(final ClassLoader loader, final String... * @return the location of the newly created jar. * @throws IOException */ + @SuppressForbidden public static URL createJarWithClasses(final Class... classes) throws IOException { final File tmpJar = File.createTempFile(UUID.randomUUID().toString(), ".jar"); tmpJar.deleteOnExit();