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;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
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.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -32,7 +32,7 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
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

View File

@ -41,7 +41,7 @@ public class Elasticsearch2TransportClientInstrumentation extends Instrumenter.D
@Override
public ElementMatcher typeMatcher() {
// 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"));
}

View File

@ -41,7 +41,7 @@ public class Elasticsearch5TransportClientInstrumentation extends Instrumenter.D
@Override
public ElementMatcher typeMatcher() {
// 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"));
}

View File

@ -45,7 +45,7 @@ public class Elasticsearch6TransportClientInstrumentation extends Instrumenter.D
@Override
public ElementMatcher typeMatcher() {
// 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"));
}

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.hystrix;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -31,7 +31,7 @@ public class HystrixCommandInstrumentation extends Instrumenter.Default {
public ElementMatcher typeMatcher() {
// Not adding a version restriction because this should work with any version and add some
// benefit.
return not(isInterface()).and(hasSuperType(named("com.netflix.hystrix.HystrixCommand")));
return not(isInterface()).and(safeHasSuperType(named("com.netflix.hystrix.HystrixCommand")));
}
@Override

View File

@ -1,6 +1,6 @@
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.nameMatches;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -95,7 +95,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface())
.and(hasSuperType(named(Executor.class.getName())))
.and(safeHasSuperType(named(Executor.class.getName())))
.and(
new ElementMatcher<TypeDescription>() {
@Override

View File

@ -1,6 +1,6 @@
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.named;
import static net.bytebuddy.matcher.ElementMatchers.not;
@ -70,7 +70,7 @@ public final class FutureInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface())
.and(hasSuperType(named(Future.class.getName())))
.and(safeHasSuperType(named(Future.class.getName())))
.and(
new ElementMatcher<TypeDescription>() {
@Override

View File

@ -1,8 +1,7 @@
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.failSafe;
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -31,16 +30,14 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher typeMatcher() {
return hasSuperType(
return safeHasSuperType(
isAnnotatedWith(named("javax.ws.rs.Path"))
.or(
failSafe(
hasSuperType(declaresMethod(isAnnotatedWith(named("javax.ws.rs.Path")))))));
.or(safeHasSuperType(declaresMethod(isAnnotatedWith(named("javax.ws.rs.Path"))))));
}
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
isAnnotatedWith(
named("javax.ws.rs.Path")

View File

@ -1,6 +1,6 @@
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.returns;
@ -21,7 +21,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return hasSuperType(named("javax.ws.rs.client.ClientBuilder"));
return safeHasSuperType(named("javax.ws.rs.client.ClientBuilder"));
}
@Override
@ -37,7 +37,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
public Map<ElementMatcher, String> transformers() {
final Map<ElementMatcher, String> transformers = new HashMap<>();
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());
return transformers;
}

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.jetty8;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -30,7 +30,7 @@ public final class HandlerInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
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")));
}

View File

@ -1,9 +1,9 @@
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.instrumentation.jms.util.JmsUtil.toResourceName;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -47,7 +47,7 @@ public final class JMS1MessageConsumerInstrumentation extends Instrumenter.Defau
@Override
public ElementMatcher<? super TypeDescription> typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageConsumer")));
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageConsumer")));
}
@Override
@ -62,7 +62,7 @@ public final class JMS1MessageConsumerInstrumentation extends Instrumenter.Defau
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("receive").and(takesArguments(0).or(takesArguments(1))).and(isPublic()),
ConsumerAdvice.class.getName());

View File

@ -1,9 +1,9 @@
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.instrumentation.jms.util.JmsUtil.toResourceName;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -39,7 +39,7 @@ public final class JMS1MessageListenerInstrumentation extends Instrumenter.Defau
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageListener")));
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageListener")));
}
@Override

View File

@ -1,9 +1,9 @@
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.instrumentation.jms.util.JmsUtil.toResourceName;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -39,7 +39,7 @@ public final class JMS1MessageProducerInstrumentation extends Instrumenter.Defau
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageProducer")));
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageProducer")));
}
@Override

View File

@ -1,9 +1,9 @@
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.instrumentation.jms.util.JmsUtil.toResourceName;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -46,7 +46,7 @@ public final class JMS2MessageConsumerInstrumentation extends Instrumenter.Defau
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageConsumer")));
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageConsumer")));
}
@Override

View File

@ -1,9 +1,9 @@
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.instrumentation.jms.util.JmsUtil.toResourceName;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -39,7 +39,7 @@ public final class JMS2MessageListenerInstrumentation extends Instrumenter.Defau
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageListener")));
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageListener")));
}
@Override

View File

