diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java index ef920a0518..1d0f152974 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/AgentInstaller.java @@ -80,7 +80,8 @@ public class AgentInstaller { "datadog.trace.bootstrap.instrumentation.java.concurrent.RunnableWrapper") .or( named( - "datadog.trace.bootstrap.instrumentation.java.concurrent.CallableWrapper"))))) + "datadog.trace.bootstrap.instrumentation.java.concurrent.CallableWrapper") + .or(nameStartsWith("datadog.trace.agent.test")))))) .or(nameStartsWith("datadog.opentracing.")) .or(nameStartsWith("datadog.slf4j.")) .or(nameStartsWith("net.bytebuddy.")) @@ -142,7 +143,7 @@ public class AgentInstaller { try { agentBuilder = instrumenter.instrument(agentBuilder); numInstrumenters++; - } catch (final Throwable e) { + } catch (final Exception | LinkageError e) { log.error("Unable to load instrumentation {}", instrumenter.getClass().getName(), e); } } diff --git a/dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/tooling/AgentInstallerTest.groovy b/dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/tooling/AgentInstallerTest.groovy new file mode 100644 index 0000000000..a09c97fe17 --- /dev/null +++ b/dd-java-agent/agent-tooling/src/test/groovy/datadog/trace/agent/tooling/AgentInstallerTest.groovy @@ -0,0 +1,18 @@ +package datadog.trace.agent.tooling + +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.agent.test.TestClass + +class AgentInstallerTest extends AgentTestRunner { + + def "Exception in instrumentation is limited to that instrumentation"() { + given: + TestClass instance = new TestClass() + + when: + String returnValue = instance.doSomething() + + then: + returnValue == "overridden value" + } +} diff --git a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/BadInstrumentation.java b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/BadInstrumentation.java new file mode 100644 index 0000000000..0dd5e9abb8 --- /dev/null +++ b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/BadInstrumentation.java @@ -0,0 +1,26 @@ +package datadog.trace.agent.test; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collections; +import java.util.Map; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(Instrumenter.class) +public class BadInstrumentation extends Instrumenter.Default { + public BadInstrumentation() { + super("bad-test-instrumentation"); + } + + @Override + public ElementMatcher typeMatcher() { + throw new RuntimeException("Test Exception"); + } + + @Override + public Map, String> transformers() { + return Collections.emptyMap(); + } +} diff --git a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/GoodInstrumentation.java b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/GoodInstrumentation.java new file mode 100644 index 0000000000..490d8d823b --- /dev/null +++ b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/GoodInstrumentation.java @@ -0,0 +1,37 @@ +package datadog.trace.agent.test; + +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import java.util.Map; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(Instrumenter.class) +public class GoodInstrumentation extends Instrumenter.Default { + + public GoodInstrumentation() { + super("good-test-instrumentation"); + } + + @Override + public ElementMatcher typeMatcher() { + return named(TestClass.class.getName()); + } + + @Override + public Map, String> transformers() { + return singletonMap(named("doSomething"), GoodInstrumentationAdvice.class.getName()); + } + + public static class GoodInstrumentationAdvice { + @Advice.OnMethodExit + public static void changeReturn(@Advice.Return(readOnly = false) String originalValue) { + originalValue = "overridden value"; + } + } +} diff --git a/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/TestClass.java b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/TestClass.java new file mode 100644 index 0000000000..9eb4a55ca9 --- /dev/null +++ b/dd-java-agent/agent-tooling/src/test/java/datadog/trace/agent/test/TestClass.java @@ -0,0 +1,7 @@ +package datadog.trace.agent.test; + +public class TestClass { + public String doSomething() { + return "original value"; + } +}