From 07550cf4c68ca364798f8d46622a5a4e75ca0339 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Tue, 15 Sep 2026 10:57:12 +0200 Subject: [PATCH 1/2] Prevent Netty startup tasks from inheriting context --- ...entExecutorStartThreadInstrumentation.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java diff --git a/dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java b/dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java new file mode 100644 index 00000000000..14f558bfd25 --- /dev/null +++ b/dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java @@ -0,0 +1,57 @@ +package datadog.trace.instrumentation.netty40.concurrent; + +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagationEnabled; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; +import static net.bytebuddy.matcher.ElementMatchers.isPrivate; +import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesNoArguments; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import net.bytebuddy.asm.Advice; + +/** Prevents Netty's lazily created event-loop maintenance tasks from inheriting user context. */ +@AutoService(InstrumenterModule.class) +public final class SingleThreadEventExecutorStartThreadInstrumentation + extends InstrumenterModule.ContextTracking + implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { + + public SingleThreadEventExecutorStartThreadInstrumentation() { + super("netty-concurrent", "netty-event-executor"); + } + + @Override + public String[] knownMatchingTypes() { + return new String[] { + "io.netty.util.concurrent.SingleThreadEventExecutor", + "io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor", + }; + } + + @Override + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + named("startThread").and(takesNoArguments()).and(returns(void.class)).and(isPrivate()), + getClass().getName() + "$DisableAsyncPropagation"); + } + + public static final class DisableAsyncPropagation { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static boolean before() { + if (isAsyncPropagationEnabled()) { + setAsyncPropagationEnabled(false); + return true; + } + return false; + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void after(@Advice.Enter boolean wasDisabled) { + if (wasDisabled) { + setAsyncPropagationEnabled(true); + } + } + } +} From acbd49df68d779af8af5633c530d5a44e22f6f19 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Tue, 15 Sep 2026 12:51:03 +0200 Subject: [PATCH 2/2] Cover shaded Netty event executors --- .../SingleThreadEventExecutorStartThreadInstrumentation.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java b/dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java index 14f558bfd25..826b37103f7 100644 --- a/dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java +++ b/dd-java-agent/instrumentation/netty/netty-concurrent-4.0/src/main/java/datadog/trace/instrumentation/netty40/concurrent/SingleThreadEventExecutorStartThreadInstrumentation.java @@ -27,6 +27,8 @@ public String[] knownMatchingTypes() { return new String[] { "io.netty.util.concurrent.SingleThreadEventExecutor", "io.grpc.netty.shaded.io.netty.util.concurrent.SingleThreadEventExecutor", + "com.couchbase.client.deps.io.netty.util.concurrent.SingleThreadEventExecutor", + "play.shaded.ahc.io.netty.util.concurrent.SingleThreadEventExecutor", }; }