diff --git a/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java b/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java index 895ae793127..6b121106d08 100644 --- a/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java +++ b/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.apachehttpasyncclient; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; @@ -9,6 +10,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -38,6 +40,12 @@ public ApacheHttpAsyncClientInstrumentation() { super("httpasyncclient", "apache-httpasyncclient"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/apache/http/nio/client/HttpAsyncClient.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("org.apache.http.nio.client.HttpAsyncClient")); diff --git a/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java b/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java index 80590495f66..e49ac1803ce 100644 --- a/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java +++ b/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.apachehttpasyncclient; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -29,6 +31,12 @@ public ApacheHttpClientRedirectInstrumentation() { super("httpasyncclient", "apache-httpasyncclient"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/apache/http/client/RedirectStrategy.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("org.apache.http.client.RedirectStrategy")); diff --git a/dd-java-agent/instrumentation/apache-httpclient-4/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java b/dd-java-agent/instrumentation/apache-httpclient-4/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java index a31f2de4b79..c4b5ed51e54 100644 --- a/dd-java-agent/instrumentation/apache-httpclient-4/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java +++ b/dd-java-agent/instrumentation/apache-httpclient-4/src/main/java/datadog/trace/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.apachehttpclient; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; @@ -41,6 +42,12 @@ public ApacheHttpClientInstrumentation() { super("httpclient", "apache-httpclient", "apache-http-client"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/apache/http/client/HttpClient.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("org.apache.http.client.HttpClient")); diff --git a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestInstrumentation.java b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestInstrumentation.java index 26bda378720..0b506594338 100644 --- a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestInstrumentation.java +++ b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/main/java/datadog/trace/instrumentation/aws/v0/RequestInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.aws.v0; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.amazonaws.AmazonWebServiceRequest; @@ -25,6 +27,12 @@ public RequestInstrumentation() { super("aws-sdk"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/amazonaws/AmazonWebServiceRequest.class")); + } + @Override public ElementMatcher typeMatcher() { return nameStartsWith("com.amazonaws.") diff --git a/dd-java-agent/instrumentation/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy b/dd-java-agent/instrumentation/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy index c07bb3516c7..58ced38d558 100644 --- a/dd-java-agent/instrumentation/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy +++ b/dd-java-agent/instrumentation/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy @@ -6,6 +6,7 @@ import com.couchbase.client.java.CouchbaseCluster import com.couchbase.client.java.cluster.ClusterManager import com.couchbase.client.java.env.CouchbaseEnvironment import org.springframework.data.couchbase.core.CouchbaseTemplate +import spock.lang.Retry import spock.lang.Shared import spock.lang.Unroll import util.AbstractCouchbaseTest @@ -13,6 +14,7 @@ import util.AbstractCouchbaseTest import static datadog.trace.agent.test.utils.TraceUtils.basicSpan import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +@Retry(count = 5, delay = 1) @Unroll class CouchbaseSpringTemplateTest extends AbstractCouchbaseTest { diff --git a/dd-java-agent/instrumentation/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java b/dd-java-agent/instrumentation/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java index 09b9b1f3ae3..149325cf99c 100644 --- a/dd-java-agent/instrumentation/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java +++ b/dd-java-agent/instrumentation/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java @@ -1,10 +1,12 @@ package datadog.trace.instrumentation.couchbase.client; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -29,6 +31,14 @@ public CouchbaseNetworkInstrumentation() { super("couchbase"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not( + classLoaderHasNoResources( + "com/couchbase/client/core/endpoint/AbstractGenericHandler.class")); + } + @Override public ElementMatcher typeMatcher() { // Exact class because private fields are used diff --git a/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java b/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java index 23e5411397b..d5622cbc495 100644 --- a/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java +++ b/dd-java-agent/instrumentation/dropwizard/dropwizard-views/src/main/java/datadog/trace/instrumentation/dropwizard/view/DropwizardViewInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.dropwizard.view; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -8,6 +9,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -30,6 +32,12 @@ public DropwizardViewInstrumentation() { super("dropwizard", "dropwizard-view"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("io/dropwizard/views/ViewRenderer.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("io.dropwizard.views.ViewRenderer")); diff --git a/dd-java-agent/instrumentation/elasticsearch/transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy b/dd-java-agent/instrumentation/elasticsearch/transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy index 701e76bb7b8..f6886f786ba 100644 --- a/dd-java-agent/instrumentation/elasticsearch/transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy +++ b/dd-java-agent/instrumentation/elasticsearch/transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy @@ -14,7 +14,7 @@ import java.lang.reflect.Proxy import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -@RetryOnFailure(times = 3, delaySeconds = 1) +@RetryOnFailure(times = 10, delaySeconds = 1) class Elasticsearch53SpringRepositoryTest extends AgentTestRunner { // Setting up appContext & repo with @Shared doesn't allow // spring-data instrumentation to applied. diff --git a/dd-java-agent/instrumentation/finatra-2.9/src/main/java/datadog/trace/instrumentation/finatra/FinatraInstrumentation.java b/dd-java-agent/instrumentation/finatra-2.9/src/main/java/datadog/trace/instrumentation/finatra/FinatraInstrumentation.java index eb81d0c5fd6..388ae757191 100644 --- a/dd-java-agent/instrumentation/finatra-2.9/src/main/java/datadog/trace/instrumentation/finatra/FinatraInstrumentation.java +++ b/dd-java-agent/instrumentation/finatra-2.9/src/main/java/datadog/trace/instrumentation/finatra/FinatraInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.finatra; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -9,6 +10,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -48,6 +50,12 @@ public String[] helperClassNames() { }; } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/twitter/finatra/http/internal/routing/Route.class")); + } + @Override public ElementMatcher typeMatcher() { return nameStartsWith("com.twitter.finatra.") diff --git a/dd-java-agent/instrumentation/glassfish/src/main/java/datadog/trace/instrumentation/glassfish/GlassFishInstrumentation.java b/dd-java-agent/instrumentation/glassfish/src/main/java/datadog/trace/instrumentation/glassfish/GlassFishInstrumentation.java index 53a94dd9531..88efb44fa79 100644 --- a/dd-java-agent/instrumentation/glassfish/src/main/java/datadog/trace/instrumentation/glassfish/GlassFishInstrumentation.java +++ b/dd-java-agent/instrumentation/glassfish/src/main/java/datadog/trace/instrumentation/glassfish/GlassFishInstrumentation.java @@ -14,7 +14,6 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; /** * This instrumenter prevents a mechanism from GlassFish classloader to produces a class not found @@ -39,8 +38,7 @@ public String[] helperClassNames() { @Override public ElementMatcher typeMatcher() { - return ElementMatchers.named( - "com.sun.enterprise.v3.server.APIClassLoaderServiceImpl$APIClassLoader"); + return named("com.sun.enterprise.v3.server.APIClassLoaderServiceImpl$APIClassLoader"); } @Override diff --git a/dd-java-agent/instrumentation/hibernate/core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java index 741d2c4c5bf..4ddd2ea80eb 100644 --- a/dd-java-agent/instrumentation/hibernate/core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-3.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java @@ -1,6 +1,10 @@ package datadog.trace.instrumentation.hibernate.core.v3_3; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static net.bytebuddy.matcher.ElementMatchers.not; + import datadog.trace.agent.tooling.Instrumenter; +import net.bytebuddy.matcher.ElementMatcher; import org.hibernate.classic.Validatable; import org.hibernate.transaction.JBossTransactionManagerLookup; @@ -10,6 +14,12 @@ public AbstractHibernateInstrumentation() { super("hibernate", "hibernate-core"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/hibernate/Session.class")); + } + @Override public String[] helperClassNames() { return new String[] { diff --git a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java index 0fb53bcf53c..813287345a0 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.0/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java @@ -1,6 +1,10 @@ package datadog.trace.instrumentation.hibernate.core.v4_0; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static net.bytebuddy.matcher.ElementMatchers.not; + import datadog.trace.agent.tooling.Instrumenter; +import net.bytebuddy.matcher.ElementMatcher; import org.hibernate.SharedSessionContract; public abstract class AbstractHibernateInstrumentation extends Instrumenter.Default { @@ -9,6 +13,12 @@ public AbstractHibernateInstrumentation() { super("hibernate", "hibernate-core"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/hibernate/Session.class")); + } + @Override public String[] helperClassNames() { return new String[] { diff --git a/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java index 6831e9aecfd..ccf95f19a04 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.hibernate.core.v4_3; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; @@ -43,6 +45,12 @@ public String[] helperClassNames() { }; } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/hibernate/Session.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("org.hibernate.procedure.ProcedureCall")); diff --git a/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java b/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java index 058409fca59..830008f1f05 100644 --- a/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java +++ b/dd-java-agent/instrumentation/hibernate/core-4.3/src/main/java/datadog/trace/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.hibernate.core.v4_3; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; @@ -50,6 +52,12 @@ public String[] helperClassNames() { }; } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/hibernate/Session.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("org.hibernate.SharedSessionContract")); diff --git a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java index 7629cc09add..27cbb2b8f4a 100644 --- a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java +++ b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixInstrumentation.java @@ -1,8 +1,10 @@ package datadog.trace.instrumentation.hystrix; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static datadog.trace.instrumentation.hystrix.HystrixDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; @@ -27,6 +29,12 @@ public HystrixInstrumentation() { super("hystrix"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/netflix/hystrix/HystrixCommand.class")); + } + @Override public ElementMatcher typeMatcher() { return extendsClass( diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java b/dd-java-agent/instrumentation/jax-rs-annotations-1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java index 1ddc8b2f270..5a2ed711d59 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-annotations-1/src/main/java/datadog/trace/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java @@ -12,6 +12,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; @@ -36,7 +37,9 @@ public JaxRsAnnotationsInstrumentation() { // this is required to make sure instrumentation won't apply to jax-rs 2 @Override public ElementMatcher classLoaderMatcher() { - return classLoaderHasNoResources("javax/ws/rs/container/AsyncResponse.class"); + return classLoaderHasNoResources("javax/ws/rs/container/AsyncResponse.class") + // Optimization for expensive typeMatcher. + .and(not(classLoaderHasNoResources("javax/ws/rs/Path.class"))); } @Override diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java index 968bc72983f..aff4eb518b7 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jaxrs2; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -8,6 +9,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -26,6 +28,12 @@ public AbstractRequestContextInstrumentation() { super("jax-rs", "jaxrs", "jax-rs-filter"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/ws/rs/container/ContainerRequestContext.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.ws.rs.container.ContainerRequestContext")); diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java index c2bbbf1addb..e1e715adad1 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.jaxrs2; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -28,6 +30,12 @@ public ContainerRequestFilterInstrumentation() { super("jax-rs", "jaxrs", "jax-rs-filter"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/ws/rs/container/ContainerRequestFilter.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.ws.rs.container.ContainerRequestFilter")); diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java index 30843bfa9d8..c7183792358 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jaxrs2; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasSuperMethod; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeHasSuperType; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; @@ -11,6 +12,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; @@ -39,6 +41,12 @@ public Map contextStore() { return singletonMap("javax.ws.rs.container.AsyncResponse", AgentSpan.class.getName()); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/ws/rs/Path.class")); + } + @Override public ElementMatcher typeMatcher() { return safeHasSuperType( diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java index 4af573b5986..60932cec8f9 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-annotations-2/src/main/java/datadog/trace/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.jaxrs2; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.instrumentation.jaxrs2.JaxRsAnnotationsDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -33,6 +35,12 @@ public Map contextStore() { "javax.ws.rs.container.AsyncResponse", AgentSpan.class.getName()); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/ws/rs/container/AsyncResponse.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.ws.rs.container.AsyncResponse")); diff --git a/dd-java-agent/instrumentation/jax-rs-client-1.1/src/main/java/datadog/trace/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java b/dd-java-agent/instrumentation/jax-rs-client-1.1/src/main/java/datadog/trace/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java index 3661800c0f2..816cebce289 100644 --- a/dd-java-agent/instrumentation/jax-rs-client-1.1/src/main/java/datadog/trace/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-client-1.1/src/main/java/datadog/trace/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.jaxrs.v1; import static datadog.trace.agent.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; @@ -10,6 +11,7 @@ import static datadog.trace.instrumentation.jaxrs.v1.JaxRsClientV1Decorator.DECORATE; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -34,6 +36,12 @@ public JaxRsClientV1Instrumentation() { super("jax-rs", "jaxrs", "jax-rs-client"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/sun/jersey/api/client/ClientHandler.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("com.sun.jersey.api.client.ClientHandler")); diff --git a/dd-java-agent/instrumentation/jax-rs-client-2.0/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsClientInstrumentation.java b/dd-java-agent/instrumentation/jax-rs-client-2.0/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsClientInstrumentation.java index fe81be3cef3..91e8de24f5c 100644 --- a/dd-java-agent/instrumentation/jax-rs-client-2.0/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsClientInstrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-client-2.0/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsClientInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.jaxrs; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; @@ -23,6 +25,12 @@ public JaxRsClientInstrumentation() { super("jax-rs", "jaxrs", "jax-rs-client"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/ws/rs/client/ClientBuilder.class")); + } + @Override public ElementMatcher typeMatcher() { return extendsClass(named("javax.ws.rs.client.ClientBuilder")); diff --git a/dd-java-agent/instrumentation/jedis-1.4/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java b/dd-java-agent/instrumentation/jedis-1.4/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java index a521f0af22c..6a1f9ac3486 100644 --- a/dd-java-agent/instrumentation/jedis-1.4/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java +++ b/dd-java-agent/instrumentation/jedis-1.4/src/main/java/datadog/trace/instrumentation/jedis/JedisInstrumentation.java @@ -8,6 +8,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -33,7 +34,9 @@ public JedisInstrumentation() { @Override public ElementMatcher classLoaderMatcher() { - return classLoaderHasNoResources("redis/clients/jedis/commands/ProtocolCommand.class"); + return classLoaderHasNoResources("redis/clients/jedis/commands/ProtocolCommand.class") + // Optimization for expensive typeMatcher. + .and(not(classLoaderHasNoResources("redis/clients/jedis/Protocol.class"))); } @Override diff --git a/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerInstrumentation.java b/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerInstrumentation.java index 339a65af4bc..61a539eda40 100644 --- a/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jetty8; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; @@ -26,6 +27,12 @@ public boolean defaultEnabled() { return false; } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/eclipse/jetty/server/Handler.class")); + } + @Override public ElementMatcher typeMatcher() { return not(named("org.eclipse.jetty.server.handler.HandlerWrapper")) diff --git a/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java b/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java index 46e147da953..d267d94cbed 100644 --- a/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageConsumerInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jms; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; @@ -8,6 +9,7 @@ import static datadog.trace.instrumentation.jms.MessageExtractAdapter.GETTER; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; @@ -33,6 +35,12 @@ public JMSMessageConsumerInstrumentation() { super("jms", "jms-1", "jms-2"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/jms/MessageConsumer.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.jms.MessageConsumer")); diff --git a/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageListenerInstrumentation.java b/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageListenerInstrumentation.java index 63c186eac11..a64c7fb2194 100644 --- a/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageListenerInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jms; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; @@ -9,6 +10,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -31,6 +33,12 @@ public JMSMessageListenerInstrumentation() { super("jms", "jms-1", "jms-2"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/jms/MessageListener.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.jms.MessageListener")); diff --git a/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java b/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java index 8047791a241..3c5f60cef78 100644 --- a/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java +++ b/dd-java-agent/instrumentation/jms/src/main/java/datadog/trace/instrumentation/jms/JMSMessageProducerInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jms; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; @@ -8,6 +9,7 @@ import static datadog.trace.instrumentation.jms.MessageInjectAdapter.SETTER; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -33,6 +35,12 @@ public JMSMessageProducerInstrumentation() { super("jms", "jms-1", "jms-2"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/jms/MessageProducer.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.jms.MessageProducer")); diff --git a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java index 20659334ac1..cfe2643d61f 100644 --- a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java +++ b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jsp; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; @@ -7,6 +8,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -27,6 +29,12 @@ public JSPInstrumentation() { super("jsp", "jsp-render"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/servlet/jsp/HttpJspPage.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.servlet.jsp.HttpJspPage")); diff --git a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java index 64cab30b037..2c1511b07a6 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/ChannelFutureListenerInstrumentation.java @@ -1,11 +1,13 @@ package datadog.trace.instrumentation.netty40; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -31,6 +33,12 @@ public ChannelFutureListenerInstrumentation() { NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("io/netty/channel/ChannelFutureListener.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("io.netty.channel.ChannelFutureListener")); diff --git a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelPipelineInstrumentation.java b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelPipelineInstrumentation.java index ea861e1eb47..42c29eb6736 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelPipelineInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/NettyChannelPipelineInstrumentation.java @@ -1,10 +1,12 @@ package datadog.trace.instrumentation.netty40; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -44,6 +46,12 @@ public NettyChannelPipelineInstrumentation() { super(INSTRUMENTATION_NAME, ADDITIONAL_INSTRUMENTATION_NAMES); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("io/netty/channel/ChannelPipeline.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("io.netty.channel.ChannelPipeline")); diff --git a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java index 2344d11df14..12d13127f2b 100644 --- a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/ChannelFutureListenerInstrumentation.java @@ -1,11 +1,13 @@ package datadog.trace.instrumentation.netty41; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -31,6 +33,12 @@ public ChannelFutureListenerInstrumentation() { NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("io/netty/channel/ChannelFutureListener.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("io.netty.channel.ChannelFutureListener")); diff --git a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelPipelineInstrumentation.java b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelPipelineInstrumentation.java index 34298734363..b72bc739db2 100644 --- a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelPipelineInstrumentation.java +++ b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/NettyChannelPipelineInstrumentation.java @@ -1,10 +1,12 @@ package datadog.trace.instrumentation.netty41; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -44,6 +46,12 @@ public NettyChannelPipelineInstrumentation() { super(INSTRUMENTATION_NAME, ADDITIONAL_INSTRUMENTATION_NAMES); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("io/netty/channel/ChannelPipeline.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("io.netty.channel.ChannelPipeline")); diff --git a/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayInstrumentation.java b/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayInstrumentation.java index b13551951ed..d7403a67316 100644 --- a/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayInstrumentation.java +++ b/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayInstrumentation.java @@ -1,8 +1,10 @@ package datadog.trace.instrumentation.play24; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -20,6 +22,12 @@ public PlayInstrumentation() { super("play"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("play/api/mvc/Action.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("play.api.mvc.Action")); diff --git a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayInstrumentation.java b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayInstrumentation.java index b24c5d036a8..40963394926 100644 --- a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayInstrumentation.java +++ b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayInstrumentation.java @@ -1,8 +1,10 @@ package datadog.trace.instrumentation.play26; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -20,6 +22,12 @@ public PlayInstrumentation() { super("play"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("play/api/mvc/Action.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("play.api.mvc.Action")); diff --git a/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/PlayWSClientInstrumentation.java b/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/PlayWSClientInstrumentation.java index 97a5170256c..f332c46959e 100644 --- a/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/PlayWSClientInstrumentation.java +++ b/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/PlayWSClientInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.playws1; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; @@ -30,6 +31,13 @@ public PlayWSClientInstrumentation() { super("play-ws"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not( + classLoaderHasNoResources("play/shaded/ahc/org/asynchttpclient/AsyncHttpClient.class")); + } + @Override public ElementMatcher typeMatcher() { // CachingAsyncHttpClient rejects overrides to AsyncHandler diff --git a/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/PlayWSClientInstrumentation.java b/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/PlayWSClientInstrumentation.java index c2046100308..ca8a967b771 100644 --- a/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/PlayWSClientInstrumentation.java +++ b/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/PlayWSClientInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.playws21; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; @@ -29,6 +30,13 @@ public PlayWSClientInstrumentation() { super("play-ws"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not( + classLoaderHasNoResources("play/shaded/ahc/org/asynchttpclient/AsyncHttpClient.class")); + } + @Override public ElementMatcher typeMatcher() { // CachingAsyncHttpClient rejects overrides to AsyncHandler diff --git a/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/PlayWSClientInstrumentation.java b/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/PlayWSClientInstrumentation.java index 43c7db77101..f9203a78c3b 100644 --- a/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/PlayWSClientInstrumentation.java +++ b/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/PlayWSClientInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.playws2; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; @@ -29,6 +30,13 @@ public PlayWSClientInstrumentation() { super("play-ws"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not( + classLoaderHasNoResources("play/shaded/ahc/org/asynchttpclient/AsyncHttpClient.class")); + } + @Override public ElementMatcher typeMatcher() { // CachingAsyncHttpClient rejects overrides to AsyncHandler diff --git a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java index 08d1bf811c9..57bc10111dd 100644 --- a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java +++ b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.rabbitmq.amqp; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -53,6 +54,12 @@ public RabbitChannelInstrumentation() { super("amqp", "rabbitmq"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/rabbitmq/client/Channel.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("com.rabbitmq.client.Channel")); diff --git a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java index 8f5097e5a19..c4473aba766 100644 --- a/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java +++ b/dd-java-agent/instrumentation/rabbitmq-amqp-2.7/src/main/java/datadog/trace/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java @@ -1,11 +1,13 @@ package datadog.trace.instrumentation.rabbitmq.amqp; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.instrumentation.rabbitmq.amqp.RabbitDecorator.DECORATE; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import com.rabbitmq.client.Command; @@ -24,6 +26,12 @@ public RabbitCommandInstrumentation() { super("amqp", "rabbitmq"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/rabbitmq/client/Command.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("com.rabbitmq.client.Command")); diff --git a/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ContinuationInstrumentation.java b/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ContinuationInstrumentation.java index 88c3f1abc76..12f254ba29c 100644 --- a/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ContinuationInstrumentation.java +++ b/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ContinuationInstrumentation.java @@ -1,10 +1,12 @@ package datadog.trace.instrumentation.ratpack; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -24,6 +26,12 @@ public ContinuationInstrumentation() { super("ratpack"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("ratpack/exec/internal/Continuation.class")); + } + @Override public ElementMatcher typeMatcher() { return nameStartsWith("ratpack.exec.") diff --git a/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java b/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java index 57a18979edb..f2af40ce523 100644 --- a/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/ratpack-1.4/src/main/java/datadog/trace/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.ratpack; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -21,6 +22,12 @@ public ServerErrorHandlerInstrumentation() { super("ratpack"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("ratpack/error/ServerErrorHandler.class")); + } + @Override public ElementMatcher typeMatcher() { return not(isAbstract()).and(implementsInterface(named("ratpack.error.ServerErrorHandler"))); diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/FluxAndMonoInstrumentation.java b/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/FluxAndMonoInstrumentation.java index 9b0b1aaec74..8c56eace804 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/FluxAndMonoInstrumentation.java +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/main/java/datadog/trace/instrumentation/reactor/core/FluxAndMonoInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.reactor.core; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -25,11 +26,9 @@ public FluxAndMonoInstrumentation() { } @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".ReactorCoreAdviceUtils", - packageName + ".ReactorCoreAdviceUtils$TracingSubscriber", - }; + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("reactor/core/publisher/Mono.class")); } @Override @@ -40,6 +39,14 @@ public ElementMatcher typeMatcher() { named("reactor.core.publisher.Mono").or(named("reactor.core.publisher.Flux")))); } + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".ReactorCoreAdviceUtils", + packageName + ".ReactorCoreAdviceUtils$TracingSubscriber", + }; + } + @Override public Map, String> transformers() { return singletonMap( diff --git a/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Instrumentation.java b/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Instrumentation.java index a45790ae257..5be074d9874 100644 --- a/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Instrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Instrumentation.java @@ -28,6 +28,12 @@ public ElementMatcher classLoaderMatcher() { "javax/servlet/AsyncEvent.class", "javax/servlet/AsyncListener.class"); } + @Override + public ElementMatcher typeMatcher() { + return safeHasSuperType( + named("javax.servlet.FilterChain").or(named("javax.servlet.http.HttpServlet"))); + } + @Override public String[] helperClassNames() { return new String[] { @@ -40,12 +46,6 @@ public String[] helperClassNames() { }; } - @Override - public ElementMatcher typeMatcher() { - return safeHasSuperType( - named("javax.servlet.FilterChain").or(named("javax.servlet.http.HttpServlet"))); - } - @Override public Map contextStore() { return singletonMap( diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/AsyncContextInstrumentation.java b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/AsyncContextInstrumentation.java index 71e03d573da..d3875304359 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/AsyncContextInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/AsyncContextInstrumentation.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.servlet3; import static datadog.trace.agent.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; import static datadog.trace.instrumentation.servlet3.HttpServletRequestInjectAdapter.SETTER; @@ -8,6 +9,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; @@ -30,8 +32,9 @@ public AsyncContextInstrumentation() { } @Override - public String[] helperClassNames() { - return new String[] {packageName + ".HttpServletRequestInjectAdapter"}; + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/servlet/AsyncContext.class")); } @Override @@ -39,6 +42,11 @@ public ElementMatcher typeMatcher() { return implementsInterface(named("javax.servlet.AsyncContext")); } + @Override + public String[] helperClassNames() { + return new String[] {packageName + ".HttpServletRequestInjectAdapter"}; + } + @Override public Map, String> transformers() { return singletonMap( diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Instrumentation.java b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Instrumentation.java index 5f0315734d5..a7bb2ab63b2 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Instrumentation.java +++ b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Instrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.servlet3; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeHasSuperType; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -19,6 +21,18 @@ public Servlet3Instrumentation() { super("servlet", "servlet-3"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/servlet/http/HttpServlet.class")); + } + + @Override + public ElementMatcher typeMatcher() { + return safeHasSuperType( + named("javax.servlet.FilterChain").or(named("javax.servlet.http.HttpServlet"))); + } + @Override public String[] helperClassNames() { return new String[] { @@ -31,12 +45,6 @@ public String[] helperClassNames() { }; } - @Override - public ElementMatcher typeMatcher() { - return safeHasSuperType( - named("javax.servlet.FilterChain").or(named("javax.servlet.http.HttpServlet"))); - } - @Override public Map contextStore() { return singletonMap( diff --git a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java index 5ad47d83d46..05f64d2851d 100644 --- a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.servlet.dispatcher; import static datadog.trace.agent.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -11,6 +12,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -33,6 +35,17 @@ public RequestDispatcherInstrumentation() { super("servlet", "servlet-dispatcher"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/servlet/RequestDispatcher.class")); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("javax.servlet.RequestDispatcher")); + } + @Override public String[] helperClassNames() { return new String[] { @@ -42,11 +55,6 @@ public String[] helperClassNames() { }; } - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("javax.servlet.RequestDispatcher")); - } - @Override public Map contextStore() { return singletonMap("javax.servlet.RequestDispatcher", String.class.getName()); diff --git a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java index ec70e1e1aa1..972915ca4fc 100644 --- a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java @@ -1,9 +1,11 @@ package datadog.trace.instrumentation.servlet.dispatcher; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -23,6 +25,12 @@ public ServletContextInstrumentation() { super("servlet", "servlet-dispatcher"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/servlet/ServletContext.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("javax.servlet.ServletContext")); diff --git a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/filter/FilterInstrumentation.java b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/filter/FilterInstrumentation.java index 9099f65b01f..fef044ca99e 100644 --- a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/filter/FilterInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/filter/FilterInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.servlet.filter; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -8,6 +9,7 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -34,10 +36,10 @@ public boolean defaultEnabled() { } @Override - public String[] helperClassNames() { - return new String[] { - "datadog.trace.agent.decorator.BaseDecorator", packageName + ".FilterDecorator", - }; + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + // return not(classLoaderHasNoResources("javax/servlet/Filter.class")); // Not available in 2.2 + return not(classLoaderHasNoResources("javax/servlet/http/HttpServlet.class")); } @Override @@ -45,6 +47,13 @@ public ElementMatcher typeMatcher() { return implementsInterface(named("javax.servlet.Filter")); } + @Override + public String[] helperClassNames() { + return new String[] { + "datadog.trace.agent.decorator.BaseDecorator", packageName + ".FilterDecorator", + }; + } + @Override public Map, String> transformers() { return singletonMap( diff --git a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java index cd5cbebeb26..1ee59fee8e0 100644 --- a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.servlet.http; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -10,6 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -36,10 +38,9 @@ public boolean defaultEnabled() { } @Override - public String[] helperClassNames() { - return new String[] { - "datadog.trace.agent.decorator.BaseDecorator", packageName + ".HttpServletDecorator", - }; + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/servlet/http/HttpServlet.class")); } @Override @@ -47,6 +48,13 @@ public ElementMatcher typeMatcher() { return extendsClass(named("javax.servlet.http.HttpServlet")); } + @Override + public String[] helperClassNames() { + return new String[] { + "datadog.trace.agent.decorator.BaseDecorator", packageName + ".HttpServletDecorator", + }; + } + /** * Here we are instrumenting the protected method for HttpServlet. This should ensure that this * advice is always called after Servlet3Instrumentation which is instrumenting the public method. diff --git a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletResponseInstrumentation.java b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletResponseInstrumentation.java index e2823249b77..d4e9f203cb7 100644 --- a/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/servlet/src/main/java/datadog/trace/instrumentation/servlet/http/HttpServletResponseInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.servlet.http; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -9,6 +10,7 @@ import static datadog.trace.instrumentation.servlet.http.HttpServletResponseDecorator.DECORATE; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; @@ -30,6 +32,17 @@ public HttpServletResponseInstrumentation() { super("servlet", "servlet-response"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("javax/servlet/http/HttpServletResponse.class")); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("javax.servlet.http.HttpServletResponse")); + } + @Override public String[] helperClassNames() { return new String[] { @@ -39,11 +52,6 @@ public String[] helperClassNames() { }; } - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("javax.servlet.http.HttpServletResponse")); - } - @Override public Map, String> transformers() { return singletonMap(named("sendError").or(named("sendRedirect")), SendAdvice.class.getName()); diff --git a/dd-java-agent/instrumentation/spring-webflux-5/src/main/java/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java b/dd-java-agent/instrumentation/spring-webflux-5/src/main/java/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java index bb7c2b0868d..d9ddce6cc1c 100644 --- a/dd-java-agent/instrumentation/spring-webflux-5/src/main/java/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-webflux-5/src/main/java/datadog/trace/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java @@ -1,10 +1,12 @@ package datadog.trace.instrumentation.springwebflux.client; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -21,6 +23,20 @@ public DefaultWebClientInstrumentation() { super("spring-webflux", "spring-webflux-client"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not( + classLoaderHasNoResources( + "org/springframework/web/reactive/function/client/ExchangeFunction.class")); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface( + named("org.springframework.web.reactive.function.client.ExchangeFunction")); + } + @Override public String[] helperClassNames() { return new String[] { @@ -35,12 +51,6 @@ public String[] helperClassNames() { }; } - @Override - public ElementMatcher typeMatcher() { - return implementsInterface( - named("org.springframework.web.reactive.function.client.ExchangeFunction")); - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java index e63f1e56ccb..eaa525ebc74 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.springweb; import static datadog.trace.agent.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.implementsInterface; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -11,6 +12,7 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -32,6 +34,12 @@ public HandlerAdapterInstrumentation() { super("spring-web"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("org/springframework/web/servlet/HandlerAdapter.class")); + } + @Override public ElementMatcher typeMatcher() { return implementsInterface(named("org.springframework.web.servlet.HandlerAdapter")); diff --git a/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java b/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java index 5eb21f110fa..cbb1c74fe82 100644 --- a/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java +++ b/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioAsyncInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.twilio; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; @@ -34,6 +35,12 @@ public TwilioAsyncInstrumentation() { super("twilio-sdk"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/twilio/Twilio.class")); + } + /** Match any child class of the base Twilio service classes. */ @Override public ElementMatcher typeMatcher() { diff --git a/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java b/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java index 261309b1c18..12af606ec27 100644 --- a/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java +++ b/dd-java-agent/instrumentation/twilio/src/main/java/datadog/trace/instrumentation/twilio/TwilioSyncInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.twilio; +import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasNoResources; import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; @@ -30,6 +31,12 @@ public TwilioSyncInstrumentation() { super("twilio-sdk"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return not(classLoaderHasNoResources("com/twilio/Twilio.class")); + } + /** Match any child class of the base Twilio service classes. */ @Override public net.bytebuddy.matcher.ElementMatcher<