From fa3f449ec444281bd8fcee222c8ea6cd3b3461e0 Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Tue, 25 Feb 2020 12:37:53 -0500 Subject: [PATCH] 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(); + } }