Skip to content

Commit c79dfc6

Browse files
authored
Avoid expensive Class.getMethod call in code-origin advice (#10019)
1 parent cedc49c commit c79dfc6

File tree

7 files changed

+45
-35
lines changed

7 files changed

+45
-35
lines changed

dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.bootstrap.debugger;
22

3+
import datadog.instrument.asm.Type;
34
import datadog.trace.api.Config;
45
import datadog.trace.bootstrap.debugger.util.TimeoutChecker;
56
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
@@ -100,7 +101,7 @@ public interface ExceptionDebugger {
100101
public interface CodeOriginRecorder {
101102
String captureCodeOrigin(boolean entry);
102103

103-
String captureCodeOrigin(Method method, boolean entry);
104+
String captureCodeOrigin(String typeName, String methodName, String descriptor, boolean entry);
104105
}
105106

106107
private static volatile ProbeResolver probeResolver;
@@ -506,11 +507,27 @@ public static void captureCodeOrigin(boolean entry) {
506507
}
507508
}
508509

510+
public static void captureCodeOrigin(
511+
String typeName, String methodName, String descriptor, boolean entry) {
512+
try {
513+
CodeOriginRecorder recorder = codeOriginRecorder;
514+
if (recorder != null) {
515+
recorder.captureCodeOrigin(typeName, methodName, descriptor, entry);
516+
}
517+
} catch (Exception ex) {
518+
LOGGER.debug("Error in captureCodeOrigin: ", ex);
519+
}
520+
}
521+
509522
public static void captureCodeOrigin(Method method, boolean entry) {
510523
try {
511524
CodeOriginRecorder recorder = codeOriginRecorder;
512525
if (recorder != null) {
513-
recorder.captureCodeOrigin(method, entry);
526+
recorder.captureCodeOrigin(
527+
method.getDeclaringClass().getName(),
528+
method.getName(),
529+
Type.getMethodDescriptor(method),
530+
entry);
514531
}
515532
} catch (Exception ex) {
516533
LOGGER.debug("Error in captureCodeOrigin: ", ex);

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.datadog.debugger.agent.ConfigurationUpdater;
77
import com.datadog.debugger.exception.Fingerprinter;
8+
import com.datadog.debugger.instrumentation.Types;
89
import com.datadog.debugger.probe.CodeOriginProbe;
910
import com.datadog.debugger.probe.LogProbe;
1011
import com.datadog.debugger.probe.LogProbe.Builder;
@@ -20,7 +21,6 @@
2021
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
2122
import datadog.trace.util.AgentTaskScheduler;
2223
import datadog.trace.util.stacktrace.StackWalkerFactory;
23-
import java.lang.reflect.Method;
2424
import java.util.Collection;
2525
import java.util.Collections;
2626
import java.util.HashMap;
@@ -82,11 +82,13 @@ public String captureCodeOrigin(boolean entry) {
8282
}
8383

8484
@Override
85-
public String captureCodeOrigin(Method method, boolean entry) {
86-
String fingerprint = method.toString();
85+
public String captureCodeOrigin(
86+
String typeName, String methodName, String descriptor, boolean entry) {
87+
String fingerprint = typeName + "." + methodName + descriptor;
8788
CodeOriginProbe probe = probesByFingerprint.get(fingerprint);
8889
if (probe == null) {
89-
probe = createProbe(fingerprint, entry, Where.of(method));
90+
String signature = Types.descriptorToSignature(descriptor);
91+
probe = createProbe(fingerprint, entry, Where.of(typeName, methodName, signature));
9092
LOG.debug("Creating probe for method {}", fingerprint);
9193
}
9294
return probe.getId();

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
package com.datadog.debugger.probe;
22

3-
import static java.util.Arrays.stream;
4-
53
import com.datadog.debugger.agent.Generated;
64
import com.datadog.debugger.instrumentation.Types;
75
import com.datadog.debugger.util.ClassFileLines;
86
import com.squareup.moshi.JsonAdapter;
97
import com.squareup.moshi.JsonReader;
108
import com.squareup.moshi.JsonWriter;
119
import java.io.IOException;
12-
import java.lang.reflect.Method;
1310
import java.util.ArrayList;
1411
import java.util.Arrays;
1512
import java.util.List;
1613
import java.util.Objects;
1714
import java.util.regex.Matcher;
1815
import java.util.regex.Pattern;
19-
import java.util.stream.Collectors;
2016
import org.objectweb.asm.Opcodes;
2117
import org.objectweb.asm.tree.MethodNode;
2218

@@ -50,13 +46,8 @@ public static Where of(String typeName, String methodName, String signature, Str
5046
return new Where(typeName, methodName, signature, lines, null);
5147
}
5248

53-
public static Where of(Method method) {
54-
return of(
55-
method.getDeclaringClass().getName(),
56-
method.getName(),
57-
stream(method.getParameterTypes())
58-
.map(Class::getTypeName)
59-
.collect(Collectors.joining(", ", "(", ")")));
49+
public static Where of(String typeName, String methodName, String signature) {
50+
return new Where(typeName, methodName, signature, (SourceLine[]) null, null);
6051
}
6152

6253
protected static SourceLine[] sourceLines(String[] defs) {

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ public void withDebug1() throws Exception {
133133
final String className = "com.datadog.debugger.CodeOrigin02";
134134
installProbes();
135135
final Class<?> testClass = compileAndLoadClass(className);
136-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("entry"), true);
137-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit"), false);
136+
codeOriginRecorder.captureCodeOrigin(className, "entry", "()", true);
137+
codeOriginRecorder.captureCodeOrigin(className, "exit", "()", false);
138138
checkResults(testClass, "fullTrace", 0);
139139
checkResults(testClass, "debug_1", 2);
140140
}
@@ -145,8 +145,8 @@ public void withLogProbe() throws Exception {
145145
installProbes(
146146
createProbeBuilder(PROBE_ID, CLASS_NAME, "entry", "()").captureSnapshot(true).build());
147147
final Class<?> testClass = compileAndLoadClass(CLASS_NAME);
148-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("entry"), true);
149-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit"), false);
148+
codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "entry", "()", true);
149+
codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "exit", "()", false);
150150
checkResults(testClass, "debug_1", 3);
151151
}
152152

@@ -230,7 +230,7 @@ public void testCaptureCodeOriginWithExplicitInfo()
230230
installProbes();
231231
CodeOriginProbe probe =
232232
codeOriginRecorder.getProbe(
233-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true));
233+
codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true));
234234
assertNotNull(probe, "The probe should have been created.");
235235
assertTrue(probe.entrySpanProbe(), "Should be an entry probe.");
236236
}
@@ -241,10 +241,8 @@ public void testDuplicateInstrumentations()
241241
final String CLASS_NAME = "com.datadog.debugger.CodeOrigin04";
242242
final Class<?> testClass = compileAndLoadClass(CLASS_NAME);
243243
installProbes();
244-
String probe1 =
245-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true);
246-
String probe2 =
247-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true);
244+
String probe1 = codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true);
245+
String probe2 = codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true);
248246
assertEquals(probe1, probe2);
249247
}
250248

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTestAdvice.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
import static datadog.trace.bootstrap.debugger.DebuggerContext.captureCodeOrigin;
44
import static datadog.trace.bootstrap.debugger.DebuggerContext.marker;
55

