From fa3f449ec444281bd8fcee222c8ea6cd3b3461e0 Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Tue, 25 Feb 2020 12:37:53 -0500 Subject: [PATCH 1/2] Add list of blacklisted spring classes --- .../trace/agent/tooling/AgentInstaller.java | 8 +++- .../trace/agent/tooling/Instrumenter.java | 13 ++++++ .../bytebuddy/GlobalIgnoresMatcher.java | 18 ++++++-- .../test/groovy/JettyTestInstrumentation.java | 7 ++++ .../groovy/GrizzlyTestInstrumentation.java | 7 ++++ .../groovy/GrizzlyTestInstrumentation.java | 7 ++++ ...syncPropagatingDisableInstrumentation.java | 7 ++++ .../src/test/java/NoOpInstrumentation.java | 7 ++++ .../NettyServerTestInstrumentation.java | 7 ++++ .../groovy/ServletTestInstrumentation.java | 7 ++++ .../DispatcherServletInstrumentation.java | 42 +++++++++++++++++++ .../test/ServletTestInstrumentation.java | 7 ++++ .../TraceConfigInstrumentation.java | 6 +++ .../NettyServerTestInstrumentation.java | 7 ++++ 14 files changed, 144 insertions(+), 6 deletions(-) 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 8dc101368d..d8d2e5105e 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 @@ -1,12 +1,12 @@ package datadog.trace.agent.tooling; import static datadog.trace.agent.tooling.ClassLoaderMatcher.skipClassLoader; -import static datadog.trace.agent.tooling.bytebuddy.GlobalIgnoresMatcher.globalIgnoresMatcher; import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.none; +import datadog.trace.agent.tooling.bytebuddy.GlobalIgnoresMatcher; import datadog.trace.api.Config; import java.lang.instrument.Instrumentation; import java.util.ArrayList; @@ -53,6 +53,8 @@ public class AgentInstaller { addByteBuddyRawSetting(); + final GlobalIgnoresMatcher globalIgnoresMatcher = new GlobalIgnoresMatcher<>(); + AgentBuilder agentBuilder = new AgentBuilder.Default() .disableClassFormatChanges() @@ -65,7 +67,7 @@ public class AgentInstaller { // https://github.com/raphw/byte-buddy/issues/558 // .with(AgentBuilder.LambdaInstrumentationStrategy.ENABLED) .ignore(any(), skipClassLoader()) - .or(globalIgnoresMatcher()) + .or(globalIgnoresMatcher) .or(matchesConfiguredExcludes()); if (log.isDebugEnabled()) { @@ -86,6 +88,8 @@ public class AgentInstaller { try { agentBuilder = instrumenter.instrument(agentBuilder); + globalIgnoresMatcher.addBlacklistedPrefixes(instrumenter.getLibraryBlacklistedPrefixes()); + numInstrumenters++; } catch (final Exception | LinkageError e) { log.error("Unable to load instrumentation {}", instrumenter.getClass().getName(), e); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java index f532086ae4..dd7b52b3bc 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java @@ -16,6 +16,7 @@ import datadog.trace.agent.tooling.muzzle.ReferenceMatcher; import datadog.trace.api.Config; import java.security.ProtectionDomain; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -43,6 +44,13 @@ public interface Instrumenter { */ AgentBuilder instrument(AgentBuilder agentBuilder); + /** + * Returns a collection of type name prefixes that should be blacklisted for all instrumentations + * + *

//TODO convert to a default method when the agent is Java 8+ + */ + Collection getLibraryBlacklistedPrefixes(); + @Slf4j abstract class Default implements Instrumenter { private final SortedSet instrumentationNames; @@ -96,6 +104,11 @@ public interface Instrumenter { return agentBuilder; } + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } + private AgentBuilder.Identified.Extendable injectHelperClasses( AgentBuilder.Identified.Extendable agentBuilder) { final String[] helperClassNames = helperClassNames(); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java index 9b727a1eb7..5f8700ae57 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java @@ -1,5 +1,8 @@ package datadog.trace.agent.tooling.bytebuddy; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import java.util.regex.Pattern; import net.bytebuddy.build.HashCodeAndEqualsPlugin; import net.bytebuddy.description.type.TypeDescription; @@ -9,11 +12,13 @@ import net.bytebuddy.matcher.ElementMatcher; public class GlobalIgnoresMatcher extends ElementMatcher.Junction.AbstractBase { + private final Set blacklistedPrefixes = new HashSet<>(); + private static final Pattern COM_MCHANGE_PROXY = Pattern.compile("com\\.mchange\\.v2\\.c3p0\\..*Proxy"); - public static ElementMatcher.Junction globalIgnoresMatcher() { - return new GlobalIgnoresMatcher<>(); + public void addBlacklistedPrefixes(final Collection prefixes) { + blacklistedPrefixes.addAll(prefixes); } /** @@ -40,8 +45,7 @@ public class GlobalIgnoresMatcher || name.startsWith("com.appdynamics.") || name.startsWith("com.singularity.") || name.startsWith("com.jinspired.") - || name.startsWith("org.jinspired.") - || name.startsWith("org.springframework.cglib.")) { + || name.startsWith("org.jinspired.")) { return true; } @@ -122,6 +126,12 @@ public class GlobalIgnoresMatcher return true; } + for (final String prefix : blacklistedPrefixes) { + if (name.startsWith(prefix)) { + return true; + } + } + return false; } } diff --git a/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java b/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java index 2644bab5b3..840b0b3c0c 100644 --- a/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java +++ b/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java @@ -3,6 +3,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -24,4 +26,9 @@ public class JettyTestInstrumentation implements Instrumenter { new AgentBuilder.Transformer.ForAdvice() .advice(named("handle"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } diff --git a/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java b/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java index fb6b5390cf..9c50b7252d 100644 --- a/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java +++ b/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java @@ -3,6 +3,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -17,4 +19,9 @@ public class GrizzlyTestInstrumentation implements Instrumenter { .advice( named("handleRead"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } diff --git a/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java b/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java index 6a1c64797e..c2e268adf9 100644 --- a/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java +++ b/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java @@ -3,6 +3,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -16,4 +18,9 @@ public class GrizzlyTestInstrumentation implements Instrumenter { new AgentBuilder.Transformer.ForAdvice() .advice(named("doHandle"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } diff --git a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java index d759a6224a..c8f95632e1 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java +++ b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java @@ -12,6 +12,8 @@ import com.google.common.collect.ImmutableMap; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.context.TraceScope; +import java.util.Collection; +import java.util.Collections; import java.util.Map; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.agent.builder.AgentBuilder; @@ -52,6 +54,11 @@ public final class AsyncPropagatingDisableInstrumentation implements Instrumente return agentBuilder; } + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } + // Not Using AutoService to hook up this instrumentation public static class DisableAsyncInstrumentation extends Default { diff --git a/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java b/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java index d830b1adf3..40bea0879a 100644 --- a/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java +++ b/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java @@ -1,5 +1,7 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -9,4 +11,9 @@ public class NoOpInstrumentation implements Instrumenter { public AgentBuilder instrument(final AgentBuilder agentBuilder) { return agentBuilder; } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } diff --git a/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java b/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java index 224b08f4af..7910b4c516 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java @@ -3,6 +3,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -17,4 +19,9 @@ public class NettyServerTestInstrumentation implements Instrumenter { .advice( named("channelRead"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } diff --git a/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java b/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java index 05b6073c54..c6eb61462e 100644 --- a/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java @@ -3,6 +3,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -25,4 +27,9 @@ public class ServletTestInstrumentation implements Instrumenter { named("headerComplete"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java index 86dd05d3d7..b67d9840f8 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java @@ -15,6 +15,8 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -47,6 +49,46 @@ public final class DispatcherServletInstrumentation extends Instrumenter.Default }; } + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Arrays.asList( + "org.springframework.cglib.", + "org.springframework.aop.", + "org.springframework.beans.factory.annotation.", + "org.springframework.beans.factory.config.", + "org.springframework.beans.factory.parsing.", + "org.springframework.beans.factory.xml.", + "org.springframework.beans.propertyeditors.", + "org.springframework.boot.autoconfigure.cache.", + "org.springframework.boot.autoconfigure.condition.", + "org.springframework.boot.autoconfigure.http.", + "org.springframework.boot.autoconfigure.jackson.", + "org.springframework.boot.autoconfigure.web.", + "org.springframework.boot.context.", + "org.springframework.boot.convert.", + "org.springframework.boot.diagnostics.", + "org.springframework.boot.web.server.", + "org.springframework.boot.web.servlet.", + "org.springframework.context.annotation.", + "org.springframework.context.event.", + "org.springframework.context.expression.", + "org.springframework.core.annotation.", + "org.springframework.core.convert.", + "org.springframework.core.env.", + "org.springframework.core.io.", + "org.springframework.core.type.", + "org.springframework.expression", + "org.springframework.format", + "org.springframework.http", + "org.springframework.ui", + "org.springframework.validation", + "org.springframework.web.context", + "org.springframework.web.filter", + "org.springframework.web.method", + "org.springframework.web.multipart", + "org.springframework.web.util"); + } + @Override public Map, String> transformers() { final Map, String> transformers = new HashMap<>(); diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java index 78f9ca9e27..191afc8c1b 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java @@ -5,6 +5,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -19,4 +21,9 @@ public class ServletTestInstrumentation implements Instrumenter { new AgentBuilder.Transformer.ForAdvice() .advice(named("service"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } diff --git a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java index e9217453da..84c790a594 100644 --- a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java +++ b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java @@ -8,6 +8,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.api.Config; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -108,6 +109,11 @@ public class TraceConfigInstrumentation implements Instrumenter { return agentBuilder; } + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } + // Not Using AutoService to hook up this instrumentation public static class TracerClassInstrumentation extends Default { private final String className; diff --git a/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java b/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java index 61cb150a54..abe32ca396 100644 --- a/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java @@ -5,6 +5,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; +import java.util.Collection; +import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -19,4 +21,9 @@ public class NettyServerTestInstrumentation implements Instrumenter { .advice( named("channelRead"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } + + @Override + public Collection getLibraryBlacklistedPrefixes() { + return Collections.emptySet(); + } } From 84c7be64b512962fd43f701f3954f772b8a62f22 Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Wed, 26 Feb 2020 11:59:21 -0500 Subject: [PATCH 2/2] Add blacklist directly to global ignores --- .../trace/agent/tooling/AgentInstaller.java | 8 +-- .../trace/agent/tooling/Instrumenter.java | 13 ----- .../bytebuddy/GlobalIgnoresMatcher.java | 53 ++++++++++++++----- .../test/groovy/JettyTestInstrumentation.java | 7 --- .../groovy/GrizzlyTestInstrumentation.java | 7 --- .../groovy/GrizzlyTestInstrumentation.java | 7 --- ...syncPropagatingDisableInstrumentation.java | 7 --- .../src/test/java/NoOpInstrumentation.java | 7 --- .../NettyServerTestInstrumentation.java | 7 --- .../groovy/ServletTestInstrumentation.java | 7 --- .../DispatcherServletInstrumentation.java | 42 --------------- .../test/ServletTestInstrumentation.java | 7 --- .../TraceConfigInstrumentation.java | 6 --- .../NettyServerTestInstrumentation.java | 7 --- 14 files changed, 41 insertions(+), 144 deletions(-) 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 d8d2e5105e..8dc101368d 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 @@ -1,12 +1,12 @@ package datadog.trace.agent.tooling; import static datadog.trace.agent.tooling.ClassLoaderMatcher.skipClassLoader; +import static datadog.trace.agent.tooling.bytebuddy.GlobalIgnoresMatcher.globalIgnoresMatcher; import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.none; -import datadog.trace.agent.tooling.bytebuddy.GlobalIgnoresMatcher; import datadog.trace.api.Config; import java.lang.instrument.Instrumentation; import java.util.ArrayList; @@ -53,8 +53,6 @@ public class AgentInstaller { addByteBuddyRawSetting(); - final GlobalIgnoresMatcher globalIgnoresMatcher = new GlobalIgnoresMatcher<>(); - AgentBuilder agentBuilder = new AgentBuilder.Default() .disableClassFormatChanges() @@ -67,7 +65,7 @@ public class AgentInstaller { // https://github.com/raphw/byte-buddy/issues/558 // .with(AgentBuilder.LambdaInstrumentationStrategy.ENABLED) .ignore(any(), skipClassLoader()) - .or(globalIgnoresMatcher) + .or(globalIgnoresMatcher()) .or(matchesConfiguredExcludes()); if (log.isDebugEnabled()) { @@ -88,8 +86,6 @@ public class AgentInstaller { try { agentBuilder = instrumenter.instrument(agentBuilder); - globalIgnoresMatcher.addBlacklistedPrefixes(instrumenter.getLibraryBlacklistedPrefixes()); - numInstrumenters++; } catch (final Exception | LinkageError e) { log.error("Unable to load instrumentation {}", instrumenter.getClass().getName(), e); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java index dd7b52b3bc..f532086ae4 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java @@ -16,7 +16,6 @@ import datadog.trace.agent.tooling.muzzle.ReferenceMatcher; import datadog.trace.api.Config; import java.security.ProtectionDomain; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -44,13 +43,6 @@ public interface Instrumenter { */ AgentBuilder instrument(AgentBuilder agentBuilder); - /** - * Returns a collection of type name prefixes that should be blacklisted for all instrumentations - * - *

//TODO convert to a default method when the agent is Java 8+ - */ - Collection getLibraryBlacklistedPrefixes(); - @Slf4j abstract class Default implements Instrumenter { private final SortedSet instrumentationNames; @@ -104,11 +96,6 @@ public interface Instrumenter { return agentBuilder; } - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } - private AgentBuilder.Identified.Extendable injectHelperClasses( AgentBuilder.Identified.Extendable agentBuilder) { final String[] helperClassNames = helperClassNames(); diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java index 5f8700ae57..e809151f61 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/bytebuddy/GlobalIgnoresMatcher.java @@ -1,8 +1,5 @@ package datadog.trace.agent.tooling.bytebuddy; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; import java.util.regex.Pattern; import net.bytebuddy.build.HashCodeAndEqualsPlugin; import net.bytebuddy.description.type.TypeDescription; @@ -12,13 +9,11 @@ import net.bytebuddy.matcher.ElementMatcher; public class GlobalIgnoresMatcher extends ElementMatcher.Junction.AbstractBase { - private final Set blacklistedPrefixes = new HashSet<>(); - private static final Pattern COM_MCHANGE_PROXY = Pattern.compile("com\\.mchange\\.v2\\.c3p0\\..*Proxy"); - public void addBlacklistedPrefixes(final Collection prefixes) { - blacklistedPrefixes.addAll(prefixes); + public static ElementMatcher.Junction globalIgnoresMatcher() { + return new GlobalIgnoresMatcher<>(); } /** @@ -45,7 +40,43 @@ public class GlobalIgnoresMatcher || name.startsWith("com.appdynamics.") || name.startsWith("com.singularity.") || name.startsWith("com.jinspired.") - || name.startsWith("org.jinspired.")) { + || name.startsWith("org.jinspired.") + || name.startsWith("org.springframework.cglib.") + || name.startsWith("org.springframework.aop.") + || name.startsWith("org.springframework.beans.factory.annotation.") + || name.startsWith("org.springframework.beans.factory.config.") + || name.startsWith("org.springframework.beans.factory.parsing.") + || name.startsWith("org.springframework.beans.factory.xml.") + || name.startsWith("org.springframework.beans.propertyeditors.") + || name.startsWith("org.springframework.boot.autoconfigure.cache.") + || name.startsWith("org.springframework.boot.autoconfigure.condition.") + || name.startsWith("org.springframework.boot.autoconfigure.http.") + || name.startsWith("org.springframework.boot.autoconfigure.jackson.") + || name.startsWith("org.springframework.boot.autoconfigure.web.") + || name.startsWith("org.springframework.boot.context.") + || name.startsWith("org.springframework.boot.convert.") + || name.startsWith("org.springframework.boot.diagnostics.") + || name.startsWith("org.springframework.boot.web.server.") + || name.startsWith("org.springframework.boot.web.servlet.") + || name.startsWith("org.springframework.context.annotation.") + || name.startsWith("org.springframework.context.event.") + || name.startsWith("org.springframework.context.expression.") + || name.startsWith("org.springframework.core.annotation.") + || name.startsWith("org.springframework.core.convert.") + || name.startsWith("org.springframework.core.env.") + || name.startsWith("org.springframework.core.io.") + || name.startsWith("org.springframework.core.type.") + || name.startsWith("org.springframework.expression.") + || name.startsWith("org.springframework.format.") + || name.startsWith("org.springframework.http.") + || name.startsWith("org.springframework.ui.") + || name.startsWith("org.springframework.validation.") + || name.startsWith("org.springframework.web.context.") + || name.startsWith("org.springframework.web.filter.") + || name.startsWith("org.springframework.web.method.") + || name.startsWith("org.springframework.web.multipart.") + || name.startsWith("org.springframework.web.util.")) { + return true; } @@ -126,12 +157,6 @@ public class GlobalIgnoresMatcher return true; } - for (final String prefix : blacklistedPrefixes) { - if (name.startsWith(prefix)) { - return true; - } - } - return false; } } diff --git a/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java b/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java index 840b0b3c0c..2644bab5b3 100644 --- a/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java +++ b/dd-java-agent/instrumentation/dropwizard/src/test/groovy/JettyTestInstrumentation.java @@ -3,8 +3,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -26,9 +24,4 @@ public class JettyTestInstrumentation implements Instrumenter { new AgentBuilder.Transformer.ForAdvice() .advice(named("handle"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } } diff --git a/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java b/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java index 9c50b7252d..fb6b5390cf 100644 --- a/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java +++ b/dd-java-agent/instrumentation/glassfish/src/test/groovy/GrizzlyTestInstrumentation.java @@ -3,8 +3,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -19,9 +17,4 @@ public class GrizzlyTestInstrumentation implements Instrumenter { .advice( named("handleRead"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } } diff --git a/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java b/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java index c2e268adf9..6a1c64797e 100644 --- a/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java +++ b/dd-java-agent/instrumentation/grizzly-2/src/test/groovy/GrizzlyTestInstrumentation.java @@ -3,8 +3,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -18,9 +16,4 @@ public class GrizzlyTestInstrumentation implements Instrumenter { new AgentBuilder.Transformer.ForAdvice() .advice(named("doHandle"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } } diff --git a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java index c8f95632e1..d759a6224a 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java +++ b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java @@ -12,8 +12,6 @@ import com.google.common.collect.ImmutableMap; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.context.TraceScope; -import java.util.Collection; -import java.util.Collections; import java.util.Map; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.agent.builder.AgentBuilder; @@ -54,11 +52,6 @@ public final class AsyncPropagatingDisableInstrumentation implements Instrumente return agentBuilder; } - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } - // Not Using AutoService to hook up this instrumentation public static class DisableAsyncInstrumentation extends Default { diff --git a/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java b/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java index 40bea0879a..d830b1adf3 100644 --- a/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java +++ b/dd-java-agent/instrumentation/mongo/src/test/java/NoOpInstrumentation.java @@ -1,7 +1,5 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -11,9 +9,4 @@ public class NoOpInstrumentation implements Instrumenter { public AgentBuilder instrument(final AgentBuilder agentBuilder) { return agentBuilder; } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } } diff --git a/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java b/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java index 7910b4c516..224b08f4af 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/NettyServerTestInstrumentation.java @@ -3,8 +3,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -19,9 +17,4 @@ public class NettyServerTestInstrumentation implements Instrumenter { .advice( named("channelRead"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } } diff --git a/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java b/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java index c6eb61462e..05b6073c54 100644 --- a/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-2/src/test/groovy/ServletTestInstrumentation.java @@ -3,8 +3,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -27,9 +25,4 @@ public class ServletTestInstrumentation implements Instrumenter { named("headerComplete"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } } diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java index b67d9840f8..86dd05d3d7 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/DispatcherServletInstrumentation.java @@ -15,8 +15,6 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -49,46 +47,6 @@ public final class DispatcherServletInstrumentation extends Instrumenter.Default }; } - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Arrays.asList( - "org.springframework.cglib.", - "org.springframework.aop.", - "org.springframework.beans.factory.annotation.", - "org.springframework.beans.factory.config.", - "org.springframework.beans.factory.parsing.", - "org.springframework.beans.factory.xml.", - "org.springframework.beans.propertyeditors.", - "org.springframework.boot.autoconfigure.cache.", - "org.springframework.boot.autoconfigure.condition.", - "org.springframework.boot.autoconfigure.http.", - "org.springframework.boot.autoconfigure.jackson.", - "org.springframework.boot.autoconfigure.web.", - "org.springframework.boot.context.", - "org.springframework.boot.convert.", - "org.springframework.boot.diagnostics.", - "org.springframework.boot.web.server.", - "org.springframework.boot.web.servlet.", - "org.springframework.context.annotation.", - "org.springframework.context.event.", - "org.springframework.context.expression.", - "org.springframework.core.annotation.", - "org.springframework.core.convert.", - "org.springframework.core.env.", - "org.springframework.core.io.", - "org.springframework.core.type.", - "org.springframework.expression", - "org.springframework.format", - "org.springframework.http", - "org.springframework.ui", - "org.springframework.validation", - "org.springframework.web.context", - "org.springframework.web.filter", - "org.springframework.web.method", - "org.springframework.web.multipart", - "org.springframework.web.util"); - } - @Override public Map, String> transformers() { final Map, String> transformers = new HashMap<>(); diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java index 191afc8c1b..78f9ca9e27 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/test/groovy/test/ServletTestInstrumentation.java @@ -5,8 +5,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -21,9 +19,4 @@ public class ServletTestInstrumentation implements Instrumenter { new AgentBuilder.Transformer.ForAdvice() .advice(named("service"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } } diff --git a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java index 84c790a594..e9217453da 100644 --- a/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java +++ b/dd-java-agent/instrumentation/trace-annotation/src/main/java/datadog/trace/instrumentation/trace_annotation/TraceConfigInstrumentation.java @@ -8,7 +8,6 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.api.Config; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -109,11 +108,6 @@ public class TraceConfigInstrumentation implements Instrumenter { return agentBuilder; } - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } - // Not Using AutoService to hook up this instrumentation public static class TracerClassInstrumentation extends Default { private final String className; diff --git a/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java b/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java index abe32ca396..61cb150a54 100644 --- a/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx/src/test/groovy/server/NettyServerTestInstrumentation.java @@ -5,8 +5,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import datadog.trace.agent.test.base.HttpServerTestAdvice; import datadog.trace.agent.tooling.Instrumenter; -import java.util.Collection; -import java.util.Collections; import net.bytebuddy.agent.builder.AgentBuilder; @AutoService(Instrumenter.class) @@ -21,9 +19,4 @@ public class NettyServerTestInstrumentation implements Instrumenter { .advice( named("channelRead"), HttpServerTestAdvice.ServerEntryAdvice.class.getName())); } - - @Override - public Collection getLibraryBlacklistedPrefixes() { - return Collections.emptySet(); - } }