@ -1,9 +1,9 @@
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.instrumentation.jms.util.JmsUtil.toResourceName;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -39,7 +39,7 @@ public final class JMS2MessageProducerInstrumentation extends Instrumenter.Defau
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.jms.MessageProducer")));
return not(isInterface()).and(safeHasSuperType(named("javax.jms.MessageProducer")));
}
@Override

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.jsp;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -39,12 +39,12 @@ public final class JSPInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.servlet.jsp.HttpJspPage")));
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.jsp.HttpJspPage")));
}
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("_jspService")
.and(takesArgument(0, named("javax.servlet.http.HttpServletRequest")))
@ -68,14 +68,14 @@ public final class JSPInstrumentation extends Instrumenter.Default {
final Span span = scope.span();
// 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();
if (includeServletPath != null && includeServletPath instanceof String) {
resourceName = includeServletPath.toString();
}
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) {
span.setTag("jsp.forwardOrigin", forwardOrigin.toString());
}

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.netty40;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
@ -48,7 +48,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("io.netty.channel.ChannelPipeline")));
return not(isInterface()).and(safeHasSuperType(named("io.netty.channel.ChannelPipeline")));
}
@Override
@ -99,7 +99,9 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
@Advice.Enter final int depth,
@Advice.This final ChannelPipeline pipeline,
@Advice.Argument(2) final ChannelHandler handler) {
if (depth > 0) return;
if (depth > 0) {
return;
}
try {
// Server pipeline handlers

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.netty41;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
@ -48,7 +48,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("io.netty.channel.ChannelPipeline")));
return not(isInterface()).and(safeHasSuperType(named("io.netty.channel.ChannelPipeline")));
}
@Override
@ -99,7 +99,9 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
@Advice.Enter final int depth,
@Advice.This final ChannelPipeline pipeline,
@Advice.Argument(2) final ChannelHandler handler) {
if (depth > 0) return;
if (depth > 0) {
return;
}
try {
// Server pipeline handlers

View File

@ -1,9 +1,9 @@
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.classLoaderHasClasses;
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.returns;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
@ -46,7 +46,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return hasSuperType(named("play.api.mvc.Action"));
return safeHasSuperType(named("play.api.mvc.Action"));
}
@Override

View File

@ -1,7 +1,7 @@
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 net.bytebuddy.matcher.ElementMatchers.hasSuperType;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not;
@ -35,7 +35,7 @@ public final class RatpackHttpClientInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("ratpack.http.client.HttpClient")));
return not(isInterface()).and(safeHasSuperType(named("ratpack.http.client.HttpClient")));
}
@Override
@ -63,7 +63,7 @@ public final class RatpackHttpClientInstrumentation extends Instrumenter.Default
@Override
public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>();
final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(
named("request")
.and(

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.ratpack;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
@ -91,7 +91,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("ratpack.exec.ExecStarter")));
return not(isInterface()).and(safeHasSuperType(named("ratpack.exec.ExecStarter")));
}
@Override
@ -136,7 +136,7 @@ public final class RatpackInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return named("ratpack.exec.Execution")
.or(not(isInterface()).and(hasSuperType(named("ratpack.exec.Execution"))));
.or(not(isInterface()).and(safeHasSuperType(named("ratpack.exec.Execution"))));
}
@Override

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.servlet2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -23,7 +23,7 @@ public final class FilterChain2Instrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.servlet.FilterChain")));
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.FilterChain")));
}
@Override

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.servlet2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isProtected;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -28,7 +28,7 @@ public final class HttpServlet2Instrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.servlet.http.HttpServlet")));
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.http.HttpServlet")));
}
@Override

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.servlet3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -21,7 +21,7 @@ public class AbstractServlet3Instrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.servlet.FilterChain")));
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.FilterChain")));
}
@Override

View File

@ -1,6 +1,6 @@
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.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -18,7 +18,7 @@ public final class FilterChain3Instrumentation extends AbstractServlet3Instrumen
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.servlet.FilterChain")));
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.FilterChain")));
}
@Override

View File

@ -1,6 +1,6 @@
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.isProtected;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -18,7 +18,7 @@ public final class HttpServlet3Instrumentation extends AbstractServlet3Instrumen
@Override
public ElementMatcher typeMatcher() {
return not(isInterface()).and(hasSuperType(named("javax.servlet.http.HttpServlet")));
return not(isInterface()).and(safeHasSuperType(named("javax.servlet.http.HttpServlet")));
}
@Override

View File

@ -1,8 +1,8 @@
package datadog.trace.instrumentation.springweb;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClassWithField;
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.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
@ -38,7 +38,7 @@ public final class SpringWebInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher typeMatcher() {
return not(isInterface())
.and(hasSuperType(named("org.springframework.web.servlet.HandlerAdapter")));
.and(safeHasSuperType(named("org.springframework.web.servlet.HandlerAdapter")));
}
@Override

View File

@ -1,8 +1,8 @@
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 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.isAnnotatedWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -79,12 +79,12 @@ public final class TraceAnnotationsInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher typeMatcher() {
return hasSuperType(declaresMethod(isAnnotatedWith(methodTraceMatcher)));
return safeHasSuperType(declaresMethod(isAnnotatedWith(methodTraceMatcher)));
}
@Override
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());
return transformers;
}

View File

@ -1,6 +1,6 @@
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 com.google.auto.service.AutoService;
@ -92,7 +92,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
}
for (final Map.Entry<String, Set<String>> entry : classMethodsToTrace.entrySet()) {
TracerClassInstrumentation tracerConfigClass =
final TracerClassInstrumentation tracerConfigClass =
new TracerClassInstrumentation(entry.getKey(), entry.getValue());
agentBuilder = tracerConfigClass.instrument(agentBuilder);
}
@ -109,7 +109,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
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");
this.className = className;
this.methodNames = methodNames;
@ -117,7 +117,7 @@ public class TraceConfigInstrumentation implements Instrumenter {
@Override
public ElementMatcher<? super TypeDescription> typeMatcher() {
return hasSuperType(named(className));
return safeHasSuperType(named(className));
}
@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());
return transformers;
}