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:
Nikolay Martynov 2018-07-30 16:20:55 -04:00
parent deec4a795c
commit 6bc1d1ab8e
31 changed files with 208 additions and 75 deletions

View File

@ -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 + ")";
}
}
}

View File

@ -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

View File

@ -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"));
} }

View File

@ -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"));
} }

View File

@ -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"));
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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;
} }

View File

@ -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")));
} }

View File

@ -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());

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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());
} }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
} }

View File

@ -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;
} }