diff --git a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java index 36bd7dd6f86..120d7a31541 100644 --- a/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java +++ b/dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java @@ -1,5 +1,6 @@ package datadog.trace.bootstrap.debugger; +import datadog.instrument.asm.Type; import datadog.trace.api.Config; import datadog.trace.bootstrap.debugger.util.TimeoutChecker; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -100,7 +101,7 @@ public interface ExceptionDebugger { public interface CodeOriginRecorder { String captureCodeOrigin(boolean entry); - String captureCodeOrigin(Method method, boolean entry); + String captureCodeOrigin(String typeName, String methodName, String descriptor, boolean entry); } private static volatile ProbeResolver probeResolver; @@ -506,11 +507,27 @@ public static void captureCodeOrigin(boolean entry) { } } + public static void captureCodeOrigin( + String typeName, String methodName, String descriptor, boolean entry) { + try { + CodeOriginRecorder recorder = codeOriginRecorder; + if (recorder != null) { + recorder.captureCodeOrigin(typeName, methodName, descriptor, entry); + } + } catch (Exception ex) { + LOGGER.debug("Error in captureCodeOrigin: ", ex); + } + } + public static void captureCodeOrigin(Method method, boolean entry) { try { CodeOriginRecorder recorder = codeOriginRecorder; if (recorder != null) { - recorder.captureCodeOrigin(method, entry); + recorder.captureCodeOrigin( + method.getDeclaringClass().getName(), + method.getName(), + Type.getMethodDescriptor(method), + entry); } } catch (Exception ex) { LOGGER.debug("Error in captureCodeOrigin: ", ex); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java index 0b6d0c7b75f..fb5b26785b2 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/codeorigin/DefaultCodeOriginRecorder.java @@ -5,6 +5,7 @@ import com.datadog.debugger.agent.ConfigurationUpdater; import com.datadog.debugger.exception.Fingerprinter; +import com.datadog.debugger.instrumentation.Types; import com.datadog.debugger.probe.CodeOriginProbe; import com.datadog.debugger.probe.LogProbe; import com.datadog.debugger.probe.LogProbe.Builder; @@ -20,7 +21,6 @@ import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.util.AgentTaskScheduler; import datadog.trace.util.stacktrace.StackWalkerFactory; -import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -82,11 +82,13 @@ public String captureCodeOrigin(boolean entry) { } @Override - public String captureCodeOrigin(Method method, boolean entry) { - String fingerprint = method.toString(); + public String captureCodeOrigin( + String typeName, String methodName, String descriptor, boolean entry) { + String fingerprint = typeName + "." + methodName + descriptor; CodeOriginProbe probe = probesByFingerprint.get(fingerprint); if (probe == null) { - probe = createProbe(fingerprint, entry, Where.of(method)); + String signature = Types.descriptorToSignature(descriptor); + probe = createProbe(fingerprint, entry, Where.of(typeName, methodName, signature)); LOG.debug("Creating probe for method {}", fingerprint); } return probe.getId(); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java index 9383846b7b9..72787c61e6e 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/Where.java @@ -1,7 +1,5 @@ package com.datadog.debugger.probe; -import static java.util.Arrays.stream; - import com.datadog.debugger.agent.Generated; import com.datadog.debugger.instrumentation.Types; import com.datadog.debugger.util.ClassFileLines; @@ -9,14 +7,12 @@ import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonWriter; import java.io.IOException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.MethodNode; @@ -50,13 +46,8 @@ public static Where of(String typeName, String methodName, String signature, Str return new Where(typeName, methodName, signature, lines, null); } - public static Where of(Method method) { - return of( - method.getDeclaringClass().getName(), - method.getName(), - stream(method.getParameterTypes()) - .map(Class::getTypeName) - .collect(Collectors.joining(", ", "(", ")"))); + public static Where of(String typeName, String methodName, String signature) { + return new Where(typeName, methodName, signature, (SourceLine[]) null, null); } protected static SourceLine[] sourceLines(String[] defs) { diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java index 0a53e61150d..65bbd72ae9d 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java @@ -133,8 +133,8 @@ public void withDebug1() throws Exception { final String className = "com.datadog.debugger.CodeOrigin02"; installProbes(); final Class testClass = compileAndLoadClass(className); - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("entry"), true); - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit"), false); + codeOriginRecorder.captureCodeOrigin(className, "entry", "()", true); + codeOriginRecorder.captureCodeOrigin(className, "exit", "()", false); checkResults(testClass, "fullTrace", 0); checkResults(testClass, "debug_1", 2); } @@ -145,8 +145,8 @@ public void withLogProbe() throws Exception { installProbes( createProbeBuilder(PROBE_ID, CLASS_NAME, "entry", "()").captureSnapshot(true).build()); final Class testClass = compileAndLoadClass(CLASS_NAME); - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("entry"), true); - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit"), false); + codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "entry", "()", true); + codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "exit", "()", false); checkResults(testClass, "debug_1", 3); } @@ -230,7 +230,7 @@ public void testCaptureCodeOriginWithExplicitInfo() installProbes(); CodeOriginProbe probe = codeOriginRecorder.getProbe( - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true)); + codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true)); assertNotNull(probe, "The probe should have been created."); assertTrue(probe.entrySpanProbe(), "Should be an entry probe."); } @@ -241,10 +241,8 @@ public void testDuplicateInstrumentations() final String CLASS_NAME = "com.datadog.debugger.CodeOrigin04"; final Class testClass = compileAndLoadClass(CLASS_NAME); installProbes(); - String probe1 = - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true); - String probe2 = - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true); + String probe1 = codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true); + String probe2 = codeOriginRecorder.captureCodeOrigin(CLASS_NAME, "main", "(I)", true); assertEquals(probe1, probe2); } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTestAdvice.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTestAdvice.java index e37a4d40db4..36acb50365c 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTestAdvice.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTestAdvice.java @@ -3,15 +3,17 @@ import static datadog.trace.bootstrap.debugger.DebuggerContext.captureCodeOrigin; import static datadog.trace.bootstrap.debugger.DebuggerContext.marker; -import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; public class CodeOriginTestAdvice { @Advice.OnMethodEnter @SuppressWarnings("bytebuddy-exception-suppression") - public static void onEnter(@Advice.Origin final Method method) { + public static void onEnter( + @Advice.Origin("#t") String typeName, + @Advice.Origin("#m") String methodName, + @Advice.Origin("#d") String descriptor) { marker(); - captureCodeOrigin(method, true); + captureCodeOrigin(typeName, methodName, descriptor, true); } } diff --git a/dd-java-agent/instrumentation/micronaut/http-server-netty-4.0/src/test/groovy/MicronautTest.groovy b/dd-java-agent/instrumentation/micronaut/http-server-netty-4.0/src/test/groovy/MicronautTest.groovy index ddae4eccf59..4f5014f8ef8 100644 --- a/dd-java-agent/instrumentation/micronaut/http-server-netty-4.0/src/test/groovy/MicronautTest.groovy +++ b/dd-java-agent/instrumentation/micronaut/http-server-netty-4.0/src/test/groovy/MicronautTest.groovy @@ -8,8 +8,6 @@ import datadog.trace.instrumentation.micronaut.v4_0.MicronautDecorator import datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator import test.MicronautServer -import java.lang.reflect.Method - import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND @@ -35,7 +33,7 @@ class MicronautTest extends HttpServerTest { } @Override - String captureCodeOrigin(Method method, boolean entry) { + String captureCodeOrigin(String typeName, String methodName, String descriptor, boolean entry) { invoked = true return "done" } diff --git a/dd-java-agent/instrumentation/span-origin/src/main/java/datadog/trace/instrumentation/codeorigin/EntrySpanOriginAdvice.java b/dd-java-agent/instrumentation/span-origin/src/main/java/datadog/trace/instrumentation/codeorigin/EntrySpanOriginAdvice.java index 0d3ec50daa7..c69ade49dbf 100644 --- a/dd-java-agent/instrumentation/span-origin/src/main/java/datadog/trace/instrumentation/codeorigin/EntrySpanOriginAdvice.java +++ b/dd-java-agent/instrumentation/span-origin/src/main/java/datadog/trace/instrumentation/codeorigin/EntrySpanOriginAdvice.java @@ -3,15 +3,17 @@ import static datadog.trace.bootstrap.debugger.DebuggerContext.captureCodeOrigin; import static datadog.trace.bootstrap.debugger.DebuggerContext.marker; -import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; public class EntrySpanOriginAdvice { @Advice.OnMethodEnter @SuppressWarnings("bytebuddy-exception-suppression") - public static void onEnter(@Advice.Origin final Method method) { + public static void onEnter( + @Advice.Origin("#t") String typeName, + @Advice.Origin("#m") String methodName, + @Advice.Origin("#d") String descriptor) { marker(); - captureCodeOrigin(method, true); + captureCodeOrigin(typeName, methodName, descriptor, true); } }