6-
import java.lang.reflect.Method;
76
import net.bytebuddy.asm.Advice;
87

98
public class CodeOriginTestAdvice {
109

1110
@Advice.OnMethodEnter
1211
@SuppressWarnings("bytebuddy-exception-suppression")
13-
public static void onEnter(@Advice.Origin final Method method) {
12+
public static void onEnter(
13+
@Advice.Origin("#t") String typeName,
14+
@Advice.Origin("#m") String methodName,
15+
@Advice.Origin("#d") String descriptor) {
1416
marker();
15-
captureCodeOrigin(method, true);
17+
captureCodeOrigin(typeName, methodName, descriptor, true);
1618
}
1719
}

dd-java-agent/instrumentation/micronaut/http-server-netty-4.0/src/test/groovy/MicronautTest.groovy

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import datadog.trace.instrumentation.micronaut.v4_0.MicronautDecorator
88
import datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator
99
import test.MicronautServer
1010

11-
import java.lang.reflect.Method
12-
1311
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR
1412
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
1513
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND
@@ -35,7 +33,7 @@ class MicronautTest extends HttpServerTest<Object> {
3533
}
3634

3735
@Override
38-
String captureCodeOrigin(Method method, boolean entry) {
36+
String captureCodeOrigin(String typeName, String methodName, String descriptor, boolean entry) {
3937
invoked = true
4038
return "done"
4139
}

dd-java-agent/instrumentation/span-origin/src/main/java/datadog/trace/instrumentation/codeorigin/EntrySpanOriginAdvice.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
import static datadog.trace.bootstrap.debugger.DebuggerContext.captureCodeOrigin;
44
import static datadog.trace.bootstrap.debugger.DebuggerContext.marker;
55

6-
import java.lang.reflect.Method;
76
import net.bytebuddy.asm.Advice;
87

98
public class EntrySpanOriginAdvice {
109

1110
@Advice.OnMethodEnter
1211
@SuppressWarnings("bytebuddy-exception-suppression")
13-
public static void onEnter(@Advice.Origin final Method method) {
12+
public static void onEnter(
13+
@Advice.Origin("#t") String typeName,
14+
@Advice.Origin("#m") String methodName,
15+
@Advice.Origin("#d") String descriptor) {
1416
marker();
15-
captureCodeOrigin(method, true);
17+
captureCodeOrigin(typeName, methodName, descriptor, true);
1618
}
1719
}

0 commit comments

Comments
 (0)