Skip to content

Commit d808c97

Browse files
committed
Avoid expensive Class.getMethod call in code-origin advice
1 parent cedc49c commit d808c97

File tree

10 files changed

+36
-38
lines changed

10 files changed

+36
-38
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import datadog.trace.api.Config;
44
import datadog.trace.bootstrap.debugger.util.TimeoutChecker;
55
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
6-
import java.lang.reflect.Method;
76
import java.time.Duration;
87
import java.time.temporal.ChronoUnit;
98
import java.util.ArrayList;
@@ -100,7 +99,7 @@ public interface ExceptionDebugger {
10099
public interface CodeOriginRecorder {
101100
String captureCodeOrigin(boolean entry);
102101

103-
String captureCodeOrigin(Method method, boolean entry);
102+
String captureCodeOrigin(String methodToString, boolean entry);
104103
}
105104

106105
private static volatile ProbeResolver probeResolver;
@@ -506,11 +505,11 @@ public static void captureCodeOrigin(boolean entry) {
506505
}
507506
}
508507

509-
public static void captureCodeOrigin(Method method, boolean entry) {
508+
public static void captureCodeOrigin(String methodToString, boolean entry) {
510509
try {
511510
CodeOriginRecorder recorder = codeOriginRecorder;
512511
if (recorder != null) {
513-
recorder.captureCodeOrigin(method, entry);
512+
recorder.captureCodeOrigin(methodToString, entry);
514513
}
515514
} catch (Exception ex) {
516515
LOGGER.debug("Error in captureCodeOrigin: ", ex);

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
2121
import datadog.trace.util.AgentTaskScheduler;
2222
import datadog.trace.util.stacktrace.StackWalkerFactory;
23-
import java.lang.reflect.Method;
2423
import java.util.Collection;
2524
import java.util.Collections;
2625
import java.util.HashMap;
@@ -82,12 +81,11 @@ public String captureCodeOrigin(boolean entry) {
8281
}
8382

8483
@Override
85-
public String captureCodeOrigin(Method method, boolean entry) {
86-
String fingerprint = method.toString();
87-
CodeOriginProbe probe = probesByFingerprint.get(fingerprint);
84+
public String captureCodeOrigin(String methodToString, boolean entry) {
85+
CodeOriginProbe probe = probesByFingerprint.get(methodToString);
8886
if (probe == null) {
89-
probe = createProbe(fingerprint, entry, Where.of(method));
90-
LOG.debug("Creating probe for method {}", fingerprint);
87+
probe = createProbe(methodToString, entry, Where.of(methodToString));
88+
LOG.debug("Creating probe for method {}", methodToString);
9189
}
9290
return probe.getId();
9391
}

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

Lines changed: 10 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,16 @@ 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 methodToString) {
50+
int signatureStart = methodToString.indexOf('(');
51+
int methodNameStart = methodToString.lastIndexOf('.', signatureStart) + 1;
52+
int declaringTypeStart = methodToString.lastIndexOf(' ', methodNameStart) + 1;
53+
return new Where(
54+
methodToString.substring(declaringTypeStart, methodNameStart - 1),
55+
methodToString.substring(methodNameStart, signatureStart),
56+
methodToString.substring(signatureStart),
57+
(SourceLine[]) null,
58+
null);
6059
}
6160

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

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

Lines changed: 10 additions & 7 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(testClass.getMethod("entry").toString(), true);
137+
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit").toString(), 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(testClass.getMethod("entry").toString(), true);
149+
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit").toString(), false);
150150
checkResults(testClass, "debug_1", 3);
151151
}
152152

@@ -230,7 +230,8 @@ public void testCaptureCodeOriginWithExplicitInfo()
230230
installProbes();
231231
CodeOriginProbe probe =
232232
codeOriginRecorder.getProbe(
233-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true));
233+
codeOriginRecorder.captureCodeOrigin(
234+
testClass.getMethod("main", int.class).toString(), true));
234235
assertNotNull(probe, "The probe should have been created.");
235236
assertTrue(probe.entrySpanProbe(), "Should be an entry probe.");
236237
}
@@ -242,9 +243,11 @@ public void testDuplicateInstrumentations()
242243
final Class<?> testClass = compileAndLoadClass(CLASS_NAME);
243244
installProbes();
244245
String probe1 =
245-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true);
246+
codeOriginRecorder.captureCodeOrigin(
247+
testClass.getMethod("main", int.class).toString(), true);
246248
String probe2 =
247-
codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true);
249+
codeOriginRecorder.captureCodeOrigin(
250+
testClass.getMethod("main", int.class).toString(), true);
248251
assertEquals(probe1, probe2);
249252
}
250253

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ public class CodeOriginTestAdvice {
1212
@SuppressWarnings("bytebuddy-exception-suppression")
1313
public static void onEnter(@Advice.Origin final Method method) {
1414
marker();
15-
captureCodeOrigin(method, true);
15+
captureCodeOrigin(method.toString(), true);
1616
}
1717
}

dd-java-agent/agent-debugger/src/test/resources/com/datadog/debugger/CodeOrigin01.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static int main(String arg) throws ReflectiveOperationException {
2020
AgentSpan span = newSpan("main");
2121
AgentScope scope = tracerAPI.activateManualSpan(span);
2222
marker();
23-
captureCodeOrigin(CodeOrigin01.class.getDeclaredMethod("main", String.class), true);
23+
captureCodeOrigin(CodeOrigin01.class.getDeclaredMethod("main", String.class).toString(), true);
2424
if (arg.equals("debug_1")) {
2525
((DDSpan) span.getLocalRootSpan()).setTag("_dd.p.debug", "1");
2626
} else if (arg.equals("debug_0")) {

dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/server/MethodHandlersInstrumentation.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ public static void onEnter(@Advice.Argument(0) Object serviceImpl) {
7171
try {
7272
marker();
7373
captureCodeOrigin(
74-
serviceClass.getDeclaredMethod(method.getName(), method.getParameterTypes()),
74+
serviceClass
75+
.getDeclaredMethod(method.getName(), method.getParameterTypes())
76+
.toString(),
7577
true);
7678
} catch (Throwable e) {
7779
// service method not overridden on the impl. skipping instrumentation.

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 methodToString, 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: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
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(@Advice.Origin final String methodToString) {
1413
marker();
15-
captureCodeOrigin(method, true);
14+
captureCodeOrigin(methodToString, true);
1615
}
1716
}

dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAdvice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class TraceAdvice {
1717
public static AgentScope onEnter(@Advice.Origin final Method method) {
1818
AgentScope agentScope = activateSpan(DECORATE.startMethodSpan(method));
1919
marker();
20-
captureCodeOrigin(method, true);
20+
captureCodeOrigin(method.toString(), true);
2121
return agentScope;
2222
}
2323

0 commit comments

Comments
 (0)