Implement `saveHasSuperType` and use it instead of `hasSuperType`
The idea is to just 'trim' type hierarchy 'up-trees' that we cannot resolve dring instrumentation instead of failing to instrument completely.
This commit is contained in:
parent
deec4a795c
commit
6bc1d1ab8e
|
@ -0,0 +1,132 @@
|
||||||
|
package datadog.trace.agent.tooling;
|
||||||
|
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.erasure;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.bytebuddy.build.HashCodeAndEqualsPlugin;
|
||||||
|
import net.bytebuddy.description.type.TypeDefinition;
|
||||||
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
|
import net.bytebuddy.description.type.TypeList;
|
||||||
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
import net.bytebuddy.matcher.ElementMatchers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class provides some custom ByteBuddy element matchers to use when applying instrumentation
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class ByteBuddyElementMatchers {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches any type description that declares a super type that matches the provided matcher.
|
||||||
|
* Exceptions during matching process are logged and ignored.
|
||||||
|
*
|
||||||
|
* @param matcher The type to be checked for being a super type of the matched type.
|
||||||
|
* @param <T> The type of the matched object.
|
||||||
|
* @return A matcher that matches any type description that declares a super type that matches the
|
||||||
|
* provided matcher.
|
||||||
|
* @see ElementMatchers#hasSuperType(net.bytebuddy.matcher.ElementMatcher)
|
||||||
|
*/
|
||||||
|
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasSuperType(
|
||||||
|
final ElementMatcher<? super TypeDescription> matcher) {
|
||||||
|
return safeHasGenericSuperType(erasure(matcher));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches any type description that declares a super type that matches the provided matcher.
|
||||||
|
* Exceptions during matching process are logged and ignored.
|
||||||
|
*
|
||||||
|
* @param matcher The type to be checked for being a super type of the matched type.
|
||||||
|
* @param <T> The type of the matched object.
|
||||||
|
* @return A matcher that matches any type description that declares a super type that matches the
|
||||||
|
* provided matcher.
|
||||||
|
* @see ElementMatchers#hasGenericSuperType(net.bytebuddy.matcher.ElementMatcher)
|
||||||
|
*/
|
||||||
|
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasGenericSuperType(
|
||||||
|
final ElementMatcher<? super TypeDescription.Generic> matcher) {
|
||||||
|
return new SafeHasSuperTypeMatcher<>(matcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An element matcher that matches a super type. Exceptions during matching process are logged and
|
||||||
|
* ignored.
|
||||||
|
*
|
||||||
|
* @param <T> The type of the matched entity.
|
||||||
|
* @see net.bytebuddy.matcher.HasSuperTypeMatcher
|
||||||
|
*/
|
||||||
|
@HashCodeAndEqualsPlugin.Enhance
|
||||||
|
public static class SafeHasSuperTypeMatcher<T extends TypeDescription>
|
||||||
|
extends ElementMatcher.Junction.AbstractBase<T> {
|
||||||
|
|
||||||
|
/** The matcher to apply to any super type of the matched type. */
|
||||||
|
private final ElementMatcher<? super TypeDescription.Generic> matcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new matcher for a super type.
|
||||||
|
*
|
||||||
|
* @param matcher The matcher to apply to any super type of the matched type.
|
||||||
|
*/
|
||||||
|
public SafeHasSuperTypeMatcher(final ElementMatcher<? super TypeDescription.Generic> matcher) {
|
||||||
|
this.matcher = matcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean matches(final T target) {
|
||||||
|
final Set<TypeDescription> checkedInterfaces = new HashSet<>();
|
||||||
|
// We do not use foreach loop and iterator interface here because we need to catch exceptions
|
||||||
|
// in {@code getSuperClass} calls
|
||||||
|
TypeDefinition typeDefinition = target;
|
||||||
|
while (typeDefinition != null) {
|
||||||
|
if (matcher.matches(typeDefinition.asGenericType())
|
||||||
|
|| hasInterface(typeDefinition, checkedInterfaces)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
typeDefinition = safeGetSuperClass(typeDefinition);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypeDefinition safeGetSuperClass(final TypeDefinition typeDefinition) {
|
||||||
|
try {
|
||||||
|
return typeDefinition.getSuperClass();
|
||||||
|
} catch (final Exception e) {
|
||||||
|
log.info("Exception trying to get next type definition:", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Matches a type's interfaces against the provided matcher.
|
||||||
|
*
|
||||||
|
* @param typeDefinition The type for which to check all implemented interfaces.
|
||||||
|
* @param checkedInterfaces The interfaces that have already been checked.
|
||||||
|
* @return {@code true} if any interface matches the supplied matcher.
|
||||||
|
*/
|
||||||
|
private boolean hasInterface(
|
||||||
|
final TypeDefinition typeDefinition, final Set<TypeDescription> checkedInterfaces) {
|
||||||
|
for (final TypeDefinition interfaceType : safeGetInterfaces(typeDefinition)) {
|
||||||
|
if (checkedInterfaces.add(interfaceType.asErasure())
|
||||||
|
&& (matcher.matches(interfaceType.asGenericType())
|
||||||
|
|| hasInterface(interfaceType, checkedInterfaces))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypeList.Generic safeGetInterfaces(final TypeDefinition typeDefinition) {
|
||||||
|
try {
|
||||||
|
return typeDefinition.getInterfaces();
|
||||||
|
} catch (final Exception e) {
|
||||||
|
log.info("Exception trying to get interfaces:", e);
|
||||||
|
return new TypeList.Generic.Empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "safeHasSuperType(" + matcher + ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
package datadog.trace.instrumentation.apachehttpclient;
|
package datadog.trace.instrumentation.apachehttpclient;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
|
import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -32,7 +32,7 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default {
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return named("org.apache.http.impl.client.HttpClientBuilder")
|
return named("org.apache.http.impl.client.HttpClientBuilder")
|
||||||
.or(hasSuperType(named("org.apache.http.impl.client.CloseableHttpClient")));
|
.or(safeHasSuperType(named("org.apache.http.impl.client.CloseableHttpClient")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class Elasticsearch2TransportClientInstrumentation extends Instrumenter.D
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
// If we want to be more generic, we could instrument the interface instead:
|
// If we want to be more generic, we could instrument the interface instead:
|
||||||
// .and(hasSuperType(named("org.elasticsearch.client.ElasticsearchClient"))))
|
// .and(safeHasSuperType(named("org.elasticsearch.client.ElasticsearchClient"))))
|
||||||
return not(isInterface()).and(named("org.elasticsearch.client.support.AbstractClient"));
|
return not(isInterface()).and(named("org.elasticsearch.client.support.AbstractClient"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class Elasticsearch5TransportClientInstrumentation extends Instrumenter.D
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
// If we want to be more generic, we could instrument the interface instead:
|
// If we want to be more generic, we could instrument the interface instead:
|
||||||
// .and(hasSuperType(named("org.elasticsearch.client.ElasticsearchClient"))))
|
// .and(safeHasSuperType(named("org.elasticsearch.client.ElasticsearchClient"))))
|
||||||
return not(isInterface()).and(named("org.elasticsearch.client.support.AbstractClient"));
|
return not(isInterface()).and(named("org.elasticsearch.client.support.AbstractClient"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ public class Elasticsearch6TransportClientInstrumentation extends Instrumenter.D
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
// If we want to be more generic, we could instrument the interface instead:
|
// If we want to be more generic, we could instrument the interface instead:
|
||||||
// .and(hasSuperType(named("org.elasticsearch.client.ElasticsearchClient"))))
|
// .and(safeHasSuperType(named("org.elasticsearch.client.ElasticsearchClient"))))
|
||||||
return not(isInterface()).and(named("org.elasticsearch.client.support.AbstractClient"));
|
return not(isInterface()).and(named("org.elasticsearch.client.support.AbstractClient"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.hystrix;
|
package datadog.trace.instrumentation.hystrix;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -31,7 +31,7 @@ public class HystrixCommandInstrumentation extends Instrumenter.Default {
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
// Not adding a version restriction because this should work with any version and add some
|
// Not adding a version restriction because this should work with any version and add some
|
||||||
// benefit.
|
// benefit.
|
||||||
return not(isInterface()).and(hasSuperType(named("com.netflix.hystrix.HystrixCommand")));
|
return not(isInterface()).and(safeHasSuperType(named("com.netflix.hystrix.HystrixCommand")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package datadog.trace.instrumentation.java.concurrent;
|
package datadog.trace.instrumentation.java.concurrent;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.nameMatches;
|
import static net.bytebuddy.matcher.ElementMatchers.nameMatches;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -95,7 +95,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface())
|
return not(isInterface())
|
||||||
.and(hasSuperType(named(Executor.class.getName())))
|
.and(safeHasSuperType(named(Executor.class.getName())))
|
||||||
.and(
|
.and(
|
||||||
new ElementMatcher<TypeDescription>() {
|
new ElementMatcher<TypeDescription>() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package datadog.trace.instrumentation.java.concurrent;
|
package datadog.trace.instrumentation.java.concurrent;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.not;
|
import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
@ -70,7 +70,7 @@ public final class FutureInstrumentation extends Instrumenter.Default {
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface())
|
return not(isInterface())
|
||||||
.and(hasSuperType(named(Future.class.getName())))
|
.and(safeHasSuperType(named(Future.class.getName())))
|
||||||
.and(
|
.and(
|
||||||
new ElementMatcher<TypeDescription>() {
|
new ElementMatcher<TypeDescription>() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
package datadog.trace.instrumentation.jaxrs;
|
package datadog.trace.instrumentation.jaxrs;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.declaresMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.declaresMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.failSafe;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
|
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
|
@ -31,16 +30,14 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return hasSuperType(
|
return safeHasSuperType(
|
||||||
isAnnotatedWith(named("javax.ws.rs.Path"))
|
isAnnotatedWith(named("javax.ws.rs.Path"))
|
||||||
.or(
|
.or(safeHasSuperType(declaresMethod(isAnnotatedWith(named("javax.ws.rs.Path"))))));
|
||||||
failSafe(
|
|
||||||
hasSuperType(declaresMethod(isAnnotatedWith(named("javax.ws.rs.Path")))))));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isAnnotatedWith(
|
isAnnotatedWith(
|
||||||
named("javax.ws.rs.Path")
|
named("javax.ws.rs.Path")
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package datadog.trace.instrumentation.jaxrs;
|
package datadog.trace.instrumentation.jaxrs;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return hasSuperType(named("javax.ws.rs.client.ClientBuilder"));
|
return safeHasSuperType(named("javax.ws.rs.client.ClientBuilder"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -37,7 +37,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("build").and(returns(hasSuperType(named("javax.ws.rs.client.Client")))),
|
named("build").and(returns(safeHasSuperType(named("javax.ws.rs.client.Client")))),
|
||||||
ClientBuilderAdvice.class.getName());
|
ClientBuilderAdvice.class.getName());
|
||||||
return transformers;
|
return transformers;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.jetty8;
|
package datadog.trace.instrumentation.jetty8;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -30,7 +30,7 @@ public final class HandlerInstrumentation extends Instrumenter.Default {
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface())
|
return not(isInterface())
|
||||||
.and(hasSuperType(named("org.eclipse.jetty.server.Handler")))
|
.and(safeHasSuperType(named("org.eclipse.jetty.server.Handler")))
|
||||||
.and(not(named("org.eclipse.jetty.server.handler.HandlerWrapper")));
|
.and(not(named("org.eclipse.jetty.server.handler.HandlerWrapper")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package datadog.trace.instrumentation.jms1;
|
package datadog.trace.instrumentation.jms1;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -47,7 +47,7 @@ public final class JMS1MessageConsumerInstrumentation extends Instrumenter.Defau
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageConsumer")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageConsumer")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -62,7 +62,7 @@ public final class JMS1MessageConsumerInstrumentation extends Instrumenter.Defau
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("receive").and(takesArguments(0).or(takesArguments(1))).and(isPublic()),
|
named("receive").and(takesArguments(0).or(takesArguments(1))).and(isPublic()),
|
||||||
ConsumerAdvice.class.getName());
|
ConsumerAdvice.class.getName());
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package datadog.trace.instrumentation.jms1;
|
package datadog.trace.instrumentation.jms1;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -39,7 +39,7 @@ public final class JMS1MessageListenerInstrumentation extends Instrumenter.Defau
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageListener")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageListener")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package datadog.trace.instrumentation.jms1;
|
package datadog.trace.instrumentation.jms1;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -39,7 +39,7 @@ public final class JMS1MessageProducerInstrumentation extends Instrumenter.Defau
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageProducer")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageProducer")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package datadog.trace.instrumentation.jms2;
|
package datadog.trace.instrumentation.jms2;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -46,7 +46,7 @@ public final class JMS2MessageConsumerInstrumentation extends Instrumenter.Defau
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageConsumer")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageConsumer")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package datadog.trace.instrumentation.jms2;
|
package datadog.trace.instrumentation.jms2;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -39,7 +39,7 @@ public final class JMS2MessageListenerInstrumentation extends Instrumenter.Defau
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageListener")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageListener")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package datadog.trace.instrumentation.jms2;
|
package datadog.trace.instrumentation.jms2;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
import static datadog.trace.instrumentation.jms.util.JmsUtil.toResourceName;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -39,7 +39,7 @@ public final class JMS2MessageProducerInstrumentation extends Instrumenter.Defau
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageProducer")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageProducer")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.jsp;
|
package datadog.trace.instrumentation.jsp;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -39,12 +39,12 @@ public final class JSPInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.servlet.jsp.HttpJspPage")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.jsp.HttpJspPage")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("_jspService")
|
named("_jspService")
|
||||||
.and(takesArgument(0, named("javax.servlet.http.HttpServletRequest")))
|
.and(takesArgument(0, named("javax.servlet.http.HttpServletRequest")))
|
||||||
|
@ -68,14 +68,14 @@ public final class JSPInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
final Span span = scope.span();
|
final Span span = scope.span();
|
||||||
// get the JSP file name being rendered in an include action
|
// get the JSP file name being rendered in an include action
|
||||||
Object includeServletPath = req.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH);
|
final Object includeServletPath = req.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH);
|
||||||
String resourceName = req.getServletPath();
|
String resourceName = req.getServletPath();
|
||||||
if (includeServletPath != null && includeServletPath instanceof String) {
|
if (includeServletPath != null && includeServletPath instanceof String) {
|
||||||
resourceName = includeServletPath.toString();
|
resourceName = includeServletPath.toString();
|
||||||
}
|
}
|
||||||
span.setTag(DDTags.RESOURCE_NAME, resourceName);
|
span.setTag(DDTags.RESOURCE_NAME, resourceName);
|
||||||
|
|
||||||
Object forwardOrigin = req.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH);
|
final Object forwardOrigin = req.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH);
|
||||||
if (forwardOrigin != null && forwardOrigin instanceof String) {
|
if (forwardOrigin != null && forwardOrigin instanceof String) {
|
||||||
span.setTag("jsp.forwardOrigin", forwardOrigin.toString());
|
span.setTag("jsp.forwardOrigin", forwardOrigin.toString());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.netty40;
|
package datadog.trace.instrumentation.netty40;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
|
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
|
||||||
|
@ -48,7 +48,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("io.netty.channel.ChannelPipeline")));
|
return not(isInterface()).and(safeHasSuperType(named("io.netty.channel.ChannelPipeline")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -99,7 +99,9 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
@Advice.Enter final int depth,
|
@Advice.Enter final int depth,
|
||||||
@Advice.This final ChannelPipeline pipeline,
|
@Advice.This final ChannelPipeline pipeline,
|
||||||
@Advice.Argument(2) final ChannelHandler handler) {
|
@Advice.Argument(2) final ChannelHandler handler) {
|
||||||
if (depth > 0) return;
|
if (depth > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Server pipeline handlers
|
// Server pipeline handlers
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.netty41;
|
package datadog.trace.instrumentation.netty41;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
|
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
|
||||||
|
@ -48,7 +48,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("io.netty.channel.ChannelPipeline")));
|
return not(isInterface()).and(safeHasSuperType(named("io.netty.channel.ChannelPipeline")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -99,7 +99,9 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
@Advice.Enter final int depth,
|
@Advice.Enter final int depth,
|
||||||
@Advice.This final ChannelPipeline pipeline,
|
@Advice.This final ChannelPipeline pipeline,
|
||||||
@Advice.Argument(2) final ChannelHandler handler) {
|
@Advice.Argument(2) final ChannelHandler handler) {
|
||||||
if (depth > 0) return;
|
if (depth > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Server pipeline handlers
|
// Server pipeline handlers
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package datadog.trace.instrumentation.play;
|
package datadog.trace.instrumentation.play;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
@ -46,7 +46,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return hasSuperType(named("play.api.mvc.Action"));
|
return safeHasSuperType(named("play.api.mvc.Action"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.ratpack;
|
package datadog.trace.instrumentation.ratpack;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.instrumentation.ratpack.RatpackInstrumentation.CLASSLOADER_CONTAINS_RATPACK_1_4_OR_ABOVE;
|
import static datadog.trace.instrumentation.ratpack.RatpackInstrumentation.CLASSLOADER_CONTAINS_RATPACK_1_4_OR_ABOVE;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.not;
|
import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
|
@ -35,7 +35,7 @@ public final class RatpackHttpClientInstrumentation extends Instrumenter.Default
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("ratpack.http.client.HttpClient")));
|
return not(isInterface()).and(safeHasSuperType(named("ratpack.http.client.HttpClient")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -63,7 +63,7 @@ public final class RatpackHttpClientInstrumentation extends Instrumenter.Default
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
named("request")
|
named("request")
|
||||||
.and(
|
.and(
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.ratpack;
|
package datadog.trace.instrumentation.ratpack;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
|
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
|
||||||
|
@ -91,7 +91,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("ratpack.exec.ExecStarter")));
|
return not(isInterface()).and(safeHasSuperType(named("ratpack.exec.ExecStarter")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -136,7 +136,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return named("ratpack.exec.Execution")
|
return named("ratpack.exec.Execution")
|
||||||
.or(not(isInterface()).and(hasSuperType(named("ratpack.exec.Execution"))));
|
.or(not(isInterface()).and(safeHasSuperType(named("ratpack.exec.Execution"))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.servlet2;
|
package datadog.trace.instrumentation.servlet2;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -23,7 +23,7 @@ public final class FilterChain2Instrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.servlet.FilterChain")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.FilterChain")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.servlet2;
|
package datadog.trace.instrumentation.servlet2;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
|
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -28,7 +28,7 @@ public final class HttpServlet2Instrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.servlet.http.HttpServlet")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.http.HttpServlet")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package datadog.trace.instrumentation.servlet3;
|
package datadog.trace.instrumentation.servlet3;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -21,7 +21,7 @@ public class AbstractServlet3Instrumentation extends Instrumenter.Default {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.servlet.FilterChain")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.FilterChain")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package datadog.trace.instrumentation.servlet3;
|
package datadog.trace.instrumentation.servlet3;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -18,7 +18,7 @@ public final class FilterChain3Instrumentation extends AbstractServlet3Instrumen
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.servlet.FilterChain")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.FilterChain")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package datadog.trace.instrumentation.servlet3;
|
package datadog.trace.instrumentation.servlet3;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
|
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -18,7 +18,7 @@ public final class HttpServlet3Instrumentation extends AbstractServlet3Instrumen
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface()).and(hasSuperType(named("javax.servlet.http.HttpServlet")));
|
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.http.HttpServlet")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package datadog.trace.instrumentation.springweb;
|
package datadog.trace.instrumentation.springweb;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithField;
|
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithField;
|
||||||
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
import static io.opentracing.log.Fields.ERROR_OBJECT;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
|
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
|
||||||
|
@ -38,7 +38,7 @@ public final class SpringWebInstrumentation extends Instrumenter.Default {
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return not(isInterface())
|
return not(isInterface())
|
||||||
.and(hasSuperType(named("org.springframework.web.servlet.HandlerAdapter")));
|
.and(safeHasSuperType(named("org.springframework.web.servlet.HandlerAdapter")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package datadog.trace.instrumentation.trace_annotation;
|
package datadog.trace.instrumentation.trace_annotation;
|
||||||
|
|
||||||
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static datadog.trace.instrumentation.trace_annotation.TraceConfigInstrumentation.PACKAGE_CLASS_NAME_REGEX;
|
import static datadog.trace.instrumentation.trace_annotation.TraceConfigInstrumentation.PACKAGE_CLASS_NAME_REGEX;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.declaresMethod;
|
import static net.bytebuddy.matcher.ElementMatchers.declaresMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.is;
|
import static net.bytebuddy.matcher.ElementMatchers.is;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
|
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
@ -79,12 +79,12 @@ public final class TraceAnnotationsInstrumentation extends Instrumenter.Default
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher typeMatcher() {
|
public ElementMatcher typeMatcher() {
|
||||||
return hasSuperType(declaresMethod(isAnnotatedWith(methodTraceMatcher)));
|
return safeHasSuperType(declaresMethod(isAnnotatedWith(methodTraceMatcher)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ElementMatcher, String> transformers() {
|
public Map<ElementMatcher, String> transformers() {
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(isAnnotatedWith(methodTraceMatcher), TraceAdvice.class.getName());
|
transformers.put(isAnnotatedWith(methodTraceMatcher), TraceAdvice.class.getName());
|
||||||
return transformers;
|
return transformers;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package datadog.trace.instrumentation.trace_annotation;
|
package datadog.trace.instrumentation.trace_annotation;
|
||||||
|
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
|
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
|
@ -92,7 +92,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final Map.Entry<String, Set<String>> entry : classMethodsToTrace.entrySet()) {
|
for (final Map.Entry<String, Set<String>> entry : classMethodsToTrace.entrySet()) {
|
||||||
TracerClassInstrumentation tracerConfigClass =
|
final TracerClassInstrumentation tracerConfigClass =
|
||||||
new TracerClassInstrumentation(entry.getKey(), entry.getValue());
|
new TracerClassInstrumentation(entry.getKey(), entry.getValue());
|
||||||
agentBuilder = tracerConfigClass.instrument(agentBuilder);
|
agentBuilder = tracerConfigClass.instrument(agentBuilder);
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
|
||||||
this("noop", Collections.singleton("noop"));
|
this("noop", Collections.singleton("noop"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TracerClassInstrumentation(String className, Set<String> methodNames) {
|
public TracerClassInstrumentation(final String className, final Set<String> methodNames) {
|
||||||
super("trace", "trace-config");
|
super("trace", "trace-config");
|
||||||
this.className = className;
|
this.className = className;
|
||||||
this.methodNames = methodNames;
|
this.methodNames = methodNames;
|
||||||
|
@ -117,7 +117,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
return hasSuperType(named(className));
|
return safeHasSuperType(named(className));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -131,7 +131,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<ElementMatcher, String> transformers = new HashMap<>();
|
final Map<ElementMatcher, String> transformers = new HashMap<>();
|
||||||
transformers.put(methodMatchers, TraceAdvice.class.getName());
|
transformers.put(methodMatchers, TraceAdvice.class.getName());
|
||||||
return transformers;
|
return transformers;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue