From b0a018019a45848c7cdab1e91cebb904f653fd58 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 2 Jan 2026 13:56:01 +0100 Subject: [PATCH 1/5] Migrate akka concurrent to instrumenter module --- .../AkkaActorCellInstrumentation.java | 16 +---- .../akka/concurrent/AkkaConcurrentModule.java | 58 +++++++++++++++++++ .../AkkaEnvelopeInstrumentation.java | 17 +----- ...kaForkJoinExecutorTaskInstrumentation.java | 15 +---- .../AkkaForkJoinPoolInstrumentation.java | 16 +---- .../AkkaForkJoinTaskInstrumentation.java | 15 +---- .../AkkaMailboxInstrumentation.java | 9 +-- .../AkkaRoutedActorCellInstrumentation.java | 13 +---- ...isableTracingActorInitInstrumentation.java | 9 +-- 9 files changed, 66 insertions(+), 102 deletions(-) create mode 100644 dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaConcurrentModule.java diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java index 7b04b3aef16..35d8c6a38f2 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaActorCellInstrumentation.java @@ -3,38 +3,24 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.checkpointActiveForRollback; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.rollbackActiveToCheckpoint; -import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import akka.dispatch.Envelope; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; -import java.util.Map; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public class AkkaActorCellInstrumentation extends InstrumenterModule.Tracing +public class AkkaActorCellInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public AkkaActorCellInstrumentation() { - super("akka_actor_receive", "akka_actor", "akka_concurrent", "java_concurrent"); - } - @Override public String instrumentedType() { return "akka.actor.ActorCell"; } - @Override - public Map contextStore() { - return singletonMap("akka.dispatch.Envelope", State.class.getName()); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaConcurrentModule.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaConcurrentModule.java new file mode 100644 index 00000000000..b9135707afc --- /dev/null +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaConcurrentModule.java @@ -0,0 +1,58 @@ +package datadog.trace.instrumentation.akka.concurrent; + +import static java.util.Collections.singleton; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.api.InstrumenterConfig; +import datadog.trace.bootstrap.instrumentation.java.concurrent.State; +import datadog.trace.instrumentation.akka.init.DisableTracingActorInitInstrumentation; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class AkkaConcurrentModule extends InstrumenterModule.Tracing { + public AkkaConcurrentModule() { + super("akka_concurrent", "java_concurrent"); + } + + @Override + public Map contextStore() { + final Map store = new HashMap<>(); + store.put(Runnable.class.getName(), State.class.getName()); + store.put("akka.dispatch.Envelope", State.class.getName()); + store.put("akka.dispatch.forkjoin.ForkJoinTask", State.class.getName()); + return store; + } + + @Override + public List typeInstrumentations() { + final List instrumenters = new ArrayList<>(8); + // akka concurrent defaults + instrumenters.add(new AkkaForkJoinExecutorTaskInstrumentation()); + instrumenters.add(new AkkaForkJoinPoolInstrumentation()); + instrumenters.add(new AkkaForkJoinTaskInstrumentation()); + instrumenters.add(new DisableTracingActorInitInstrumentation()); + final InstrumenterConfig instrumenterConfig = InstrumenterConfig.get(); + // akka actor + if (instrumenterConfig.isIntegrationEnabled(singleton("akka_actor"), true)) { + // receive + if (instrumenterConfig.isIntegrationEnabled(singleton("akka_actor_receive"), true)) { + instrumenters.add(new AkkaActorCellInstrumentation()); + } + // send + if (instrumenterConfig.isIntegrationEnabled(singleton("akka_actor_send"), true)) { + instrumenters.add(new AkkaEnvelopeInstrumentation()); + instrumenters.add(new AkkaRoutedActorCellInstrumentation()); + } + // mailbox + if (instrumenterConfig.isIntegrationEnabled(singleton("akka_actor_mailbox"), true)) { + instrumenters.add(new AkkaMailboxInstrumentation()); + } + } + return instrumenters; + } +} diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaEnvelopeInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaEnvelopeInstrumentation.java index 97d21f4b0b3..7e6c95d0c09 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaEnvelopeInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaEnvelopeInstrumentation.java @@ -1,36 +1,21 @@ package datadog.trace.instrumentation.akka.concurrent; import static datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils.capture; -import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import akka.dispatch.Envelope; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; -import java.util.Map; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public class AkkaEnvelopeInstrumentation extends InstrumenterModule.Tracing +public class AkkaEnvelopeInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - - public AkkaEnvelopeInstrumentation() { - super("akka_actor_send", "akka_actor", "akka_concurrent", "java_concurrent"); - } - @Override public String instrumentedType() { return "akka.dispatch.Envelope"; } - @Override - public Map contextStore() { - return singletonMap("akka.dispatch.Envelope", State.class.getName()); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice(isConstructor(), getClass().getName() + "$ConstructAdvice"); diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinExecutorTaskInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinExecutorTaskInstrumentation.java index bb897783366..87b628008da 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinExecutorTaskInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinExecutorTaskInstrumentation.java @@ -8,15 +8,11 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.InstrumenterConfig; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; -import java.util.Collections; -import java.util.Map; import net.bytebuddy.asm.Advice; /** @@ -24,19 +20,10 @@ * be handled generically despite being a subclass of akka.dispatch.ForkJoinTask, because of its * error handling. */ -@AutoService(InstrumenterModule.class) -public final class AkkaForkJoinExecutorTaskInstrumentation extends InstrumenterModule.Tracing +public final class AkkaForkJoinExecutorTaskInstrumentation implements Instrumenter.ForSingleType, Instrumenter.ForConfiguredType, Instrumenter.HasMethodAdvice { - public AkkaForkJoinExecutorTaskInstrumentation() { - super("java_concurrent", "akka_concurrent"); - } - - @Override - public Map contextStore() { - return Collections.singletonMap(Runnable.class.getName(), State.class.getName()); - } @Override public String instrumentedType() { diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinPoolInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinPoolInstrumentation.java index dd93b6b19c5..e712bb0295a 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinPoolInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinPoolInstrumentation.java @@ -5,29 +5,20 @@ import static datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils.capture; import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.FORK_JOIN_TASK; import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.exclude; -import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import akka.dispatch.forkjoin.ForkJoinTask; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.InstrumenterConfig; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; -import java.util.Map; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public final class AkkaForkJoinPoolInstrumentation extends InstrumenterModule.Tracing +public final class AkkaForkJoinPoolInstrumentation implements Instrumenter.ForSingleType, Instrumenter.ForConfiguredType, Instrumenter.HasMethodAdvice { - public AkkaForkJoinPoolInstrumentation() { - super("java_concurrent", "akka_concurrent"); - } - @Override public String instrumentedType() { return "akka.dispatch.forkjoin.ForkJoinPool"; @@ -38,11 +29,6 @@ public String configuredMatchingType() { return InstrumenterConfig.get().getAkkaForkJoinPoolName(); } - @Override - public Map contextStore() { - return singletonMap("akka.dispatch.forkjoin.ForkJoinTask", State.class.getName()); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinTaskInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinTaskInstrumentation.java index 41c6003f697..e8e89746418 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinTaskInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinTaskInstrumentation.java @@ -11,14 +11,11 @@ import static datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils.startTaskScope; import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.FORK_JOIN_TASK; import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE_FUTURE; -import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import akka.dispatch.forkjoin.ForkJoinTask; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.ExcludeFilterProvider; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.InstrumenterConfig; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -38,19 +35,9 @@ *

Note: There are quite a few separate implementations of {@code ForkJoinTask}/{@code * ForkJoinPool}: JVM, Akka, Scala, Netty to name a few. This class handles Akka version. */ -@AutoService(InstrumenterModule.class) -public final class AkkaForkJoinTaskInstrumentation extends InstrumenterModule.Tracing +public final class AkkaForkJoinTaskInstrumentation implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice, ExcludeFilterProvider { - public AkkaForkJoinTaskInstrumentation() { - super("java_concurrent", "akka_concurrent"); - } - - @Override - public Map contextStore() { - return singletonMap("akka.dispatch.forkjoin.ForkJoinTask", State.class.getName()); - } - @Override public String hierarchyMarkerType() { String akkaForkJoinTaskName = InstrumenterConfig.get().getAkkaForkJoinTaskName(); diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java index b9f949ecd0f..5a2d80eac9d 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaMailboxInstrumentation.java @@ -6,10 +6,8 @@ import static java.util.Collections.singletonList; import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.ExcludeFilterProvider; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter; import java.util.Collection; import java.util.EnumMap; @@ -17,14 +15,9 @@ import java.util.Map; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public class AkkaMailboxInstrumentation extends InstrumenterModule.Tracing +public class AkkaMailboxInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice, ExcludeFilterProvider { - public AkkaMailboxInstrumentation() { - super("akka_actor_mailbox", "akka_actor", "akka_concurrent", "java_concurrent"); - } - @Override public String instrumentedType() { return "akka.dispatch.Mailbox"; diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java index 621cb2d4740..3c75dc443dd 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java @@ -1,7 +1,6 @@ package datadog.trace.instrumentation.akka.concurrent; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -14,27 +13,17 @@ import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; -import java.util.Map; import net.bytebuddy.asm.Advice; @AutoService(InstrumenterModule.class) -public class AkkaRoutedActorCellInstrumentation extends InstrumenterModule.Tracing +public class AkkaRoutedActorCellInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public AkkaRoutedActorCellInstrumentation() { - super("akka_actor_send", "akka_actor", "akka_concurrent", "java_concurrent"); - } - @Override public String instrumentedType() { return "akka.routing.RoutedActorCell"; } - @Override - public Map contextStore() { - return singletonMap("akka.dispatch.Envelope", State.class.getName()); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/init/DisableTracingActorInitInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/init/DisableTracingActorInitInstrumentation.java index 835f8664ed1..ca2f3a524a1 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/init/DisableTracingActorInitInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/init/DisableTracingActorInitInstrumentation.java @@ -5,20 +5,13 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; import akka.actor.ActorSystem$; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public final class DisableTracingActorInitInstrumentation extends InstrumenterModule.Tracing +public final class DisableTracingActorInitInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public DisableTracingActorInitInstrumentation() { - super("akka_concurrent"); - } - @Override public String instrumentedType() { return "akka.actor.ActorSystem$"; From 5fa48a60de5b3ed17caf9bedc841f4d831d4d69a Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 2 Jan 2026 14:59:18 +0100 Subject: [PATCH 2/5] Migrate akka-http-10.0 to instrumenter module --- .../AkkaRoutedActorCellInstrumentation.java | 3 - .../AkkaHttp2ServerInstrumentation.java | 32 +--------- .../AkkaHttpServerInstrumentation.java | 35 +---------- .../akkahttp/AkkaHttpServerModule.java | 56 +++++++++++++++++ .../akkahttp/appsec/AkkaHttpAppSecModule.java | 51 ++++++++++++++++ .../appsec/Bug4304Instrumentation.java | 26 +------- ...ideRemoteAddressHeaderInstrumentation.java | 9 +-- ...efaultExceptionHandlerInstrumentation.java | 17 +----- .../FormDataToStrictInstrumentation.java | 27 +-------- .../JacksonUnmarshallerInstrumentation.java | 30 +--------- .../{ => appsec}/MarkSpanAsErroredPF.java | 2 +- ...MultipartUnmarshallersInstrumentation.java | 23 +------ ...romEntityUnmarshallersInstrumentation.java | 29 +-------- .../SprayUnmarshallerInstrumentation.java | 29 +-------- .../StrictFormCompanionInstrumentation.java | 28 +-------- .../akkahttp/iast/AkkaHttpIastModule.java | 60 +++++++++++++++++++ .../iast/CookieDirectivesInstrumentation.java | 16 +---- .../iast/CookieHeaderInstrumentation.java | 8 +-- .../ExtractDirectivesInstrumentation.java | 18 +----- .../iast/FormDataInstrumentation.java | 9 +-- .../FormFieldDirectivesInstrumentation.java | 20 +------ .../HttpHeaderSubclassesInstrumentation.java | 8 +-- .../iast/HttpRequestInstrumentation.java | 8 +-- .../iast/MakeTaintableInstrumentation.java | 11 +--- .../MarshallingDirectivesInstrumentation.java | 16 +---- .../ParameterDirectivesInstrumentation.java | 20 +------ .../iast/PathMatcherInstrumentation.java | 9 +-- .../iast/RequestContextInstrumentation.java | 8 +-- .../iast/UnmarshallerInstrumentation.java | 16 +---- .../akkahttp/iast/UriInstrumentation.java | 9 +-- 30 files changed, 196 insertions(+), 437 deletions(-) create mode 100644 dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java create mode 100644 dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaHttpAppSecModule.java rename dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/{ => appsec}/DefaultExceptionHandlerInstrumentation.java (73%) rename dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/{ => appsec}/MarkSpanAsErroredPF.java (95%) create mode 100644 dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java diff --git a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java index 3c75dc443dd..aed27c818e7 100644 --- a/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-actor-2.5/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaRoutedActorCellInstrumentation.java @@ -6,16 +6,13 @@ import akka.dispatch.Envelope; import akka.routing.RoutedActorCell; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.java.concurrent.AdviceUtils; import datadog.trace.bootstrap.instrumentation.java.concurrent.State; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) public class AkkaRoutedActorCellInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttp2ServerInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttp2ServerInstrumentation.java index 169cb3dbbc0..794650fedf8 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttp2ServerInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttp2ServerInstrumentation.java @@ -7,11 +7,7 @@ import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.model.HttpResponse; import akka.stream.Materializer; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.agent.tooling.muzzle.Reference; -import datadog.trace.instrumentation.akkahttp.appsec.ScalaListCollectorMuzzleReferences; import net.bytebuddy.asm.Advice; import scala.Function1; import scala.concurrent.Future; @@ -20,40 +16,14 @@ * Http2 support in akka-http is handled by a separate {@code Http2} extension that only supports * {@code bindAndHandleAsync}. */ -@AutoService(InstrumenterModule.class) -public final class AkkaHttp2ServerInstrumentation extends InstrumenterModule.Tracing +public final class AkkaHttp2ServerInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { - public AkkaHttp2ServerInstrumentation() { - super("akka-http2", "akka-http", "akka-http-server"); - } @Override public String[] knownMatchingTypes() { return new String[] {"akka.http.scaladsl.Http2Ext", "akka.http.impl.engine.http2.Http2Ext"}; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".DatadogWrapperHelper", - packageName + ".DatadogAsyncHandlerWrapper", - packageName + ".DatadogAsyncHandlerWrapper$1", - packageName + ".DatadogAsyncHandlerWrapper$2", - packageName + ".AkkaHttpServerHeaders", - packageName + ".AkkaHttpServerDecorator", - packageName + ".RecoverFromBlockedExceptionPF", - packageName + ".UriAdapter", - packageName + ".appsec.AkkaBlockResponseFunction", - packageName + ".appsec.BlockingResponseHelper", - packageName + ".appsec.ScalaListCollector", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java index 0f2649fbc3a..8381783f0fc 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java @@ -9,11 +9,7 @@ import akka.http.scaladsl.settings.ServerSettings; import akka.stream.javadsl.BidiFlow; import akka.stream.scaladsl.Flow; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.agent.tooling.muzzle.Reference; -import datadog.trace.instrumentation.akkahttp.appsec.ScalaListCollectorMuzzleReferences; import net.bytebuddy.asm.Advice; /** @@ -49,43 +45,14 @@ * closed by cleanup code in the message processing instrumentation for the {@code Actor} and its * {@code Mailbox}. */ -@AutoService(InstrumenterModule.class) -public final class AkkaHttpServerInstrumentation extends InstrumenterModule.Tracing +public final class AkkaHttpServerInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public AkkaHttpServerInstrumentation() { - super("akka-http", "akka-http-server"); - } @Override public String instrumentedType() { return "akka.http.scaladsl.HttpExt"; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".DatadogWrapperHelper", - packageName + ".DatadogServerRequestResponseFlowWrapper", - packageName + ".DatadogServerRequestResponseFlowWrapper$1", - packageName + ".DatadogServerRequestResponseFlowWrapper$1$1", - packageName + ".DatadogServerRequestResponseFlowWrapper$1$2", - packageName + ".DatadogServerRequestResponseFlowWrapper$1$3", - packageName + ".DatadogServerRequestResponseFlowWrapper$1$4", - packageName + ".AkkaHttpServerHeaders", - packageName + ".AkkaHttpServerDecorator", - packageName + ".UriAdapter", - packageName + ".RecoverFromBlockedExceptionPF", - packageName + ".appsec.BlockingResponseHelper", - packageName + ".appsec.ScalaListCollector", - packageName + ".appsec.AkkaBlockResponseFunction", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java new file mode 100644 index 00000000000..d84b31ee72c --- /dev/null +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java @@ -0,0 +1,56 @@ +package datadog.trace.instrumentation.akkahttp; + +import static java.util.Collections.singleton; + +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.agent.tooling.muzzle.Reference; +import datadog.trace.api.InstrumenterConfig; +import datadog.trace.instrumentation.akkahttp.appsec.ScalaListCollectorMuzzleReferences; +import java.util.ArrayList; +import java.util.List; + +public class AkkaHttpServerModule extends InstrumenterModule.Tracing { + public AkkaHttpServerModule() { + super("akka-http", "akka-http-server"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".DatadogWrapperHelper", + packageName + ".DatadogAsyncHandlerWrapper", + packageName + ".DatadogAsyncHandlerWrapper$1", + packageName + ".DatadogAsyncHandlerWrapper$2", + packageName + ".AkkaHttpServerHeaders", + packageName + ".AkkaHttpServerDecorator", + packageName + ".RecoverFromBlockedExceptionPF", + packageName + ".UriAdapter", + packageName + ".appsec.AkkaBlockResponseFunction", + packageName + ".appsec.BlockingResponseHelper", + packageName + ".appsec.ScalaListCollector", + packageName + ".DatadogWrapperHelper", + packageName + ".DatadogServerRequestResponseFlowWrapper", + packageName + ".DatadogServerRequestResponseFlowWrapper$1", + packageName + ".DatadogServerRequestResponseFlowWrapper$1$1", + packageName + ".DatadogServerRequestResponseFlowWrapper$1$2", + packageName + ".DatadogServerRequestResponseFlowWrapper$1$3", + packageName + ".DatadogServerRequestResponseFlowWrapper$1$4", + }; + } + + @Override + public Reference[] additionalMuzzleReferences() { + return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); + } + + @Override + public List typeInstrumentations() { + final List ret = new ArrayList<>(); + ret.add(new AkkaHttpServerInstrumentation()); + if (InstrumenterConfig.get().isIntegrationEnabled(singleton("akka-http2"), true)) { + ret.add(new AkkaHttp2ServerInstrumentation()); + } + return ret; + } +} diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaHttpAppSecModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaHttpAppSecModule.java new file mode 100644 index 00000000000..2bb72a11820 --- /dev/null +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/AkkaHttpAppSecModule.java @@ -0,0 +1,51 @@ +package datadog.trace.instrumentation.akkahttp.appsec; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.agent.tooling.muzzle.Reference; +import java.util.List; + +@AutoService(InstrumenterModule.class) +public class AkkaHttpAppSecModule extends InstrumenterModule.AppSec { + + public AkkaHttpAppSecModule() { + super("akka-http"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".AkkaBlockResponseFunction", + packageName + ".BlockingResponseHelper", + packageName + ".MarkSpanAsErroredPF", + packageName + ".ScalaListCollector", + packageName + ".UnmarshallerHelpers", + packageName + ".UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", + "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", + "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", + "datadog.trace.instrumentation.akkahttp.UriAdapter", + }; + } + + @Override + public Reference[] additionalMuzzleReferences() { + return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); + } + + @Override + public List typeInstrumentations() { + return asList( + new Bug4304Instrumentation(), + new ConfigProvideRemoteAddressHeaderInstrumentation(), + new DefaultExceptionHandlerInstrumentation(), + new FormDataToStrictInstrumentation(), + new JacksonUnmarshallerInstrumentation(), + new MultipartUnmarshallersInstrumentation(), + new PredefinedFromEntityUnmarshallersInstrumentation(), + new SprayUnmarshallerInstrumentation(), + new StrictFormCompanionInstrumentation()); + } +} diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java index b185117f882..0e8a8ad6352 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/Bug4304Instrumentation.java @@ -7,11 +7,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import akka.stream.stage.GraphStageLogic; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers; -import datadog.trace.agent.tooling.muzzle.Reference; import datadog.trace.api.gateway.BlockResponseFunction; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; @@ -23,37 +20,16 @@ import net.bytebuddy.matcher.ElementMatcher; /** See https://github.com/akka/akka-http/issues/4304 */ -@AutoService(InstrumenterModule.class) -public class Bug4304Instrumentation extends InstrumenterModule.AppSec +public class Bug4304Instrumentation implements Instrumenter.ForTypeHierarchy, Instrumenter.WithTypeStructure, Instrumenter.HasMethodAdvice { - public Bug4304Instrumentation() { - super("akka-http"); - } @Override public String hierarchyMarkerType() { return "akka.http.impl.engine.server.HttpServerBluePrint"; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AkkaBlockResponseFunction", - packageName + ".BlockingResponseHelper", - packageName + ".ScalaListCollector", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", - "datadog.trace.instrumentation.akkahttp.UriAdapter", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); - } - @Override public ElementMatcher hierarchyMatcher() { return nameStartsWith("akka.http.impl.engine.server.HttpServerBluePrint$ControllerStage$$anon$") diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ConfigProvideRemoteAddressHeaderInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ConfigProvideRemoteAddressHeaderInstrumentation.java index c11da33cf64..b89717d1905 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ConfigProvideRemoteAddressHeaderInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/ConfigProvideRemoteAddressHeaderInstrumentation.java @@ -6,18 +6,11 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public class ConfigProvideRemoteAddressHeaderInstrumentation extends InstrumenterModule.AppSec +public class ConfigProvideRemoteAddressHeaderInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public ConfigProvideRemoteAddressHeaderInstrumentation() { - super("akka-http"); - } - @Override public String instrumentedType() { return "com.typesafe.config.impl.SimpleConfig"; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DefaultExceptionHandlerInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/DefaultExceptionHandlerInstrumentation.java similarity index 73% rename from dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DefaultExceptionHandlerInstrumentation.java rename to dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/DefaultExceptionHandlerInstrumentation.java index dc9e6f1376f..0bfde2703fa 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DefaultExceptionHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/DefaultExceptionHandlerInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.akkahttp; +package datadog.trace.instrumentation.akkahttp.appsec; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -8,30 +8,17 @@ import akka.http.scaladsl.server.ExceptionHandler; import akka.http.scaladsl.server.ExceptionHandler$; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public class DefaultExceptionHandlerInstrumentation extends InstrumenterModule.AppSec +public class DefaultExceptionHandlerInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public DefaultExceptionHandlerInstrumentation() { - super("akka-http", "akka-http-server"); - } @Override public String instrumentedType() { return "akka.http.scaladsl.server.ExceptionHandler$"; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".MarkSpanAsErroredPF", - }; - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/FormDataToStrictInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/FormDataToStrictInstrumentation.java index 38c8c64170c..05b8d9f5972 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/FormDataToStrictInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/FormDataToStrictInstrumentation.java @@ -9,38 +9,15 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import akka.stream.Materializer; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import net.bytebuddy.asm.Advice; import scala.concurrent.duration.FiniteDuration; /** * @see akka.http.scaladsl.model.Multipart.FormData#toStrict(FiniteDuration, Materializer) */ -@AutoService(InstrumenterModule.class) -public class FormDataToStrictInstrumentation extends InstrumenterModule.AppSec - implements Instrumenter.ForSingleType, - Instrumenter.HasMethodAdvice, - ScalaListCollectorMuzzleReferences { - public FormDataToStrictInstrumentation() { - super("akka-http"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".UnmarshallerHelpers", - packageName + ".UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", - packageName + ".AkkaBlockResponseFunction", - packageName + ".BlockingResponseHelper", - packageName + ".ScalaListCollector", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", - "datadog.trace.instrumentation.akkahttp.UriAdapter", - }; - } - +public class FormDataToStrictInstrumentation + implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { @Override public String instrumentedType() { return "akka.http.scaladsl.model.Multipart$FormData"; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/JacksonUnmarshallerInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/JacksonUnmarshallerInstrumentation.java index 3901cd579bf..41c6fdda19a 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/JacksonUnmarshallerInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/JacksonUnmarshallerInstrumentation.java @@ -8,39 +8,11 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import akka.http.javadsl.unmarshalling.Unmarshaller; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.agent.tooling.muzzle.Reference; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public class JacksonUnmarshallerInstrumentation extends InstrumenterModule.AppSec +public class JacksonUnmarshallerInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - - public JacksonUnmarshallerInstrumentation() { - super("akka-http"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".UnmarshallerHelpers", - packageName + ".UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", - packageName + ".AkkaBlockResponseFunction", - packageName + ".BlockingResponseHelper", - packageName + ".ScalaListCollector", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", - "datadog.trace.instrumentation.akkahttp.UriAdapter", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); - } - @Override public String instrumentedType() { return "akka.http.javadsl.marshallers.jackson.Jackson"; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/MarkSpanAsErroredPF.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/MarkSpanAsErroredPF.java similarity index 95% rename from dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/MarkSpanAsErroredPF.java rename to dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/MarkSpanAsErroredPF.java index 5709c5025cd..058c5384404 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/MarkSpanAsErroredPF.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/MarkSpanAsErroredPF.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.akkahttp; +package datadog.trace.instrumentation.akkahttp.appsec; import akka.http.scaladsl.server.RequestContext; import akka.http.scaladsl.server.RouteResult; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/MultipartUnmarshallersInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/MultipartUnmarshallersInstrumentation.java index 3d74ad319b6..f0f75cdc993 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/MultipartUnmarshallersInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/MultipartUnmarshallersInstrumentation.java @@ -6,39 +6,18 @@ import akka.http.scaladsl.unmarshalling.MultipartUnmarshallers; import akka.http.scaladsl.unmarshalling.Unmarshaller; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import net.bytebuddy.asm.Advice; /** * @see MultipartUnmarshallers */ -@AutoService(InstrumenterModule.class) -public class MultipartUnmarshallersInstrumentation extends InstrumenterModule.AppSec +public class MultipartUnmarshallersInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { private static final String TRAIT_NAME = "akka.http.scaladsl.unmarshalling.MultipartUnmarshallers"; - public MultipartUnmarshallersInstrumentation() { - super("akka-http"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".UnmarshallerHelpers", - packageName + ".UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", - packageName + ".AkkaBlockResponseFunction", - packageName + ".BlockingResponseHelper", - packageName + ".ScalaListCollector", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", - "datadog.trace.instrumentation.akkahttp.UriAdapter", - }; - } - @Override public String[] knownMatchingTypes() { return new String[] { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/PredefinedFromEntityUnmarshallersInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/PredefinedFromEntityUnmarshallersInstrumentation.java index efd4b95c30b..9355ef21381 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/PredefinedFromEntityUnmarshallersInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/PredefinedFromEntityUnmarshallersInstrumentation.java @@ -7,10 +7,7 @@ import akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers; import akka.http.scaladsl.unmarshalling.Unmarshaller; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.agent.tooling.muzzle.Reference; import net.bytebuddy.asm.Advice; import scala.collection.Seq; @@ -18,36 +15,12 @@ * @see PredefinedFromEntityUnmarshallers#urlEncodedFormDataUnmarshaller(Seq) * @see PredefinedFromEntityUnmarshallers#stringUnmarshaller() */ -@AutoService(InstrumenterModule.class) -public class PredefinedFromEntityUnmarshallersInstrumentation extends InstrumenterModule.AppSec +public class PredefinedFromEntityUnmarshallersInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { private static final String TRAIT_NAME = "akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers"; - public PredefinedFromEntityUnmarshallersInstrumentation() { - super("akka-http"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".UnmarshallerHelpers", - packageName + ".UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", - packageName + ".AkkaBlockResponseFunction", - packageName + ".BlockingResponseHelper", - packageName + ".ScalaListCollector", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", - "datadog.trace.instrumentation.akkahttp.UriAdapter", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); - } - @Override public String[] knownMatchingTypes() { return new String[] { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/SprayUnmarshallerInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/SprayUnmarshallerInstrumentation.java index 6b7212f2a5b..672f90520be 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/SprayUnmarshallerInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/SprayUnmarshallerInstrumentation.java @@ -5,24 +5,16 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import akka.http.scaladsl.unmarshalling.Unmarshaller; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.agent.tooling.muzzle.Reference; import net.bytebuddy.asm.Advice; // TODO: move to separate module and have better support -@AutoService(InstrumenterModule.class) -public class SprayUnmarshallerInstrumentation extends InstrumenterModule.AppSec +public class SprayUnmarshallerInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { private static final String TRAIT_NAME = "akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport"; - public SprayUnmarshallerInstrumentation() { - super("akka-http"); - } - @Override public String[] knownMatchingTypes() { return new String[] { @@ -30,25 +22,6 @@ public String[] knownMatchingTypes() { }; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".UnmarshallerHelpers", - packageName + ".UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", - packageName + ".AkkaBlockResponseFunction", - packageName + ".BlockingResponseHelper", - packageName + ".ScalaListCollector", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", - "datadog.trace.instrumentation.akkahttp.UriAdapter", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/StrictFormCompanionInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/StrictFormCompanionInstrumentation.java index 9ee0eae4bf7..7aa698709ee 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/StrictFormCompanionInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/appsec/StrictFormCompanionInstrumentation.java @@ -11,46 +11,20 @@ import akka.http.scaladsl.common.StrictForm; import akka.http.scaladsl.model.HttpEntity; import akka.http.scaladsl.unmarshalling.Unmarshaller; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.agent.tooling.muzzle.Reference; import net.bytebuddy.asm.Advice; /** * @see akka.http.scaladsl.common.StrictForm$#unmarshaller(Unmarshaller, Unmarshaller) */ -@AutoService(InstrumenterModule.class) -public class StrictFormCompanionInstrumentation extends InstrumenterModule.AppSec +public class StrictFormCompanionInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public StrictFormCompanionInstrumentation() { - super("akka-http"); - } @Override public String instrumentedType() { return "akka.http.scaladsl.common.StrictForm$"; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".UnmarshallerHelpers", - packageName + ".UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", - packageName + ".AkkaBlockResponseFunction", - packageName + ".BlockingResponseHelper", - packageName + ".ScalaListCollector", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", - "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", - "datadog.trace.instrumentation.akkahttp.UriAdapter", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - return ScalaListCollectorMuzzleReferences.additionalMuzzleReferences(); - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java new file mode 100644 index 00000000000..22425cb6bd7 --- /dev/null +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java @@ -0,0 +1,60 @@ +package datadog.trace.instrumentation.akkahttp.iast; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.instrumentation.akkahttp.appsec.FormDataToStrictInstrumentation; +import java.util.List; + +@AutoService(InstrumenterModule.class) +public class AkkaHttpIastModule extends InstrumenterModule.Iast { + public AkkaHttpIastModule() { + super("akka-http"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator", + "datadog.trace.instrumentation.akkahttp.AkkaHttpServerHeaders", + "datadog.trace.instrumentation.akkahttp.UriAdapter", + "datadog.trace.instrumentation.akkahttp.appsec.UnmarshallerHelpers", + "datadog.trace.instrumentation.akkahttp.appsec.AkkaBlockResponseFunction", + "datadog.trace.instrumentation.akkahttp.appsec.UnmarshallerHelpers$UnmarkStrictFormOngoingOnUnsupportedException", + "datadog.trace.instrumentation.akkahttp.appsec.BlockingResponseHelper", + "datadog.trace.instrumentation.akkahttp.appsec.ScalaListCollector", + packageName + ".helpers.ScalaToJava", + packageName + ".helpers.TaintCookieFunction", + packageName + ".helpers.TaintFutureHelper", + packageName + ".helpers.TaintOptionalCookieFunction", + packageName + ".helpers.TaintUriFunction", + packageName + ".helpers.TaintRequestFunction", + packageName + ".helpers.TaintRequestContextFunction", + packageName + ".helpers.TaintMultiMapFunction", + packageName + ".helpers.TaintMapFunction", + packageName + ".helpers.TaintSeqFunction", + packageName + ".helpers.TaintSingleParameterFunction", + packageName + ".helpers.TaintUnmarshaller", + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new CookieDirectivesInstrumentation(), + new CookieHeaderInstrumentation(), + new ExtractDirectivesInstrumentation(), + new FormDataToStrictInstrumentation(), + new FormFieldDirectivesInstrumentation(), + new HttpHeaderSubclassesInstrumentation(), + new HttpRequestInstrumentation(), + new MakeTaintableInstrumentation(), + new ParameterDirectivesInstrumentation(), + new PathMatcherInstrumentation(), + new RequestContextInstrumentation(), + new UnmarshallerInstrumentation(), + new UriInstrumentation()); + } +} diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieDirectivesInstrumentation.java index 2e6f61d7088..254429c449e 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieDirectivesInstrumentation.java @@ -4,9 +4,7 @@ import akka.http.scaladsl.server.Directive; import akka.http.scaladsl.server.util.Tupler$; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.iast.Source; import datadog.trace.api.iast.SourceTypes; import datadog.trace.instrumentation.akkahttp.iast.helpers.TaintCookieFunction; @@ -20,12 +18,8 @@ *

These directives are used when fetching a specific cookie by name. For tainting when fetching * all the cookies, see {@link CookieHeaderInstrumentation}. */ -@AutoService(InstrumenterModule.class) -public class CookieDirectivesInstrumentation extends InstrumenterModule.Iast +public class CookieDirectivesInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { - public CookieDirectivesInstrumentation() { - super("akka-http"); - } @Override public String[] knownMatchingTypes() { @@ -35,14 +29,6 @@ public String[] knownMatchingTypes() { }; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".helpers.TaintCookieFunction", - packageName + ".helpers.TaintOptionalCookieFunction", - }; - } - @Override public void methodAdvice(MethodTransformer transformer) { String traitName = "akka.http.scaladsl.server.directives.CookieDirectives"; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieHeaderInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieHeaderInstrumentation.java index 1a0b5a1a5ff..adbef5b9bc0 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieHeaderInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/CookieHeaderInstrumentation.java @@ -10,11 +10,9 @@ import akka.http.javadsl.model.HttpHeader; import akka.http.scaladsl.model.headers.Cookie; import akka.http.scaladsl.model.headers.HttpCookiePair; -import com.google.auto.service.AutoService; import datadog.trace.advice.ActiveRequestContext; import datadog.trace.advice.RequiresRequestContext; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.iast.IastContext; @@ -31,12 +29,8 @@ * * @see Cookie#getCookies() Java API. Is implemented by delegating to the instrumented method. */ -@AutoService(InstrumenterModule.class) -public class CookieHeaderInstrumentation extends InstrumenterModule.Iast +public class CookieHeaderInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public CookieHeaderInstrumentation() { - super("akka-http"); - } @Override public String instrumentedType() { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ExtractDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ExtractDirectivesInstrumentation.java index 306a8bfea0d..1e29da6a1b8 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ExtractDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ExtractDirectivesInstrumentation.java @@ -9,9 +9,7 @@ import akka.http.scaladsl.server.RequestContextImpl; import akka.http.scaladsl.server.directives.BasicDirectives$; import akka.http.scaladsl.server.util.Tupler$; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.iast.Source; import datadog.trace.api.iast.SourceTypes; import datadog.trace.instrumentation.akkahttp.iast.helpers.TaintRequestContextFunction; @@ -32,13 +30,8 @@ * HttpRequest} * @see UnmarshallerInstrumentation propagates taint on unmarshalling of {@link HttpRequest} */ -@AutoService(InstrumenterModule.class) -public class ExtractDirectivesInstrumentation extends InstrumenterModule.Iast +public class ExtractDirectivesInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { - public ExtractDirectivesInstrumentation() { - super("akka-http"); - } - @Override public String[] knownMatchingTypes() { return new String[] { @@ -47,15 +40,6 @@ public String[] knownMatchingTypes() { }; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".helpers.TaintUriFunction", - packageName + ".helpers.TaintRequestFunction", - packageName + ".helpers.TaintRequestContextFunction", - }; - } - @Override public void methodAdvice(MethodTransformer transformer) { instrumentDirective(transformer, "extractUri", "TaintUriDirectiveAdvice"); diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormDataInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormDataInstrumentation.java index 3f83982bf34..8219ebcb4c8 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormDataInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormDataInstrumentation.java @@ -9,22 +9,15 @@ import akka.http.scaladsl.model.FormData; import akka.http.scaladsl.model.Uri; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; /** * Propagate taint from {@link FormData} to {@link Uri.Query}. FormData gets tainted * through the unmarshaller tainting mechanism. See {@link MarshallingDirectivesInstrumentation} and * {@link UnmarshallerInstrumentation}. */ -@AutoService(InstrumenterModule.class) -public class FormDataInstrumentation extends InstrumenterModule.Iast +public class FormDataInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public FormDataInstrumentation() { - super("akka-http"); - } - @Override public String instrumentedType() { return "akka.http.scaladsl.model.FormData"; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java index 90d2587fd87..1f71e11e868 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/FormFieldDirectivesInstrumentation.java @@ -12,9 +12,7 @@ import akka.http.scaladsl.server.Directive; import akka.http.scaladsl.server.directives.FormFieldDirectives; import akka.http.scaladsl.server.util.Tupler$; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.iast.Source; import datadog.trace.api.iast.SourceTypes; import datadog.trace.instrumentation.akkahttp.iast.helpers.TaintSingleParameterFunction; @@ -28,17 +26,12 @@ * @see FormFieldDirectives * @see ParameterDirectivesInstrumentation with which most of the implementation is shared */ -@AutoService(InstrumenterModule.class) -public class FormFieldDirectivesInstrumentation extends InstrumenterModule.Iast +public class FormFieldDirectivesInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { private static final String TRAIT_CLASS = "akka.http.scaladsl.server.directives.FormFieldDirectives"; - public FormFieldDirectivesInstrumentation() { - super("akka-http"); - } - @Override public String[] knownMatchingTypes() { return new String[] { @@ -46,17 +39,6 @@ public String[] knownMatchingTypes() { }; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".helpers.ScalaToJava", - packageName + ".helpers.TaintMultiMapFunction", - packageName + ".helpers.TaintMapFunction", - packageName + ".helpers.TaintSeqFunction", - packageName + ".helpers.TaintSingleParameterFunction", - }; - } - @Override public void methodAdvice(MethodTransformer transformer) { // the Java API delegates to the Scala API diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpHeaderSubclassesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpHeaderSubclassesInstrumentation.java index a102830d10b..8ef8d6ddf5f 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpHeaderSubclassesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpHeaderSubclassesInstrumentation.java @@ -10,11 +10,9 @@ import akka.http.scaladsl.model.HttpHeader; import akka.http.scaladsl.model.HttpRequest; -import com.google.auto.service.AutoService; import datadog.trace.advice.ActiveRequestContext; import datadog.trace.advice.RequiresRequestContext; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.iast.IastContext; @@ -32,12 +30,8 @@ * @see HttpRequestInstrumentation propagates taint from {@link HttpRequest} to the headers, when * they're retrieved */ -@AutoService(InstrumenterModule.class) -public class HttpHeaderSubclassesInstrumentation extends InstrumenterModule.Iast +public class HttpHeaderSubclassesInstrumentation implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice { - public HttpHeaderSubclassesInstrumentation() { - super("akka-http"); - } @Override public String hierarchyMarkerType() { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java index b0b027bcfd7..b6a5e97004b 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/HttpRequestInstrumentation.java @@ -11,11 +11,9 @@ import akka.http.scaladsl.model.HttpHeader; import akka.http.scaladsl.model.HttpRequest; -import com.google.auto.service.AutoService; import datadog.trace.advice.ActiveRequestContext; import datadog.trace.advice.RequiresRequestContext; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.iast.IastContext; @@ -33,12 +31,8 @@ * * @see MakeTaintableInstrumentation makes {@link HttpRequest} taintable */ -@AutoService(InstrumenterModule.class) -public class HttpRequestInstrumentation extends InstrumenterModule.Iast +public class HttpRequestInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public HttpRequestInstrumentation() { - super("akka-http"); - } @Override public String instrumentedType() { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MakeTaintableInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MakeTaintableInstrumentation.java index a5608c48110..e3502d1c24d 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MakeTaintableInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MakeTaintableInstrumentation.java @@ -1,20 +1,13 @@ package datadog.trace.instrumentation.akkahttp.iast; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.agent.tooling.bytebuddy.iast.TaintableVisitor; -@AutoService(InstrumenterModule.class) -public class MakeTaintableInstrumentation extends InstrumenterModule.Iast +public class MakeTaintableInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasTypeAdvice { - public MakeTaintableInstrumentation() { - super("akka-http"); - } - /** - * @see akka.http.scaladsl.model.HttpHeader * @return the matching types + * @see akka.http.scaladsl.model.HttpHeader */ @Override public String[] knownMatchingTypes() { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java index c76903ed185..9f5a555d1ee 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/MarshallingDirectivesInstrumentation.java @@ -10,9 +10,7 @@ import akka.http.scaladsl.server.directives.MarshallingDirectives$; import akka.http.scaladsl.unmarshalling.Unmarshaller; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.iast.InstrumentationBridge; import datadog.trace.api.iast.Source; import datadog.trace.api.iast.SourceTypes; @@ -26,14 +24,9 @@ * * @see UnmarshallerInstrumentation unconditionally taints marshaller output if its input is tainted */ -@AutoService(InstrumenterModule.class) -public class MarshallingDirectivesInstrumentation extends InstrumenterModule.Iast +public class MarshallingDirectivesInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { - public MarshallingDirectivesInstrumentation() { - super("akka-http"); - } - @Override public String[] knownMatchingTypes() { return new String[] { @@ -42,13 +35,6 @@ public String[] knownMatchingTypes() { }; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".helpers.TaintUnmarshaller", - }; - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java index f51328e4312..4e0e4180e94 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/ParameterDirectivesInstrumentation.java @@ -11,9 +11,7 @@ import akka.http.scaladsl.server.Directive; import akka.http.scaladsl.server.directives.ParameterDirectives; import akka.http.scaladsl.server.util.Tupler$; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.iast.Source; import datadog.trace.api.iast.SourceTypes; import datadog.trace.instrumentation.akkahttp.iast.helpers.TaintMapFunction; @@ -28,16 +26,11 @@ * * @see akka.http.scaladsl.server.directives.ParameterDirectives */ -@AutoService(InstrumenterModule.class) -public class ParameterDirectivesInstrumentation extends InstrumenterModule.Iast +public class ParameterDirectivesInstrumentation implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice { private static final String TRAIT_NAME = "akka.http.scaladsl.server.directives.ParameterDirectives"; - public ParameterDirectivesInstrumentation() { - super("akka-http"); - } - @Override public String[] knownMatchingTypes() { return new String[] { @@ -45,17 +38,6 @@ public String[] knownMatchingTypes() { }; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".helpers.ScalaToJava", - packageName + ".helpers.TaintMultiMapFunction", - packageName + ".helpers.TaintMapFunction", - packageName + ".helpers.TaintSeqFunction", - packageName + ".helpers.TaintSingleParameterFunction", - }; - } - @Override public void methodAdvice(MethodTransformer transformer) { // the Java API delegates to the Scala API diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/PathMatcherInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/PathMatcherInstrumentation.java index 021c9f4df57..363565d66c5 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/PathMatcherInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/PathMatcherInstrumentation.java @@ -5,11 +5,9 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import datadog.trace.advice.ActiveRequestContext; import datadog.trace.advice.RequiresRequestContext; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.iast.IastContext; @@ -23,13 +21,8 @@ * Taints request uri parameters by instrumenting the constructor of {@link * akka.http.scaladsl.server.PathMatcher.Matched}. */ -@AutoService(InstrumenterModule.class) -public class PathMatcherInstrumentation extends InstrumenterModule.Iast +public class PathMatcherInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public PathMatcherInstrumentation() { - super("akka-http"); - } - @Override public String instrumentedType() { return "akka.http.scaladsl.server.PathMatcher$Matched"; diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java index f1cf128078e..b26d83d6c89 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/RequestContextInstrumentation.java @@ -9,11 +9,9 @@ import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.server.RequestContext; -import com.google.auto.service.AutoService; import datadog.trace.advice.ActiveRequestContext; import datadog.trace.advice.RequiresRequestContext; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.iast.IastContext; import datadog.trace.api.iast.InstrumentationBridge; @@ -22,12 +20,8 @@ import net.bytebuddy.asm.Advice; /** Propagates taint when fetching the {@link HttpRequest} from the {@link RequestContext}. */ -@AutoService(InstrumenterModule.class) -public class RequestContextInstrumentation extends InstrumenterModule.Iast +public class RequestContextInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public RequestContextInstrumentation() { - super("akka-http"); - } @Override public String instrumentedType() { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UnmarshallerInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UnmarshallerInstrumentation.java index 18884358437..1b7b4380a22 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UnmarshallerInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UnmarshallerInstrumentation.java @@ -11,9 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import akka.http.javadsl.unmarshalling.Unmarshaller; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.iast.InstrumentationBridge; import datadog.trace.api.iast.Propagation; import datadog.trace.api.iast.propagation.PropagationModule; @@ -32,25 +30,13 @@ * If, on the other hand, the unmarshallers transform input before passing it to their inner * unmarshallers, this propagation mechanism will not work. */ -@AutoService(InstrumenterModule.class) -public class UnmarshallerInstrumentation extends InstrumenterModule.Iast +public class UnmarshallerInstrumentation implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice { - public UnmarshallerInstrumentation() { - super("akka-http"); - } - @Override public String hierarchyMarkerType() { return "akka.http.scaladsl.unmarshalling.Unmarshaller"; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".helpers.TaintFutureHelper", - }; - } - @Override public ElementMatcher hierarchyMatcher() { return nameStartsWith("akka.http.scaladsl.unmarshalling.") diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UriInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UriInstrumentation.java index 1c178dfbd5d..22925340529 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UriInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/UriInstrumentation.java @@ -9,11 +9,9 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import akka.http.scaladsl.model.Uri; -import com.google.auto.service.AutoService; import datadog.trace.advice.ActiveRequestContext; import datadog.trace.advice.RequiresRequestContext; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.iast.IastContext; @@ -27,13 +25,8 @@ import scala.collection.Iterator; /** Propagates taint from a {@link Uri} to query strings fetched from it. */ -@AutoService(InstrumenterModule.class) -public class UriInstrumentation extends InstrumenterModule.Iast +public class UriInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public UriInstrumentation() { - super("akka-http"); - } - @Override public String instrumentedType() { return "akka.http.scaladsl.model.Uri"; From 8043570750c4e2484bb1a5c8a6d6963c80943278 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 2 Jan 2026 15:09:05 +0100 Subject: [PATCH 3/5] Migrate akka-http-10.2-iast to instrumenter module --- .../akkahttp102/iast/AkkaHttpIastModule.java | 40 +++++++++++++++++++ ...ormFieldDirectivesImplInstrumentation.java | 4 -- ...arameterDirectivesImplInstrumentation.java | 23 +---------- 3 files changed, 41 insertions(+), 26 deletions(-) create mode 100644 dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/AkkaHttpIastModule.java diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/AkkaHttpIastModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/AkkaHttpIastModule.java new file mode 100644 index 00000000000..8747378f896 --- /dev/null +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/AkkaHttpIastModule.java @@ -0,0 +1,40 @@ +package datadog.trace.instrumentation.akkahttp102.iast; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.agent.tooling.muzzle.Reference; +import java.util.List; + +@AutoService(InstrumenterModule.class) +public class AkkaHttpIastModule extends InstrumenterModule.Iast { + public AkkaHttpIastModule() { + super("akka-http"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".helpers.TaintParametersFunction", + }; + } + + @Override + public Reference[] additionalMuzzleReferences() { + // just so we can use assertInverse in the muzzle directive + return new Reference[] { + new Reference.Builder("akka.http.scaladsl.server.directives.FormFieldDirectives$Impl$") + .build(), + new Reference.Builder("akka.http.scaladsl.server.directives.ParameterDirectives$Impl$") + .build(), + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new FormFieldDirectivesImplInstrumentation(), new ParameterDirectivesImplInstrumentation()); + } +} diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/FormFieldDirectivesImplInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/FormFieldDirectivesImplInstrumentation.java index 6aee02050bc..c881696a0ea 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/FormFieldDirectivesImplInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/FormFieldDirectivesImplInstrumentation.java @@ -1,9 +1,5 @@ package datadog.trace.instrumentation.akkahttp102.iast; -import com.google.auto.service.AutoService; -import datadog.trace.agent.tooling.InstrumenterModule; - -@AutoService(InstrumenterModule.class) public class FormFieldDirectivesImplInstrumentation extends ParameterDirectivesImplInstrumentation { @Override public String instrumentedType() { diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java index 55ce72a8e26..b329eeacf55 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.2-iast/src/main/java/datadog/trace/instrumentation/akkahttp102/iast/ParameterDirectivesImplInstrumentation.java @@ -10,12 +10,9 @@ import akka.http.scaladsl.server.Directive; import akka.http.scaladsl.server.util.Tupler$; -import com.google.auto.service.AutoService; import datadog.trace.advice.ActiveRequestContext; import datadog.trace.advice.RequiresRequestContext; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.agent.tooling.muzzle.Reference; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.api.iast.IastContext; @@ -24,31 +21,13 @@ import datadog.trace.instrumentation.akkahttp102.iast.helpers.TaintParametersFunction; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public class ParameterDirectivesImplInstrumentation extends InstrumenterModule.Iast +public class ParameterDirectivesImplInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public ParameterDirectivesImplInstrumentation() { - super("akka-http"); - } - @Override public String instrumentedType() { return "akka.http.scaladsl.server.directives.ParameterDirectives$Impl$"; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".helpers.TaintParametersFunction", - }; - } - - @Override - public Reference[] additionalMuzzleReferences() { - // just so we can use assertInverse in the muzzle directive - return new Reference[] {new Reference.Builder(instrumentedType()).build()}; - } - @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( From 4bec2f4bb573b7b864f0bf906fd0710d8b854d7a Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 2 Jan 2026 17:21:18 +0100 Subject: [PATCH 4/5] Add module for client --- .../akkahttp/AkkaHttpClientModule.java | 32 +++++++++++++++++++ .../akkahttp/AkkaHttpServerModule.java | 2 ++ .../AkkaHttpSingleRequestInstrumentation.java | 19 +---------- .../AkkaPoolMasterActorInstrumentation.java | 8 +---- 4 files changed, 36 insertions(+), 25 deletions(-) create mode 100644 dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpClientModule.java diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpClientModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpClientModule.java new file mode 100644 index 00000000000..292c2cd092d --- /dev/null +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpClientModule.java @@ -0,0 +1,32 @@ +package datadog.trace.instrumentation.akkahttp; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import java.util.List; + +@AutoService(InstrumenterModule.class) +public class AkkaHttpClientModule extends InstrumenterModule.Tracing { + public AkkaHttpClientModule() { + super("akka-http", "akka-http-client"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".AkkaHttpClientHelpers", + packageName + ".AkkaHttpClientHelpers$OnCompleteHandler", + packageName + ".AkkaHttpClientHelpers$AkkaHttpHeaders", + packageName + ".AkkaHttpClientHelpers$HasSpanHeader", + packageName + ".AkkaHttpClientDecorator", + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new AkkaHttpSingleRequestInstrumentation(), new AkkaPoolMasterActorInstrumentation()); + } +} diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java index d84b31ee72c..c67140d5971 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpServerModule.java @@ -2,6 +2,7 @@ import static java.util.Collections.singleton; +import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.agent.tooling.muzzle.Reference; @@ -10,6 +11,7 @@ import java.util.ArrayList; import java.util.List; +@AutoService(InstrumenterModule.class) public class AkkaHttpServerModule extends InstrumenterModule.Tracing { public AkkaHttpServerModule() { super("akka-http", "akka-http-server"); diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpSingleRequestInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpSingleRequestInstrumentation.java index 29e413e9ece..129d587d98c 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpSingleRequestInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaHttpSingleRequestInstrumentation.java @@ -13,37 +13,20 @@ import akka.http.scaladsl.HttpExt; import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.model.HttpResponse; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import net.bytebuddy.asm.Advice; import scala.concurrent.Future; -@AutoService(InstrumenterModule.class) -public final class AkkaHttpSingleRequestInstrumentation extends InstrumenterModule.Tracing +public final class AkkaHttpSingleRequestInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public AkkaHttpSingleRequestInstrumentation() { - super("akka-http", "akka-http-client"); - } @Override public String instrumentedType() { return "akka.http.scaladsl.HttpExt"; } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AkkaHttpClientHelpers", - packageName + ".AkkaHttpClientHelpers$OnCompleteHandler", - packageName + ".AkkaHttpClientHelpers$AkkaHttpHeaders", - packageName + ".AkkaHttpClientHelpers$HasSpanHeader", - packageName + ".AkkaHttpClientDecorator", - }; - } - @Override public void methodAdvice(MethodTransformer transformer) { // This is mainly for compatibility with 10.0 diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaPoolMasterActorInstrumentation.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaPoolMasterActorInstrumentation.java index 83e7a74a3e2..9f90487ab0e 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaPoolMasterActorInstrumentation.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/AkkaPoolMasterActorInstrumentation.java @@ -4,18 +4,12 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan; -import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import net.bytebuddy.asm.Advice; -@AutoService(InstrumenterModule.class) -public final class AkkaPoolMasterActorInstrumentation extends InstrumenterModule.Tracing +public final class AkkaPoolMasterActorInstrumentation implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public AkkaPoolMasterActorInstrumentation() { - super("akka-http", "akka-http-client"); - } @Override public String instrumentedType() { From 440fe505dad9531dcb6f3100a3c74a1f7f547628 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 2 Jan 2026 17:52:57 +0100 Subject: [PATCH 5/5] Add forgotten instrumenter --- .../trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java index 22425cb6bd7..d5125bae4b8 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/iast/AkkaHttpIastModule.java @@ -51,6 +51,7 @@ public List typeInstrumentations() { new HttpHeaderSubclassesInstrumentation(), new HttpRequestInstrumentation(), new MakeTaintableInstrumentation(), + new MarshallingDirectivesInstrumentation(), new ParameterDirectivesInstrumentation(), new PathMatcherInstrumentation(), new RequestContextInstrumentation(),