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 5acd251b78a..5d75a39a1c5 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 @@ -100,7 +100,7 @@ public interface ExceptionDebugger { public interface CodeOriginRecorder { String captureCodeOrigin(boolean entry); - String captureCodeOrigin(Method method, boolean entry); + String captureCodeOrigin(Method method, boolean entry, boolean instrument); } private static volatile ProbeResolver probeResolver; @@ -404,10 +404,14 @@ public static String captureCodeOrigin(boolean entry) { } public static String captureCodeOrigin(Method method, boolean entry) { + return captureCodeOrigin(method, entry, true); + } + + public static String captureCodeOrigin(Method method, boolean entry, boolean instrument) { try { CodeOriginRecorder recorder = codeOriginRecorder; if (recorder != null) { - return recorder.captureCodeOrigin(method, entry); + return recorder.captureCodeOrigin(method, entry, instrument); } } 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 1cd7f4337d2..3dc59454da3 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 @@ -71,7 +71,7 @@ public String captureCodeOrigin(boolean entry) { element.getMethodName(), null, String.valueOf(element.getLineNumber())); - probe = createProbe(fingerprint, entry, where); + probe = createProbe(fingerprint, entry, where, true); LOG.debug("Creating probe for location {}", where); } @@ -79,12 +79,17 @@ public String captureCodeOrigin(boolean entry) { } @Override - public String captureCodeOrigin(Method method, boolean entry) { + public String captureCodeOrigin(Method method, boolean entry, boolean instrument) { String fingerprint = method.toString(); CodeOriginProbe probe = probesByFingerprint.get(fingerprint); if (probe == null) { - probe = createProbe(fingerprint, entry, Where.of(method)); + probe = createProbe(fingerprint, entry, Where.of(method), instrument); LOG.debug("Creating probe for method {}", fingerprint); + } else if (!instrument) { + // direct call to fill code origin info without using probe instrumentation + // buildLocation should be called before in order to gather location info + probe.commit( + CapturedContext.EMPTY_CONTEXT, CapturedContext.EMPTY_CONTEXT, Collections.emptyList()); } return probe.getId(); } @@ -105,11 +110,12 @@ public void registerLogProbe(CodeOriginProbe probe) { .build()); } - private CodeOriginProbe createProbe(String fingerPrint, boolean entry, Where where) { + private CodeOriginProbe createProbe( + String fingerPrint, boolean entry, Where where, boolean instrument) { CodeOriginProbe probe; AgentSpan span = AgentTracer.activeSpan(); - probe = new CodeOriginProbe(ProbeId.newId(), entry, where); + probe = new CodeOriginProbe(ProbeId.newId(), entry, where, instrument); addFingerprint(fingerPrint, probe); CodeOriginProbe installed = probes.putIfAbsent(probe.getId(), probe); diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/CodeOriginProbe.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/CodeOriginProbe.java index 8e2ca9faadf..e252537d748 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/CodeOriginProbe.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/CodeOriginProbe.java @@ -24,19 +24,23 @@ public class CodeOriginProbe extends ProbeDefinition { private static final Logger LOGGER = LoggerFactory.getLogger(CodeOriginProbe.class); + private final boolean instrument; private final boolean entrySpanProbe; - private String signature; - public CodeOriginProbe(ProbeId probeId, boolean entry, Where where) { + public CodeOriginProbe(ProbeId probeId, boolean entry, Where where, boolean instrument) { super(LANGUAGE, probeId, (Tag[]) null, where, MethodLocation.ENTRY); + this.instrument = instrument; this.entrySpanProbe = entry; } @Override public Status instrument( MethodInfo methodInfo, List diagnostics, List probeIds) { - return new CodeOriginInstrumentor(this, methodInfo, diagnostics, probeIds).instrument(); + if (instrument) { + return new CodeOriginInstrumentor(this, methodInfo, diagnostics, probeIds).instrument(); + } + return Status.INSTALLED; } @Override @@ -52,6 +56,10 @@ public void commit( List agentSpans = entrySpanProbe ? asList(span, span.getLocalRootSpan()) : singletonList(span); + if (location == null) { + LOGGER.debug("Code origin probe {} has no location", id); + return; + } for (AgentSpan s : agentSpans) { if (s.getTag(DD_CODE_ORIGIN_TYPE) == null) { s.setTag(DD_CODE_ORIGIN_TYPE, entrySpanProbe ? "entry" : "exit"); 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 12db52ff5b6..6969e0bd993 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 @@ -105,8 +105,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(testClass.getMethod("entry"), true, true); + codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit"), false, true); checkResults(testClass, "fullTrace", 0); checkResults(testClass, "debug_1", 2); } @@ -117,8 +117,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(testClass.getMethod("entry"), true, true); + codeOriginRecorder.captureCodeOrigin(testClass.getMethod("exit"), false, true); checkResults(testClass, "debug_1", 3); } @@ -127,10 +127,13 @@ public void doubleEntry() throws IOException, URISyntaxException { final String className = "com.datadog.debugger.CodeOrigin05"; installProbes( - new CodeOriginProbe(CODE_ORIGIN_ID1, true, Where.of(className, "entry", "()", "53")), - new CodeOriginProbe(CODE_ORIGIN_ID2, false, Where.of(className, "exit", "()", "62")), + new CodeOriginProbe(CODE_ORIGIN_ID1, true, Where.of(className, "entry", "()", "53"), true), + new CodeOriginProbe(CODE_ORIGIN_ID2, false, Where.of(className, "exit", "()", "62"), true), new CodeOriginProbe( - CODE_ORIGIN_DOUBLE_ENTRY_ID, true, Where.of(className, "doubleEntry", "()", "66"))); + CODE_ORIGIN_DOUBLE_ENTRY_ID, + true, + Where.of(className, "doubleEntry", "()", "66"), + true)); final Class testClass = compileAndLoadClass(className); checkResults(testClass, "fullTrace", 0); List trace = traceInterceptor.getTrace(); @@ -143,7 +146,7 @@ public void doubleEntry() throws IOException, URISyntaxException { public void stackDepth() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CodeOrigin04"; installProbes( - new CodeOriginProbe(CODE_ORIGIN_ID1, true, Where.of(CLASS_NAME, "exit", "()", "39"))); + new CodeOriginProbe(CODE_ORIGIN_ID1, true, Where.of(CLASS_NAME, "exit", "()", "39"), true)); Class testClass = compileAndLoadClass("com.datadog.debugger.CodeOrigin04"); countFrames(testClass, 10); @@ -187,7 +190,8 @@ public void testCaptureCodeOriginWithExplicitInfo() installProbes(); CodeOriginProbe probe = codeOriginRecorder.getProbe( - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true)); + codeOriginRecorder.captureCodeOrigin( + testClass.getMethod("main", int.class), true, true)); assertNotNull(probe, "The probe should have been created."); assertTrue(probe.entrySpanProbe(), "Should be an entry probe."); } @@ -199,18 +203,18 @@ public void testDuplicateInstrumentations() final Class testClass = compileAndLoadClass(CLASS_NAME); installProbes(); String probe1 = - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true); + codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true, true); String probe2 = - codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true); + codeOriginRecorder.captureCodeOrigin(testClass.getMethod("main", int.class), true, true); assertEquals(probe1, probe2); } @NotNull private CodeOriginProbe[] codeOriginProbes(String type) { CodeOriginProbe entry = - new CodeOriginProbe(CODE_ORIGIN_ID1, true, Where.of(type, "entry", "()", "53")); + new CodeOriginProbe(CODE_ORIGIN_ID1, true, Where.of(type, "entry", "()", "53"), true); CodeOriginProbe exit = - new CodeOriginProbe(CODE_ORIGIN_ID2, false, Where.of(type, "exit", "()", "60")); + new CodeOriginProbe(CODE_ORIGIN_ID2, false, Where.of(type, "exit", "()", "60"), true); return new CodeOriginProbe[] {entry, exit}; } diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcCodeOriginTest.groovy b/dd-java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcCodeOriginTest.groovy index cde6156d66f..e445e1a6e38 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcCodeOriginTest.groovy +++ b/dd-java-agent/instrumentation/grpc-1.5/src/test/groovy/GrpcCodeOriginTest.groovy @@ -260,7 +260,7 @@ abstract class GrpcCodeOriginTest extends VersionedNamingTestBase { } @Override - String captureCodeOrigin(Method method, boolean entry) { + String captureCodeOrigin(Method method, boolean entry, boolean instrument) { invoked = true return "done" } diff --git a/dd-java-agent/instrumentation/ignite-2.0/build.gradle b/dd-java-agent/instrumentation/ignite-2.0/build.gradle index 5a3126d5a37..e3571337462 100644 --- a/dd-java-agent/instrumentation/ignite-2.0/build.gradle +++ b/dd-java-agent/instrumentation/ignite-2.0/build.gradle @@ -7,7 +7,14 @@ muzzle { pass { group = 'org.apache.ignite' module = 'ignite-core' - versions = "[2.0.0,)" + versions = "[2.0.0,2.17.0)" + } + // ignite-core 2.17.0 is compiled with Java 11 + pass { + group = 'org.apache.ignite' + module = 'ignite-core' + versions = "[2.17.0,3)" + javaVersion = 11 } } 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..aa214a39f3e 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 @@ -35,7 +35,7 @@ class MicronautTest extends HttpServerTest { } @Override - String captureCodeOrigin(Method method, boolean entry) { + String captureCodeOrigin(Method method, boolean entry, boolean instrument) { invoked = true return "done" } diff --git a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAdvice.java b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAdvice.java index ad4c372913e..c90a7ef1d5e 100644 --- a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAdvice.java +++ b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceAdvice.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.instrumentation.trace_annotation.TraceDecorator.DECORATE; +import datadog.trace.bootstrap.debugger.DebuggerContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import java.lang.invoke.MethodType; import java.lang.reflect.Method; @@ -13,7 +14,9 @@ public class TraceAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static AgentScope onEnter(@Advice.Origin final Method method) { - return activateSpan(DECORATE.startMethodSpan(method)); + AgentScope agentScope = activateSpan(DECORATE.startMethodSpan(method)); + DebuggerContext.captureCodeOrigin(method, true, false); + return agentScope; } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java index 248563536e6..cddcb90764c 100644 --- a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java +++ b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceDecorator.java @@ -4,7 +4,6 @@ import datadog.trace.api.InstrumenterConfig; import datadog.trace.api.Trace; -import datadog.trace.bootstrap.debugger.spanorigin.CodeOriginInfo; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import datadog.trace.bootstrap.instrumentation.decorator.AsyncResultDecorator; @@ -91,7 +90,6 @@ public AgentSpan startMethodSpan(Method method) { afterStart(span); span.setResourceName(resourceName); - CodeOriginInfo.entry(method); if (measured || InstrumenterConfig.get().isMethodMeasured(method)) { span.setMeasured(true); }