Skip to content

Commit 745b2f1

Browse files
Make Akka's ForkJoin pool instrumented class names configurable (#8766)
1 parent 07d1350 commit 745b2f1

File tree

5 files changed

+62
-4
lines changed

5 files changed

+62
-4
lines changed

dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinExecutorTaskInstrumentation.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.google.auto.service.AutoService;
1212
import datadog.trace.agent.tooling.Instrumenter;
1313
import datadog.trace.agent.tooling.InstrumenterModule;
14+
import datadog.trace.api.InstrumenterConfig;
1415
import datadog.trace.bootstrap.InstrumentationContext;
1516
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
1617
import datadog.trace.bootstrap.instrumentation.java.concurrent.State;
@@ -25,7 +26,9 @@
2526
*/
2627
@AutoService(InstrumenterModule.class)
2728
public final class AkkaForkJoinExecutorTaskInstrumentation extends InstrumenterModule.Tracing
28-
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
29+
implements Instrumenter.ForSingleType,
30+
Instrumenter.ForConfiguredType,
31+
Instrumenter.HasMethodAdvice {
2932
public AkkaForkJoinExecutorTaskInstrumentation() {
3033
super("java_concurrent", "akka_concurrent");
3134
}
@@ -40,6 +43,11 @@ public String instrumentedType() {
4043
return "akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask";
4144
}
4245

46+
@Override
47+
public String configuredMatchingType() {
48+
return InstrumenterConfig.get().getAkkaForkJoinExecutorTaskName();
49+
}
50+
4351
@Override
4452
public void methodAdvice(MethodTransformer transformer) {
4553
transformer.applyAdvice(

dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinPoolInstrumentation.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@
1212
import com.google.auto.service.AutoService;
1313
import datadog.trace.agent.tooling.Instrumenter;
1414
import datadog.trace.agent.tooling.InstrumenterModule;
15+
import datadog.trace.api.InstrumenterConfig;
1516
import datadog.trace.bootstrap.InstrumentationContext;
1617
import datadog.trace.bootstrap.instrumentation.java.concurrent.State;
1718
import java.util.Map;
1819
import net.bytebuddy.asm.Advice;
1920

2021
@AutoService(InstrumenterModule.class)
2122
public final class AkkaForkJoinPoolInstrumentation extends InstrumenterModule.Tracing
22-
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
23+
implements Instrumenter.ForSingleType,
24+
Instrumenter.ForConfiguredType,
25+
Instrumenter.HasMethodAdvice {
2326

2427
public AkkaForkJoinPoolInstrumentation() {
2528
super("java_concurrent", "akka_concurrent");
@@ -30,6 +33,11 @@ public String instrumentedType() {
3033
return "akka.dispatch.forkjoin.ForkJoinPool";
3134
}
3235

36+
@Override
37+
public String configuredMatchingType() {
38+
return InstrumenterConfig.get().getAkkaForkJoinPoolName();
39+
}
40+
3341
@Override
3442
public Map<String, String> contextStore() {
3543
return singletonMap("akka.dispatch.forkjoin.ForkJoinTask", State.class.getName());
@@ -43,6 +51,7 @@ public void methodAdvice(MethodTransformer transformer) {
4351
}
4452

4553
public static final class ExternalPush {
54+
4655
@Advice.OnMethodEnter
4756
public static <T> void externalPush(@Advice.Argument(0) ForkJoinTask<T> task) {
4857
if (!exclude(FORK_JOIN_TASK, task)) {

dd-java-agent/instrumentation/akka-concurrent/src/main/java/datadog/trace/instrumentation/akka/concurrent/AkkaForkJoinTaskInstrumentation.java

+15-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import datadog.trace.agent.tooling.ExcludeFilterProvider;
2020
import datadog.trace.agent.tooling.Instrumenter;
2121
import datadog.trace.agent.tooling.InstrumenterModule;
22+
import datadog.trace.api.InstrumenterConfig;
2223
import datadog.trace.bootstrap.InstrumentationContext;
2324
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
2425
import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter;
@@ -52,14 +53,26 @@ public Map<String, String> contextStore() {
5253

5354
@Override
5455
public String hierarchyMarkerType() {
55-
return "akka.dispatch.forkjoin.ForkJoinTask";
56+
String akkaForkJoinTaskName = InstrumenterConfig.get().getAkkaForkJoinTaskName();
57+
return akkaForkJoinTaskName != null && !akkaForkJoinTaskName.isEmpty()
58+
? null // bypass the hint if custom class is configured
59+
: "akka.dispatch.forkjoin.ForkJoinTask";
5660
}
5761

5862
@Override
5963
public ElementMatcher<TypeDescription> hierarchyMatcher() {
6064
return notExcludedByName(FORK_JOIN_TASK)
6165
.and(declaresMethod(namedOneOf("exec", "fork", "cancel")))
62-
.and(extendsClass(named(hierarchyMarkerType())));
66+
.and(isForkJoinTaskSubclass());
67+
}
68+
69+
private ElementMatcher<TypeDescription> isForkJoinTaskSubclass() {
70+
ElementMatcher.Junction<TypeDescription> forkJoinTaskSubclass =
71+
extendsClass(named("akka.dispatch.forkjoin.ForkJoinTask"));
72+
String akkaForkJoinTaskName = InstrumenterConfig.get().getAkkaForkJoinTaskName();
73+
return akkaForkJoinTaskName != null && !akkaForkJoinTaskName.isEmpty()
74+
? forkJoinTaskSubclass.or(extendsClass(named(akkaForkJoinTaskName)))
75+
: forkJoinTaskSubclass;
6376
}
6477

6578
@Override

dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java

+5
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ public final class TraceInstrumentationConfig {
7272

7373
public static final String JDBC_CONNECTION_CLASS_NAME = "trace.jdbc.connection.class.name";
7474

75+
public static final String AKKA_FORK_JOIN_TASK_NAME = "trace.akka.fork.join.task.name";
76+
public static final String AKKA_FORK_JOIN_EXECUTOR_TASK_NAME =
77+
"trace.akka.fork.join.executor.task.name";
78+
public static final String AKKA_FORK_JOIN_POOL_NAME = "trace.akka.fork.join.pool.name";
79+
7580
public static final String EXPERIMENTATAL_JEE_SPLIT_BY_DEPLOYMENT =
7681
"trace.experimental.jee.split-by-deployment";
7782

internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java

+23
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import static datadog.trace.api.config.ProfilingConfig.PROFILING_DIRECT_ALLOCATION_ENABLED_DEFAULT;
3333
import static datadog.trace.api.config.ProfilingConfig.PROFILING_ENABLED;
3434
import static datadog.trace.api.config.ProfilingConfig.PROFILING_ENABLED_DEFAULT;
35+
import static datadog.trace.api.config.TraceInstrumentationConfig.AKKA_FORK_JOIN_EXECUTOR_TASK_NAME;
36+
import static datadog.trace.api.config.TraceInstrumentationConfig.AKKA_FORK_JOIN_POOL_NAME;
37+
import static datadog.trace.api.config.TraceInstrumentationConfig.AKKA_FORK_JOIN_TASK_NAME;
3538
import static datadog.trace.api.config.TraceInstrumentationConfig.AXIS_TRANSPORT_CLASS_NAME;
3639
import static datadog.trace.api.config.TraceInstrumentationConfig.CODE_ORIGIN_FOR_SPANS_ENABLED;
3740
import static datadog.trace.api.config.TraceInstrumentationConfig.EXPERIMENTAL_DEFER_INTEGRATIONS_UNTIL;
@@ -129,6 +132,10 @@ public class InstrumenterConfig {
129132
private final boolean websocketTracingEnabled;
130133
private final boolean pekkoSchedulerEnabled;
131134

135+
private final String akkaForkJoinTaskName;
136+
private final String akkaForkJoinExecutorTaskName;
137+
private final String akkaForkJoinPoolName;
138+
132139
private final boolean directAllocationProfilingEnabled;
133140

134141
private final String instrumentationConfigId;
@@ -228,6 +235,10 @@ private InstrumenterConfig() {
228235
httpURLConnectionClassName = configProvider.getString(HTTP_URL_CONNECTION_CLASS_NAME, "");
229236
axisTransportClassName = configProvider.getString(AXIS_TRANSPORT_CLASS_NAME, "");
230237

238+
akkaForkJoinTaskName = configProvider.getString(AKKA_FORK_JOIN_TASK_NAME, "");
239+
akkaForkJoinExecutorTaskName = configProvider.getString(AKKA_FORK_JOIN_EXECUTOR_TASK_NAME, "");
240+
akkaForkJoinPoolName = configProvider.getString(AKKA_FORK_JOIN_POOL_NAME, "");
241+
231242
directAllocationProfilingEnabled =
232243
configProvider.getBoolean(
233244
PROFILING_DIRECT_ALLOCATION_ENABLED, PROFILING_DIRECT_ALLOCATION_ENABLED_DEFAULT);
@@ -404,6 +415,18 @@ public String getAxisTransportClassName() {
404415
return axisTransportClassName;
405416
}
406417

418+
public String getAkkaForkJoinTaskName() {
419+
return akkaForkJoinTaskName;
420+
}
421+
422+
public String getAkkaForkJoinExecutorTaskName() {
423+
return akkaForkJoinExecutorTaskName;
424+
}
425+
426+
public String getAkkaForkJoinPoolName() {
427+
return akkaForkJoinPoolName;
428+
}
429+
407430
public boolean isDirectAllocationProfilingEnabled() {
408431
return directAllocationProfilingEnabled;
409432
}

0 commit comments

Comments
 (0)