diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java index 2eadfb0cfe9..7e7d915e0dc 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java @@ -10,6 +10,7 @@ import static datadog.trace.instrumentation.java.concurrent.ConcurrentInstrumentationNames.EXECUTOR_INSTRUMENTATION_NAME; import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; import static net.bytebuddy.matcher.ElementMatchers.isTypeInitializer; +import static net.bytebuddy.matcher.ElementMatchers.takesNoArguments; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; @@ -64,6 +65,9 @@ public AsyncPropagatingDisableInstrumentation() { extendsClass(named("java.net.http.HttpClient")); private static final String LETTUCE_HANDSHAKE_HANDLER = "io.lettuce.core.protocol.RedisHandshakeHandler"; + private static final ElementMatcher PEKKO_HTTP_STREAM_STAGE = + nameStartsWith("org.apache.pekko.http.impl.util.StreamUtils$") + .and(extendsClass(named("org.apache.pekko.stream.stage.GraphStageLogic"))); @Override public boolean onlyMatchKnownTypes() { @@ -120,7 +124,8 @@ public ElementMatcher hierarchyMatcher() { .or(REACTOR_DISABLED_TYPE_INITIALIZERS) .or(RXJAVA2_DISABLED_TYPE_INITIALIZERS) .or(RXJAVA3_DISABLED_TYPE_INITIALIZERS) - .or(JAVA_HTTP_CLIENT); + .or(JAVA_HTTP_CLIENT) + .or(PEKKO_HTTP_STREAM_STAGE); } @Override @@ -213,6 +218,9 @@ public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice(namedOneOf("sendAsync").and(isDeclaredBy(JAVA_HTTP_CLIENT)), advice); transformer.applyAdvice( named("channelRegistered").and(isDeclaredBy(named(LETTUCE_HANDSHAKE_HANDLER))), advice); + transformer.applyAdvice( + named("preStart").and(takesNoArguments()).and(isDeclaredBy(PEKKO_HTTP_STREAM_STAGE)), + advice); // armeria runs its own codec/pipeline, so the active request span captured during connection // pool creation and channel connect will have no consumers. transformer.applyAdvice(