Merge pull request #1250 from DataDog/tyler/test-matchers

Move matchers around and add unit tests.
This commit is contained in:
Tyler Benson 2020-02-24 09:14:31 -08:00 committed by GitHub
commit 39e577ad97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
115 changed files with 1000 additions and 591 deletions

View File

@ -1,7 +1,7 @@
package datadog.trace.agent.tooling;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.skipClassLoader;
import static datadog.trace.agent.tooling.GlobalIgnoresMatcher.globalIgnoresMatcher;
import static datadog.trace.agent.tooling.bytebuddy.GlobalIgnoresMatcher.globalIgnoresMatcher;
import static net.bytebuddy.matcher.ElementMatchers.any;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named;

View File

@ -1,5 +1,7 @@
package datadog.trace.agent.tooling;
import datadog.trace.agent.tooling.bytebuddy.DDCachingPoolStrategy;
import datadog.trace.agent.tooling.bytebuddy.DDLocationStrategy;
import datadog.trace.bootstrap.WeakMap;
/**

View File

@ -1,393 +0,0 @@
package datadog.trace.agent.tooling;
import static net.bytebuddy.matcher.ElementMatchers.hasSignature;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.build.HashCodeAndEqualsPlugin;
import net.bytebuddy.description.method.MethodDescription;
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 {
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeExtendsClass(
final ElementMatcher<? super TypeDescription> matcher) {
return new SafeExtendsClassMatcher<>(new SafeErasureMatcher<>(matcher));
}
public static <T extends TypeDescription> ElementMatcher.Junction<T> safeHasInterface(
final ElementMatcher<? super TypeDescription> matcher) {
return new SafeHasSuperTypeMatcher<>(new SafeErasureMatcher<>(matcher), true);
}
/**
* 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 new SafeHasSuperTypeMatcher<>(new SafeErasureMatcher<>(matcher), false);
}
/**
* Wraps another matcher to assure that an element is not matched in case that the matching causes
* an {@link Exception}. Logs exception if it happens.
*
* @param matcher The element matcher that potentially throws an exception.
* @param <T> The type of the matched object.
* @return A matcher that returns {@code false} in case that the given matcher throws an
* exception.
*/
public static <T> ElementMatcher.Junction<T> failSafe(
final ElementMatcher<? super T> matcher, final String description) {
return new SafeMatcher<>(matcher, false, description);
}
private static TypeDescription safeAsErasure(final TypeDefinition typeDefinition) {
try {
return typeDefinition.asErasure();
} catch (final Exception e) {
log.debug(
"{} trying to get erasure for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
return null;
}
}
/**
* An element matcher that matches a super type. This is different from {@link
* net.bytebuddy.matcher.HasSuperTypeMatcher} in the following way:
*
* <ul>
* <li>Exceptions are logged
* <li>When exception happens the rest of the inheritance subtree is discarded (since ByteBuddy
* cannot load/parse type information for it) but search in other subtrees continues
* </ul>
*
* <p>This is useful because this allows us to see when matcher's check is not complete (i.e. part
* of it fails), at the same time it makes best effort instead of failing quickly (like {@code
* failSafe(hasSuperType(...))} does) which means the code is more resilient to classpath
* inconsistencies
*
* @param <T> The type of the matched entity.
* @see net.bytebuddy.matcher.HasSuperTypeMatcher
*/
@HashCodeAndEqualsPlugin.Enhance
private 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;
private final boolean interfacesOnly;
/**
* 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,
final boolean interfacesOnly) {
this.matcher = matcher;
this.interfacesOnly = interfacesOnly;
}
@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 (((!interfacesOnly || typeDefinition.isInterface())
&& matcher.matches(typeDefinition.asGenericType()))
|| hasInterface(typeDefinition, checkedInterfaces)) {
return true;
}
typeDefinition = safeGetSuperClass(typeDefinition);
}
return false;
}
/**
* 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)) {
final TypeDescription erasure = safeAsErasure(interfaceType);
if (erasure != null) {
if (checkedInterfaces.add(interfaceType.asErasure())
&& (matcher.matches(interfaceType.asGenericType())
|| hasInterface(interfaceType, checkedInterfaces))) {
return true;
}
}
}
return false;
}
/**
* TypeDefinition#getInterfaces() produces an interator which may throw an exception during
* iteration if an interface is absent from the classpath.
*
* <p>This method exists to allow getting interfaces even if the lookup on one fails.
*/
private List<TypeDefinition> safeGetInterfaces(final TypeDefinition typeDefinition) {
final List<TypeDefinition> interfaceTypes = new ArrayList<>();
try {
final Iterator<TypeDescription.Generic> interfaceIter =
typeDefinition.getInterfaces().iterator();
while (interfaceIter.hasNext()) {
interfaceTypes.add(interfaceIter.next());
}
} catch (final Exception e) {
log.debug(
"{} trying to get interfaces for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
}
return interfaceTypes;
}
@Override
public String toString() {
return "safeHasSuperType(" + matcher + ")";
}
}
/**
* An element matcher that matches its argument's {@link TypeDescription.Generic} raw type against
* the given matcher for a {@link TypeDescription}. As a wildcard does not define an erasure, a
* runtime exception is thrown when this matcher is applied to a wildcard.
*
* <p>Catches and logs exception if it was thrown when getting erasure, returning false.
*
* @param <T> The type of the matched entity.
* @see net.bytebuddy.matcher.ErasureMatcher
*/
@HashCodeAndEqualsPlugin.Enhance
private static class SafeErasureMatcher<T extends TypeDefinition>
extends ElementMatcher.Junction.AbstractBase<T> {
/** The matcher to apply to the raw type of the matched element. */
private final ElementMatcher<? super TypeDescription> matcher;
/**
* Creates a new erasure matcher.
*
* @param matcher The matcher to apply to the raw type.
*/
public SafeErasureMatcher(final ElementMatcher<? super TypeDescription> matcher) {
this.matcher = matcher;
}
@Override
public boolean matches(final T target) {
final TypeDescription erasure = safeAsErasure(target);
if (erasure == null) {
return false;
} else {
// We would like matcher exceptions to propagate
return matcher.matches(erasure);
}
}
@Override
public String toString() {
return "safeErasure(" + matcher + ")";
}
}
/**
* A fail-safe matcher catches exceptions that are thrown by a delegate matcher and returns an
* alternative value.
*
* <p>Logs exception if it was thrown.
*
* @param <T> The type of the matched entity.
* @see net.bytebuddy.matcher.FailSafeMatcher
*/
@HashCodeAndEqualsPlugin.Enhance
private static class SafeMatcher<T> extends ElementMatcher.Junction.AbstractBase<T> {
/** The delegate matcher that might throw an exception. */
private final ElementMatcher<? super T> matcher;
/** The fallback value in case of an exception. */
private final boolean fallback;
/** The text description to log if exception happens. */
private final String description;
/**
* Creates a new fail-safe element matcher.
*
* @param matcher The delegate matcher that might throw an exception.
* @param fallback The fallback value in case of an exception.
* @param description Descriptive string to log along with exception.
*/
public SafeMatcher(
final ElementMatcher<? super T> matcher, final boolean fallback, final String description) {
this.matcher = matcher;
this.fallback = fallback;
this.description = description;
}
@Override
public boolean matches(final T target) {
try {
return matcher.matches(target);
} catch (final Exception e) {
log.debug(description, e);
return fallback;
}
}
@Override
public String toString() {
return "safeMatcher(try(" + matcher + ") or " + fallback + ")";
}
}
private static String safeTypeDefinitionName(final TypeDefinition td) {
try {
return td.getTypeName();
} catch (final IllegalStateException ex) {
final String message = ex.getMessage();
if (message.startsWith("Cannot resolve type description for ")) {
return message.replace("Cannot resolve type description for ", "");
} else {
return "?";
}
}
}
// TODO: add javadoc
public static <T extends MethodDescription> ElementMatcher.Junction<T> hasSuperMethod(
final ElementMatcher<? super MethodDescription> matcher) {
return new HasSuperMethodMatcher<>(matcher);
}
// TODO: add javadoc
@HashCodeAndEqualsPlugin.Enhance
private static class HasSuperMethodMatcher<T extends MethodDescription>
extends ElementMatcher.Junction.AbstractBase<T> {
private final ElementMatcher<? super MethodDescription> matcher;
public HasSuperMethodMatcher(final ElementMatcher<? super MethodDescription> matcher) {
this.matcher = matcher;
}
@Override
public boolean matches(final MethodDescription target) {
if (target.isConstructor()) {
return false;
}
final Junction<MethodDescription> signatureMatcher = hasSignature(target.asSignatureToken());
TypeDefinition declaringType = target.getDeclaringType();
final Set<TypeDefinition> checkedInterfaces = new HashSet<>();
while (declaringType != null) {
for (final MethodDescription methodDescription : declaringType.getDeclaredMethods()) {
if (signatureMatcher.matches(methodDescription) && matcher.matches(methodDescription)) {
return true;
}
}
if (matchesInterface(declaringType.getInterfaces(), signatureMatcher, checkedInterfaces)) {
return true;
}
declaringType = safeGetSuperClass(declaringType);
}
return false;
}
private boolean matchesInterface(
final TypeList.Generic interfaces,
final Junction<MethodDescription> signatureMatcher,
final Set<TypeDefinition> checkedInterfaces) {
for (final TypeDefinition type : interfaces) {
if (!checkedInterfaces.contains(type)) {
checkedInterfaces.add(type);
for (final MethodDescription methodDescription : type.getDeclaredMethods()) {
if (signatureMatcher.matches(methodDescription) && matcher.matches(methodDescription)) {
return true;
}
}
if (matchesInterface(type.getInterfaces(), signatureMatcher, checkedInterfaces)) {
return true;
}
}
}
return false;
}
@Override
public String toString() {
return "hasSuperMethodMatcher(" + matcher + ")";
}
}
private static TypeDefinition safeGetSuperClass(final TypeDefinition typeDefinition) {
try {
return typeDefinition.getSuperClass();
} catch (final Exception e) {
log.debug(
"{} trying to get super class for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
return null;
}
}
private static class SafeExtendsClassMatcher<T extends TypeDescription>
extends ElementMatcher.Junction.AbstractBase<T> {
private final ElementMatcher<? super TypeDescription.Generic> matcher;
public SafeExtendsClassMatcher(final ElementMatcher<? super TypeDescription.Generic> matcher) {
this.matcher = matcher;
}
@Override
public boolean matches(final T target) {
// 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())) {
return true;
}
typeDefinition = safeGetSuperClass(typeDefinition);
}
return false;
}
}
}

View File

@ -1,11 +1,13 @@
package datadog.trace.agent.tooling;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.failSafe;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.failSafe;
import static net.bytebuddy.matcher.ElementMatchers.any;
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not;
import datadog.trace.agent.tooling.bytebuddy.DDTransformers;
import datadog.trace.agent.tooling.bytebuddy.ExceptionHandlers;
import datadog.trace.agent.tooling.context.FieldBackedProvider;
import datadog.trace.agent.tooling.context.InstrumentationContextProvider;
import datadog.trace.agent.tooling.context.NoopContextProvider;

View File

@ -1,4 +1,4 @@
package datadog.trace.agent.tooling;
package datadog.trace.agent.tooling.bytebuddy;
import static net.bytebuddy.agent.builder.AgentBuilder.PoolStrategy;

View File

@ -1,5 +1,6 @@
package datadog.trace.agent.tooling;
package datadog.trace.agent.tooling.bytebuddy;
import datadog.trace.agent.tooling.Utils;
import java.util.ArrayList;
import java.util.List;
import net.bytebuddy.agent.builder.AgentBuilder;

View File

@ -1,4 +1,4 @@
package datadog.trace.agent.tooling;
package datadog.trace.agent.tooling.bytebuddy;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.asm.TypeConstantAdjustment;
@ -12,10 +12,10 @@ public class DDTransformers {
new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(
DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader,
JavaModule javaModule) {
final DynamicType.Builder<?> builder,
final TypeDescription typeDescription,
final ClassLoader classLoader,
final JavaModule javaModule) {
return builder.visit(TypeConstantAdjustment.INSTANCE);
}
};

View File

@ -1,4 +1,4 @@
package datadog.trace.agent.tooling;
package datadog.trace.agent.tooling.bytebuddy;
import datadog.trace.bootstrap.ExceptionLogger;
import net.bytebuddy.ClassFileVersion;

View File

@ -1,4 +1,4 @@
package datadog.trace.agent.tooling;
package datadog.trace.agent.tooling.bytebuddy;
import java.util.regex.Pattern;
import net.bytebuddy.build.HashCodeAndEqualsPlugin;
@ -6,7 +6,7 @@ import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
@HashCodeAndEqualsPlugin.Enhance
class GlobalIgnoresMatcher<T extends TypeDescription>
public class GlobalIgnoresMatcher<T extends TypeDescription>
extends ElementMatcher.Junction.AbstractBase<T> {
private static final Pattern COM_MCHANGE_PROXY =

View File

@ -0,0 +1,72 @@
package datadog.trace.agent.tooling.bytebuddy.matcher;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDefinition;
import net.bytebuddy.description.type.TypeDescription;
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 DDElementMatchers {
public static <T extends TypeDescription> ElementMatcher.Junction<T> extendsClass(
final ElementMatcher<? super TypeDescription> matcher) {
return new SafeExtendsClassMatcher<>(new SafeErasureMatcher<>(matcher));
}
public static <T extends TypeDescription> ElementMatcher.Junction<T> hasInterface(
final ElementMatcher<? super TypeDescription> matcher) {
return new SafeHasSuperTypeMatcher<>(new SafeErasureMatcher<>(matcher), true);
}
/**
* 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 new SafeHasSuperTypeMatcher<>(new SafeErasureMatcher<>(matcher), false);
}
// TODO: add javadoc
public static <T extends MethodDescription> ElementMatcher.Junction<T> hasSuperMethod(
final ElementMatcher<? super MethodDescription> matcher) {
return new HasSuperMethodMatcher<>(matcher);
}
/**
* Wraps another matcher to assure that an element is not matched in case that the matching causes
* an {@link Exception}. Logs exception if it happens.
*
* @param matcher The element matcher that potentially throws an exception.
* @param <T> The type of the matched object.
* @return A matcher that returns {@code false} in case that the given matcher throws an
* exception.
*/
public static <T> ElementMatcher.Junction<T> failSafe(
final ElementMatcher<? super T> matcher, final String description) {
return new LoggingFailSafeMatcher<>(matcher, false, description);
}
static String safeTypeDefinitionName(final TypeDefinition td) {
try {
return td.getTypeName();
} catch (final IllegalStateException ex) {
final String message = ex.getMessage();
if (message.startsWith("Cannot resolve type description for ")) {
return message.replace("Cannot resolve type description for ", "");
} else {
return "?";
}
}
}
}

View File

@ -0,0 +1,72 @@
package datadog.trace.agent.tooling.bytebuddy.matcher;
import static datadog.trace.agent.tooling.bytebuddy.matcher.SafeHasSuperTypeMatcher.safeGetSuperClass;
import static net.bytebuddy.matcher.ElementMatchers.hasSignature;
import java.util.HashSet;
import java.util.Set;
import net.bytebuddy.build.HashCodeAndEqualsPlugin;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDefinition;
import net.bytebuddy.description.type.TypeList;
import net.bytebuddy.matcher.ElementMatcher;
// TODO: add javadoc
@HashCodeAndEqualsPlugin.Enhance
class HasSuperMethodMatcher<T extends MethodDescription>
extends ElementMatcher.Junction.AbstractBase<T> {
private final ElementMatcher<? super MethodDescription> matcher;
public HasSuperMethodMatcher(final ElementMatcher<? super MethodDescription> matcher) {
this.matcher = matcher;
}
@Override
public boolean matches(final MethodDescription target) {
if (target.isConstructor()) {
return false;
}
final Junction<MethodDescription> signatureMatcher = hasSignature(target.asSignatureToken());
TypeDefinition declaringType = target.getDeclaringType();
final Set<TypeDefinition> checkedInterfaces = new HashSet<>();
while (declaringType != null) {
for (final MethodDescription methodDescription : declaringType.getDeclaredMethods()) {
if (signatureMatcher.matches(methodDescription) && matcher.matches(methodDescription)) {
return true;
}
}
if (matchesInterface(declaringType.getInterfaces(), signatureMatcher, checkedInterfaces)) {
return true;
}
declaringType = safeGetSuperClass(declaringType);
}
return false;
}
private boolean matchesInterface(
final TypeList.Generic interfaces,
final Junction<MethodDescription> signatureMatcher,
final Set<TypeDefinition> checkedInterfaces) {
for (final TypeDefinition type : interfaces) {
if (!checkedInterfaces.contains(type)) {
checkedInterfaces.add(type);
for (final MethodDescription methodDescription : type.getDeclaredMethods()) {
if (signatureMatcher.matches(methodDescription) && matcher.matches(methodDescription)) {
return true;
}
}
if (matchesInterface(type.getInterfaces(), signatureMatcher, checkedInterfaces)) {
return true;
}
}
}
return false;
}
@Override
public String toString() {
return "hasSuperMethodMatcher(" + matcher + ")";
}
}

View File

@ -0,0 +1,57 @@
package datadog.trace.agent.tooling.bytebuddy.matcher;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.build.HashCodeAndEqualsPlugin;
import net.bytebuddy.matcher.ElementMatcher;
/**
* A fail-safe matcher catches exceptions that are thrown by a delegate matcher and returns an
* alternative value.
*
* <p>Logs exception if it was thrown.
*
* @param <T> The type of the matched entity.
* @see net.bytebuddy.matcher.FailSafeMatcher
*/
@Slf4j
@HashCodeAndEqualsPlugin.Enhance
class LoggingFailSafeMatcher<T> extends ElementMatcher.Junction.AbstractBase<T> {
/** The delegate matcher that might throw an exception. */
private final ElementMatcher<? super T> matcher;
/** The fallback value in case of an exception. */
private final boolean fallback;
/** The text description to log if exception happens. */
private final String description;
/**
* Creates a new fail-safe element matcher.
*
* @param matcher The delegate matcher that might throw an exception.
* @param fallback The fallback value in case of an exception.
* @param description Descriptive string to log along with exception.
*/
public LoggingFailSafeMatcher(
final ElementMatcher<? super T> matcher, final boolean fallback, final String description) {
this.matcher = matcher;
this.fallback = fallback;
this.description = description;
}
@Override
public boolean matches(final T target) {
try {
return matcher.matches(target);
} catch (final Exception e) {
log.debug(description, e);
return fallback;
}
}
@Override
public String toString() {
return "safeMatcher(try(" + matcher + ") or " + fallback + ")";
}
}

View File

@ -0,0 +1,65 @@
package datadog.trace.agent.tooling.bytebuddy.matcher;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeTypeDefinitionName;
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.matcher.ElementMatcher;
/**
* An element matcher that matches its argument's {@link TypeDescription.Generic} raw type against
* the given matcher for a {@link TypeDescription}. As a wildcard does not define an erasure, a
* runtime exception is thrown when this matcher is applied to a wildcard.
*
* <p>Catches and logs exception if it was thrown when getting erasure, returning false.
*
* @param <T> The type of the matched entity.
* @see net.bytebuddy.matcher.ErasureMatcher
*/
@Slf4j
@HashCodeAndEqualsPlugin.Enhance
class SafeErasureMatcher<T extends TypeDefinition> extends ElementMatcher.Junction.AbstractBase<T> {
/** The matcher to apply to the raw type of the matched element. */
private final ElementMatcher<? super TypeDescription> matcher;
/**
* Creates a new erasure matcher.
*
* @param matcher The matcher to apply to the raw type.
*/
public SafeErasureMatcher(final ElementMatcher<? super TypeDescription> matcher) {
this.matcher = matcher;
}
@Override
public boolean matches(final T target) {
final TypeDescription erasure = safeAsErasure(target);
if (erasure == null) {
return false;
} else {
// We would like matcher exceptions to propagate
return matcher.matches(erasure);
}
}
@Override
public String toString() {
return "safeErasure(" + matcher + ")";
}
static TypeDescription safeAsErasure(final TypeDefinition typeDefinition) {
try {
return typeDefinition.asErasure();
} catch (final Exception e) {
log.debug(
"{} trying to get erasure for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
return null;
}
}
}

View File

@ -0,0 +1,31 @@
package datadog.trace.agent.tooling.bytebuddy.matcher;
import static datadog.trace.agent.tooling.bytebuddy.matcher.SafeHasSuperTypeMatcher.safeGetSuperClass;
import net.bytebuddy.description.type.TypeDefinition;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
class SafeExtendsClassMatcher<T extends TypeDescription>
extends ElementMatcher.Junction.AbstractBase<T> {
private final ElementMatcher<? super TypeDescription.Generic> matcher;
public SafeExtendsClassMatcher(final ElementMatcher<? super TypeDescription.Generic> matcher) {
this.matcher = matcher;
}
@Override
public boolean matches(final T target) {
// 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())) {
return true;
}
typeDefinition = safeGetSuperClass(typeDefinition);
}
return false;
}
}

View File

@ -0,0 +1,135 @@
package datadog.trace.agent.tooling.bytebuddy.matcher;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeTypeDefinitionName;
import static datadog.trace.agent.tooling.bytebuddy.matcher.SafeErasureMatcher.safeAsErasure;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
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.matcher.ElementMatcher;
/**
* An element matcher that matches a super type. This is different from {@link
* net.bytebuddy.matcher.HasSuperTypeMatcher} in the following way:
*
* <ul>
* <li>Exceptions are logged
* <li>When exception happens the rest of the inheritance subtree is discarded (since ByteBuddy
* cannot load/parse type information for it) but search in other subtrees continues
* </ul>
*
* <p>This is useful because this allows us to see when matcher's check is not complete (i.e. part
* of it fails), at the same time it makes best effort instead of failing quickly (like {@code
* failSafe(hasSuperType(...))} does) which means the code is more resilient to classpath
* inconsistencies
*
* @param <T> The type of the matched entity.
* @see net.bytebuddy.matcher.HasSuperTypeMatcher
*/
@Slf4j
@HashCodeAndEqualsPlugin.Enhance
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;
private final boolean interfacesOnly;
/**
* 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, final boolean interfacesOnly) {
this.matcher = matcher;
this.interfacesOnly = interfacesOnly;
}
@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 (((!interfacesOnly || typeDefinition.isInterface())
&& matcher.matches(typeDefinition.asGenericType()))
|| hasInterface(typeDefinition, checkedInterfaces)) {
return true;
}
typeDefinition = safeGetSuperClass(typeDefinition);
}
return false;
}
/**
* 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)) {
final TypeDescription erasure = safeAsErasure(interfaceType);
if (erasure != null) {
if (checkedInterfaces.add(interfaceType.asErasure())
&& (matcher.matches(interfaceType.asGenericType())
|| hasInterface(interfaceType, checkedInterfaces))) {
return true;
}
}
}
return false;
}
/**
* TypeDefinition#getInterfaces() produces an interator which may throw an exception during
* iteration if an interface is absent from the classpath.
*
* <p>This method exists to allow getting interfaces even if the lookup on one fails.
*/
private List<TypeDefinition> safeGetInterfaces(final TypeDefinition typeDefinition) {
final List<TypeDefinition> interfaceTypes = new ArrayList<>();
try {
final Iterator<TypeDescription.Generic> interfaceIter =
typeDefinition.getInterfaces().iterator();
while (interfaceIter.hasNext()) {
interfaceTypes.add(interfaceIter.next());
}
} catch (final Exception e) {
log.debug(
"{} trying to get interfaces for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
}
return interfaceTypes;
}
static TypeDefinition safeGetSuperClass(final TypeDefinition typeDefinition) {
try {
return typeDefinition.getSuperClass();
} catch (final Exception e) {
log.debug(
"{} trying to get super class for target {}: {}",
e.getClass().getSimpleName(),
safeTypeDefinitionName(typeDefinition),
e.getMessage());
return null;
}
}
@Override
public String toString() {
return "safeHasSuperType(" + matcher + ")";
}
}

View File

@ -1,7 +1,7 @@
package datadog.trace.agent.tooling.context;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.BOOTSTRAP_CLASSLOADER;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeHasSuperType;
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.named;

View File

@ -3,7 +3,7 @@ package datadog.trace.agent.test
import ch.qos.logback.classic.Level
import ch.qos.logback.classic.Logger
import ch.qos.logback.core.read.ListAppender
import datadog.trace.agent.tooling.ExceptionHandlers
import datadog.trace.agent.tooling.bytebuddy.ExceptionHandlers
import datadog.trace.bootstrap.ExceptionLogger
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.agent.ByteBuddyAgent

View File

@ -1,6 +1,6 @@
package datadog.trace.agent.test
import datadog.trace.agent.tooling.DDLocationStrategy
import datadog.trace.agent.tooling.bytebuddy.DDLocationStrategy
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.agent.builder.AgentBuilder
import spock.lang.Shared

View File

@ -1,5 +1,6 @@
package datadog.trace.agent.tooling
import datadog.trace.agent.tooling.bytebuddy.DDCachingPoolStrategy
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.description.type.TypeDescription
import net.bytebuddy.dynamic.ClassFileLocator
@ -215,7 +216,8 @@ class CacheProviderTest extends DDSpecification {
}
@Override
void close() throws IOException {}
void close() throws IOException {
}
}
}
}

View File

@ -0,0 +1,68 @@
package datadog.trace.agent.tooling.bytebuddy.matcher
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.A
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.B
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.C
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.F
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.G
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.TracedClass
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.UntracedClass
import datadog.trace.api.Trace
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.description.method.MethodDescription
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasSuperMethod
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith
import static net.bytebuddy.matcher.ElementMatchers.none
class HasSuperMethodMatcherTest extends DDSpecification {
def "test matcher #type.simpleName #method"() {
expect:
hasSuperMethod(isAnnotatedWith(Trace)).matches(argument) == result
where:
type | method | result
A | "a" | false
B | "b" | true
C | "c" | false
F | "f" | true
G | "g" | false
TracedClass | "a" | true
UntracedClass | "a" | false
UntracedClass | "b" | true
argument = new MethodDescription.ForLoadedMethod(type.getDeclaredMethod(method))
}
def "test constructor never matches"() {
setup:
def method = Mock(MethodDescription)
def matcher = hasSuperMethod(none())
when:
def result = matcher.matches(method)
then:
!result
1 * method.isConstructor() >> true
0 * _
}
def "test traversal exceptions"() {
setup:
def method = Mock(MethodDescription)
def matcher = hasSuperMethod(none())
def sigToken = new MethodDescription.ForLoadedMethod(A.getDeclaredMethod("a")).asSignatureToken()
when:
def result = matcher.matches(method)
then:
!result // default to false
1 * method.isConstructor() >> false
1 * method.asSignatureToken() >> sigToken
1 * method.getDeclaringType() >> null
0 * _
}
}

View File

@ -0,0 +1,50 @@
package datadog.trace.agent.tooling.bytebuddy.matcher
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.A
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.B
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.F
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.G
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.description.type.TypeDescription
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass
import static net.bytebuddy.matcher.ElementMatchers.named
class SafeExtendsClassMatcherTest extends DDSpecification {
def "test matcher #matcherClass.simpleName -> #type.simpleName"() {
expect:
extendsClass(matcher).matches(argument) == result
where:
matcherClass | type | result
A | B | false
A | F | false
G | F | false
F | F | true
F | G | true
matcher = named(matcherClass.name)
argument = TypeDescription.ForLoadedType.of(type)
}
def "test traversal exceptions"() {
setup:
def type = Mock(TypeDescription)
def typeGeneric = Mock(TypeDescription.Generic)
def matcher = extendsClass(named(Object.name))
when:
def result = matcher.matches(type)
then:
!result // default to false
noExceptionThrown()
1 * type.asGenericType() >> typeGeneric
1 * type.getTypeName() >> "type-name"
1 * typeGeneric.asErasure() >> { throw new Exception("asErasure exception") }
1 * typeGeneric.getTypeName() >> "typeGeneric-name"
1 * type.getSuperClass() >> { throw new Exception("getSuperClass exception") }
0 * _
}
}

View File

@ -0,0 +1,56 @@
package datadog.trace.agent.tooling.bytebuddy.matcher
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.A
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.B
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.E
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.F
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.G
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.description.type.TypeDescription
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface
import static net.bytebuddy.matcher.ElementMatchers.named
class SafeHasInterfaceMatcherTest extends DDSpecification {
def "test matcher #matcherClass.simpleName -> #type.simpleName"() {
expect:
hasInterface(matcher).matches(argument) == result
where:
matcherClass | type | result
A | A | true
A | B | true
B | A | false
A | E | true
A | F | true
F | A | false
F | F | false
F | G | false
matcher = named(matcherClass.name)
argument = TypeDescription.ForLoadedType.of(type)
}
def "test traversal exceptions"() {
setup:
def type = Mock(TypeDescription)
def typeGeneric = Mock(TypeDescription.Generic)
def matcher = hasInterface(named(Object.name))
when:
def result = matcher.matches(type)
then:
!result // default to false
noExceptionThrown()
1 * type.isInterface() >> true
1 * type.asGenericType() >> typeGeneric
1 * typeGeneric.asErasure() >> { throw new Exception("asErasure exception") }
1 * typeGeneric.getTypeName() >> "typeGeneric-name"
1 * type.getInterfaces() >> { throw new Exception("getInterfaces exception") }
1 * type.getSuperClass() >> { throw new Exception("getSuperClass exception") }
2 * type.getTypeName() >> "type-name"
0 * _
}
}

View File

@ -0,0 +1,55 @@
package datadog.trace.agent.tooling.bytebuddy.matcher
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.A
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.B
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.E
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.F
import datadog.trace.agent.tooling.bytebuddy.matcher.testclasses.G
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.description.type.TypeDescription
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeHasSuperType
import static net.bytebuddy.matcher.ElementMatchers.named
class SafeHasSuperTypeMatcherTest extends DDSpecification {
def "test matcher #matcherClass.simpleName -> #type.simpleName"() {
expect:
safeHasSuperType(matcher).matches(argument) == result
where:
matcherClass | type | result
A | A | true
A | B | true
B | A | false
A | E | true
A | F | true
F | A | false
F | F | true
F | G | true
matcher = named(matcherClass.name)
argument = TypeDescription.ForLoadedType.of(type)
}
def "test traversal exceptions"() {
setup:
def type = Mock(TypeDescription)
def typeGeneric = Mock(TypeDescription.Generic)
def matcher = safeHasSuperType(named(Object.name))
when:
def result = matcher.matches(type)
then:
!result // default to false
noExceptionThrown()
1 * type.asGenericType() >> typeGeneric
1 * typeGeneric.asErasure() >> { throw new Exception("asErasure exception") }
1 * typeGeneric.getTypeName() >> "typeGeneric-name"
1 * type.getInterfaces() >> { throw new Exception("getInterfaces exception") }
1 * type.getSuperClass() >> { throw new Exception("getSuperClass exception") }
2 * type.getTypeName() >> "type-name"
0 * _
}
}

View File

@ -0,0 +1,40 @@
package datadog.trace.agent.tooling.bytebuddy.matcher
import datadog.trace.util.test.DDSpecification
import net.bytebuddy.matcher.ElementMatcher
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.failSafe
class SafeMatcherTest extends DDSpecification {
def mockMatcher = Mock(ElementMatcher)
def "test matcher"() {
setup:
def matcher = failSafe(mockMatcher, "test")
when:
def result = matcher.matches(new Object())
then:
1 * mockMatcher.matches(_) >> match
result == match
where:
match << [true, false]
}
def "test matcher exception"() {
setup:
def matcher = failSafe(mockMatcher, "test")
when:
def result = matcher.matches(new Object())
then:
1 * mockMatcher.matches(_) >> { throw new Exception("matcher exception") }
0 * _
noExceptionThrown()
!result // default to false
}
}

View File

@ -0,0 +1,5 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
public interface A {
void a();
}

View File

@ -0,0 +1,8 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
import datadog.trace.api.Trace;
public interface B extends A {
@Trace
void b();
}

View File

@ -0,0 +1,5 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
public interface C extends A, B {
void c();
}

View File

@ -0,0 +1,8 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
import datadog.trace.api.Trace;
public interface D extends A, B, C {
@Trace
void d();
}

View File

@ -0,0 +1,5 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
public interface E extends B, C, D {
void e();
}

View File

@ -0,0 +1,8 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
import datadog.trace.api.Trace;
public abstract class F implements E {
@Trace
public abstract void f();
}

View File

@ -0,0 +1,5 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
public abstract class G extends F {
public void g() {}
}

View File

@ -0,0 +1,33 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
import datadog.trace.api.Trace;
public class TracedClass extends UntracedClass {
@Trace
@Override
public void g() {}
@Trace
@Override
public void f() {}
@Trace
@Override
public void e() {}
@Trace
@Override
public void d() {}
@Trace
@Override
public void c() {}
@Trace
@Override
public void b() {}
@Trace
@Override
public void a() {}
}

View File

@ -0,0 +1,24 @@
package datadog.trace.agent.tooling.bytebuddy.matcher.testclasses;
public class UntracedClass extends G {
@Override
public void g() {}
@Override
public void f() {}
@Override
public void e() {}
@Override
public void d() {}
@Override
public void c() {}
@Override
public void b() {}
@Override
public void a() {}
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.apachehttpasyncclient;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -40,7 +40,7 @@ public class ApacheHttpAsyncClientInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeHasInterface(named("org.apache.http.nio.client.HttpAsyncClient"));
return hasInterface(named("org.apache.http.nio.client.HttpAsyncClient"));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.apachehttpasyncclient;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -31,7 +31,7 @@ public class ApacheHttpClientRedirectInstrumentation extends Instrumenter.Defaul
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeHasInterface(named("org.apache.http.client.RedirectStrategy"));
return hasInterface(named("org.apache.http.client.RedirectStrategy"));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.apachehttpclient;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -44,7 +44,7 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.apache.http.client.HttpClient")));
return not(isInterface()).and(hasInterface(named("org.apache.http.client.HttpClient")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.aws.v0;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -28,7 +28,7 @@ public final class RequestInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return nameStartsWith("com.amazonaws.")
.and(safeExtendsClass(named("com.amazonaws.AmazonWebServiceRequest")));
.and(extendsClass(named("com.amazonaws.AmazonWebServiceRequest")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.aws.v2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -26,8 +26,7 @@ public final class AwsClientInstrumentation extends AbstractAwsClientInstrumenta
public ElementMatcher<TypeDescription> typeMatcher() {
return nameStartsWith("software.amazon.awssdk.")
.and(not(isInterface()))
.and(
safeHasInterface(named("software.amazon.awssdk.core.client.builder.SdkClientBuilder")));
.and(hasInterface(named("software.amazon.awssdk.core.client.builder.SdkClientBuilder")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.aws.v2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -31,7 +31,7 @@ public final class AwsHttpClientInstrumentation extends AbstractAwsClientInstrum
public ElementMatcher<TypeDescription> typeMatcher() {
return nameStartsWith("software.amazon.awssdk.")
.and(
safeExtendsClass(
extendsClass(
named(
"software.amazon.awssdk.core.internal.http.pipeline.stages.MakeHttpRequestStage")
.or(

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.classloading;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.isProtected;
@ -44,7 +44,7 @@ public final class ClassloadingInstrumentation extends Instrumenter.Default {
return not(named("java.lang.ClassLoader"))
.and(not(named("com.ibm.oti.vm.BootstrapClassLoader")))
.and(not(named("datadog.trace.bootstrap.AgentClassLoader")))
.and(safeExtendsClass(named("java.lang.ClassLoader")));
.and(extendsClass(named("java.lang.ClassLoader")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.couchbase.client;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
@ -34,7 +34,7 @@ public class CouchbaseNetworkInstrumentation extends Instrumenter.Default {
// Exact class because private fields are used
return nameStartsWith("com.couchbase.client.")
.<TypeDescription>and(
safeExtendsClass(named("com.couchbase.client.core.endpoint.AbstractGenericHandler")));
extendsClass(named("com.couchbase.client.core.endpoint.AbstractGenericHandler")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.dropwizard.view;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -34,7 +34,7 @@ public final class DropwizardViewInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("io.dropwizard.views.ViewRenderer")));
return not(isInterface()).and(hasInterface(named("io.dropwizard.views.ViewRenderer")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.finatra;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -54,7 +54,7 @@ public class FinatraInstrumentation extends Instrumenter.Default {
public ElementMatcher<? super TypeDescription> typeMatcher() {
return nameStartsWith("com.twitter.finatra.")
.and(not(isInterface()))
.and(safeExtendsClass(named("com.twitter.finatra.http.internal.routing.Route")));
.and(extendsClass(named("com.twitter.finatra.http.internal.routing.Route")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v3_3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -31,7 +31,7 @@ public class CriteriaInstrumentation extends AbstractHibernateInstrumentation {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.Criteria")));
return not(isInterface()).and(hasInterface(named("org.hibernate.Criteria")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v3_3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.instrumentation.hibernate.HibernateDecorator.DECORATOR;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -33,7 +33,7 @@ public class QueryInstrumentation extends AbstractHibernateInstrumentation {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.Query")));
return not(isInterface()).and(hasInterface(named("org.hibernate.Query")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v3_3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.hibernate.HibernateDecorator.DECORATOR;
import static java.util.Collections.singletonMap;
@ -40,7 +40,7 @@ public class SessionFactoryInstrumentation extends AbstractHibernateInstrumentat
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.SessionFactory")));
return not(isInterface()).and(hasInterface(named("org.hibernate.SessionFactory")));
}
@Override
@ -53,7 +53,7 @@ public class SessionFactoryInstrumentation extends AbstractHibernateInstrumentat
returns(
named("org.hibernate.Session")
.or(named("org.hibernate.StatelessSession"))
.or(safeHasInterface(named("org.hibernate.Session"))))),
.or(hasInterface(named("org.hibernate.Session"))))),
SessionFactoryInstrumentation.class.getName() + "$SessionFactoryAdvice");
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v3_3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.instrumentation.hibernate.HibernateDecorator.DECORATOR;
import static datadog.trace.instrumentation.hibernate.SessionMethodUtils.SCOPE_ONLY_METHODS;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -50,7 +50,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation {
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface())
.and(
safeHasInterface(
hasInterface(
named("org.hibernate.Session").or(named("org.hibernate.StatelessSession"))));
}
@ -99,11 +99,11 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation {
SessionInstrumentation.class.getName() + "$GetTransactionAdvice");
transformers.put(
isMethod().and(returns(safeHasInterface(named("org.hibernate.Query")))),
isMethod().and(returns(hasInterface(named("org.hibernate.Query")))),
SessionInstrumentation.class.getName() + "$GetQueryAdvice");
transformers.put(
isMethod().and(returns(safeHasInterface(named("org.hibernate.Criteria")))),
isMethod().and(returns(hasInterface(named("org.hibernate.Criteria")))),
SessionInstrumentation.class.getName() + "$GetCriteriaAdvice");
return transformers;

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v3_3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -31,7 +31,7 @@ public class TransactionInstrumentation extends AbstractHibernateInstrumentation
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.Transaction")));
return not(isInterface()).and(hasInterface(named("org.hibernate.Transaction")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v4_0;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -31,7 +31,7 @@ public class CriteriaInstrumentation extends AbstractHibernateInstrumentation {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.Criteria")));
return not(isInterface()).and(hasInterface(named("org.hibernate.Criteria")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v4_0;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.instrumentation.hibernate.HibernateDecorator.DECORATOR;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -33,7 +33,7 @@ public class QueryInstrumentation extends AbstractHibernateInstrumentation {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.Query")));
return not(isInterface()).and(hasInterface(named("org.hibernate.Query")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v4_0;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.hibernate.HibernateDecorator.DECORATOR;
import static java.util.Collections.singletonMap;
@ -34,7 +34,7 @@ public class SessionFactoryInstrumentation extends AbstractHibernateInstrumentat
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.SessionFactory")));
return not(isInterface()).and(hasInterface(named("org.hibernate.SessionFactory")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v4_0;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.instrumentation.hibernate.HibernateDecorator.DECORATOR;
import static datadog.trace.instrumentation.hibernate.SessionMethodUtils.SCOPE_ONLY_METHODS;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -46,7 +46,7 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.SharedSessionContract")));
return not(isInterface()).and(hasInterface(named("org.hibernate.SharedSessionContract")));
}
@Override
@ -93,11 +93,11 @@ public class SessionInstrumentation extends AbstractHibernateInstrumentation {
SessionInstrumentation.class.getName() + "$GetTransactionAdvice");
transformers.put(
isMethod().and(returns(safeHasInterface(named("org.hibernate.Query")))),
isMethod().and(returns(hasInterface(named("org.hibernate.Query")))),
SessionInstrumentation.class.getName() + "$GetQueryAdvice");
transformers.put(
isMethod().and(returns(safeHasInterface(named("org.hibernate.Criteria")))),
isMethod().and(returns(hasInterface(named("org.hibernate.Criteria")))),
SessionInstrumentation.class.getName() + "$GetCriteriaAdvice");
return transformers;

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v4_0;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -31,7 +31,7 @@ public class TransactionInstrumentation extends AbstractHibernateInstrumentation
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.Transaction")));
return not(isInterface()).and(hasInterface(named("org.hibernate.Transaction")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v4_3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -47,7 +47,7 @@ public class ProcedureCallInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.procedure.ProcedureCall")));
return not(isInterface()).and(hasInterface(named("org.hibernate.procedure.ProcedureCall")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hibernate.core.v4_3;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -53,7 +53,7 @@ public class SessionInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("org.hibernate.SharedSessionContract")));
return not(isInterface()).and(hasInterface(named("org.hibernate.SharedSessionContract")));
}
@Override
@ -61,7 +61,7 @@ public class SessionInstrumentation extends Instrumenter.Default {
final Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
transformers.put(
isMethod().and(returns(safeHasInterface(named("org.hibernate.procedure.ProcedureCall")))),
isMethod().and(returns(hasInterface(named("org.hibernate.procedure.ProcedureCall")))),
SessionInstrumentation.class.getName() + "$GetProcedureCallAdvice");
return transformers;

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.http_url_connection;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -41,7 +41,7 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
.or(ElementMatchers.<TypeDescription>nameStartsWith("sun.net"))
// This class is a simple delegator. Skip because it does not update its `connected` field.
.and(not(named("sun.net.www.protocol.https.HttpsURLConnectionImpl")))
.and(safeExtendsClass(named("java.net.HttpURLConnection")));
.and(extendsClass(named("java.net.HttpURLConnection")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.hystrix;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.instrumentation.hystrix.HystrixDecorator.DECORATE;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.returns;
@ -29,7 +29,7 @@ public class HystrixInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeExtendsClass(
return extendsClass(
named("com.netflix.hystrix.HystrixCommand")
.or(named("com.netflix.hystrix.HystrixObservableCommand")));
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.java.concurrent;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not;
@ -129,7 +129,7 @@ public abstract class AbstractExecutorInstrumentation extends Instrumenter.Defau
});
}
return matcher.and(
safeHasInterface(named(Executor.class.getName()))); // Apply expensive matcher last.
hasInterface(named(Executor.class.getName()))); // Apply expensive matcher last.
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.java.concurrent;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -44,7 +44,7 @@ public final class AkkaForkJoinTaskInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeExtendsClass(named(TASK_CLASS_NAME)));
return not(isInterface()).and(extendsClass(named(TASK_CLASS_NAME)));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.java.concurrent;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan;
@ -36,7 +36,7 @@ public final class AsyncPropagatingDisableInstrumentation implements Instrumente
new ImmutableMap.Builder<
ElementMatcher<? super TypeDescription>,
ElementMatcher<? super MethodDescription>>()
.put(safeExtendsClass(named("rx.Scheduler$Worker")), named("schedulePeriodically"))
.put(extendsClass(named("rx.Scheduler$Worker")), named("schedulePeriodically"))
.build();
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.java.concurrent;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -90,7 +90,7 @@ public final class FutureInstrumentation extends Instrumenter.Default {
return whitelisted;
}
})
.and(safeHasInterface(named(Future.class.getName()))); // Apply expensive matcher last.
.and(hasInterface(named(Future.class.getName()))); // Apply expensive matcher last.
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.java.concurrent;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -41,7 +41,7 @@ public final class JavaForkJoinTaskInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeExtendsClass(named(ForkJoinTask.class.getName())));
return not(isInterface()).and(extendsClass(named(ForkJoinTask.class.getName())));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.java.concurrent;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -35,7 +35,7 @@ public final class RunnableCallableInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface())
.and(safeHasInterface(named(Runnable.class.getName()).or(named(Callable.class.getName()))));
.and(hasInterface(named(Runnable.class.getName()).or(named(Callable.class.getName()))));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.java.concurrent;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -43,7 +43,7 @@ public final class ScalaForkJoinTaskInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeExtendsClass(named(TASK_CLASS_NAME)));
return not(isInterface()).and(extendsClass(named(TASK_CLASS_NAME)));
}
@Override

View File

@ -1,8 +1,8 @@
package datadog.trace.instrumentation.jaxrs1;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.hasSuperMethod;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasSuperMethod;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeHasSuperType;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jaxrs2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -31,7 +31,7 @@ public abstract class AbstractRequestContextInstrumentation extends Instrumenter
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface())
.and(safeHasInterface(named("javax.ws.rs.container.ContainerRequestContext")));
.and(hasInterface(named("javax.ws.rs.container.ContainerRequestContext")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jaxrs2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -33,7 +33,7 @@ public class ContainerRequestFilterInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher<? super TypeDescription> typeMatcher() {
return not(isInterface())
.and(safeHasInterface(named("javax.ws.rs.container.ContainerRequestFilter")));
.and(hasInterface(named("javax.ws.rs.container.ContainerRequestFilter")));
}
@Override

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.jaxrs2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.hasSuperMethod;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasSuperMethod;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeHasSuperType;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jaxrs2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.instrumentation.jaxrs2.JaxRsAnnotationsDecorator.DECORATE;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
@ -35,7 +35,7 @@ public final class JaxRsAsyncResponseInstrumentation extends Instrumenter.Defaul
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeHasInterface(named("javax.ws.rs.container.AsyncResponse"));
return hasInterface(named("javax.ws.rs.container.AsyncResponse"));
}
@Override

View File

@ -1,8 +1,8 @@
package datadog.trace.instrumentation.jaxrs.v1;
import static datadog.trace.agent.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -36,7 +36,7 @@ public final class JaxRsClientV1Instrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeHasInterface(named("com.sun.jersey.api.client.ClientHandler"));
return hasInterface(named("com.sun.jersey.api.client.ClientHandler"));
}
@Override
@ -54,10 +54,8 @@ public final class JaxRsClientV1Instrumentation extends Instrumenter.Default {
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
return singletonMap(
named("handle")
.and(
takesArgument(
0, safeExtendsClass(named("com.sun.jersey.api.client.ClientRequest"))))
.and(returns(safeExtendsClass(named("com.sun.jersey.api.client.ClientResponse")))),
.and(takesArgument(0, extendsClass(named("com.sun.jersey.api.client.ClientRequest"))))
.and(returns(extendsClass(named("com.sun.jersey.api.client.ClientResponse")))),
JaxRsClientV1Instrumentation.class.getName() + "$HandleAdvice");
}

View File

@ -1,7 +1,7 @@
package datadog.trace.instrumentation.jaxrs;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.returns;
@ -25,7 +25,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeExtendsClass(named("javax.ws.rs.client.ClientBuilder"));
return extendsClass(named("javax.ws.rs.client.ClientBuilder"));
}
@Override
@ -44,7 +44,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default {
@Override
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
return singletonMap(
named("build").and(returns(safeHasInterface(named("javax.ws.rs.client.Client")))),
named("build").and(returns(hasInterface(named("javax.ws.rs.client.Client")))),
JaxRsClientInstrumentation.class.getName() + "$ClientBuilderAdvice");
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
@ -27,7 +27,7 @@ public final class ConnectionInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("java.sql.Connection")));
return not(isInterface()).and(hasInterface(named("java.sql.Connection")));
}
@Override
@ -43,7 +43,7 @@ public final class ConnectionInstrumentation extends Instrumenter.Default {
nameStartsWith("prepare")
.and(takesArgument(0, String.class))
// Also include CallableStatement, which is a sub type of PreparedStatement
.and(returns(safeHasInterface(named("java.sql.PreparedStatement")))),
.and(returns(hasInterface(named("java.sql.PreparedStatement")))),
ConnectionInstrumentation.class.getName() + "$ConnectionPrepareAdvice");
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -42,7 +42,7 @@ public final class DataSourceInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("javax.sql.DataSource")));
return not(isInterface()).and(hasInterface(named("javax.sql.DataSource")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
@ -30,7 +30,7 @@ public final class DriverInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("java.sql.Driver")));
return not(isInterface()).and(hasInterface(named("java.sql.Driver")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.jdbc.JDBCDecorator.DECORATE;
@ -35,7 +35,7 @@ public final class PreparedStatementInstrumentation extends Instrumenter.Default
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("java.sql.PreparedStatement")));
return not(isInterface()).and(hasInterface(named("java.sql.PreparedStatement")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.jdbc.JDBCDecorator.DECORATE;
@ -35,7 +35,7 @@ public final class StatementInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("java.sql.Statement")));
return not(isInterface()).and(hasInterface(named("java.sql.Statement")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jetty8;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
@ -30,7 +30,7 @@ public final class JettyHandlerInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface())
.and(safeHasInterface(named("org.eclipse.jetty.server.Handler")))
.and(hasInterface(named("org.eclipse.jetty.server.Handler")))
.and(not(named("org.eclipse.jetty.server.handler.HandlerWrapper")));
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jms;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -37,7 +37,7 @@ public final class JMSMessageConsumerInstrumentation extends Instrumenter.Defaul
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("javax.jms.MessageConsumer")));
return not(isInterface()).and(hasInterface(named("javax.jms.MessageConsumer")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jms;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -35,7 +35,7 @@ public final class JMSMessageListenerInstrumentation extends Instrumenter.Defaul
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("javax.jms.MessageListener")));
return not(isInterface()).and(hasInterface(named("javax.jms.MessageListener")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jms;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -37,7 +37,7 @@ public final class JMSMessageProducerInstrumentation extends Instrumenter.Defaul
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("javax.jms.MessageProducer")));
return not(isInterface()).and(hasInterface(named("javax.jms.MessageProducer")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.jsp;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.jsp.JSPDecorator.DECORATE;
@ -31,7 +31,7 @@ public final class JSPInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("javax.servlet.jsp.HttpJspPage")));
return not(isInterface()).and(hasInterface(named("javax.servlet.jsp.HttpJspPage")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.netty40;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static java.util.Collections.singletonMap;
@ -35,8 +35,7 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface())
.and(safeHasInterface(named("io.netty.channel.ChannelFutureListener")));
return not(isInterface()).and(hasInterface(named("io.netty.channel.ChannelFutureListener")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.netty40;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -48,7 +48,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("io.netty.channel.ChannelPipeline")));
return not(isInterface()).and(hasInterface(named("io.netty.channel.ChannelPipeline")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.netty41;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static java.util.Collections.singletonMap;
@ -35,8 +35,7 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface())
.and(safeHasInterface(named("io.netty.channel.ChannelFutureListener")));
return not(isInterface()).and(hasInterface(named("io.netty.channel.ChannelFutureListener")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.netty41;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -48,7 +48,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("io.netty.channel.ChannelPipeline")));
return not(isInterface()).and(hasInterface(named("io.netty.channel.ChannelPipeline")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.play24;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.returns;
@ -22,7 +22,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeHasInterface(named("play.api.mvc.Action"));
return hasInterface(named("play.api.mvc.Action"));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.play26;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.returns;
@ -22,7 +22,7 @@ public final class PlayInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return safeHasInterface(named("play.api.mvc.Action"));
return hasInterface(named("play.api.mvc.Action"));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.playws1;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.playws1.HeadersInjectAdapter.SETTER;
@ -36,7 +36,7 @@ public class PlayWSClientInstrumentation extends Instrumenter.Default {
// It also delegates to another AsyncHttpClient
return nameStartsWith("play.")
.<TypeDescription>and(
safeHasInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient"))
hasInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient"))
.and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient"))));
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.playws21;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.playws21.HeadersInjectAdapter.SETTER;
@ -33,7 +33,7 @@ public class PlayWSClientInstrumentation extends Instrumenter.Default {
public ElementMatcher<? super TypeDescription> typeMatcher() {
// CachingAsyncHttpClient rejects overrides to AsyncHandler
// It also delegates to another AsyncHttpClient
return safeHasInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient"))
return hasInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient"))
.and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient")));
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.playws2;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.playws2.HeadersInjectAdapter.SETTER;
@ -33,7 +33,7 @@ public class PlayWSClientInstrumentation extends Instrumenter.Default {
public ElementMatcher<? super TypeDescription> typeMatcher() {
// CachingAsyncHttpClient rejects overrides to AsyncHandler
// It also delegates to another AsyncHttpClient
return safeHasInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient"))
return hasInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient"))
.and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient")));
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.rabbitmq.amqp;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.noopSpan;
@ -56,7 +56,7 @@ public class RabbitChannelInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("com.rabbitmq.client.Channel")));
return not(isInterface()).and(hasInterface(named("com.rabbitmq.client.Channel")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.rabbitmq.amqp;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.instrumentation.rabbitmq.amqp.RabbitDecorator.DECORATE;
import static java.util.Collections.singletonMap;
@ -28,7 +28,7 @@ public class RabbitCommandInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeHasInterface(named("com.rabbitmq.client.Command")));
return not(isInterface()).and(hasInterface(named("com.rabbitmq.client.Command")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.ratpack;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
@ -27,7 +27,7 @@ public final class ContinuationInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<? super TypeDescription> typeMatcher() {
return nameStartsWith("ratpack.exec.")
.<TypeDescription>and(safeHasInterface(named("ratpack.exec.internal.Continuation")));
.<TypeDescription>and(hasInterface(named("ratpack.exec.internal.Continuation")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.ratpack;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasInterface;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.hasInterface;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -25,7 +25,7 @@ public class ServerErrorHandlerInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface().or(isAbstract()))
.and(safeHasInterface(named("ratpack.error.ServerErrorHandler")));
.and(hasInterface(named("ratpack.error.ServerErrorHandler")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.reactor.core;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isAbstract;
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -36,7 +36,7 @@ public final class FluxAndMonoInstrumentation extends Instrumenter.Default {
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isAbstract())
.and(
safeExtendsClass(
extendsClass(
named("reactor.core.publisher.Mono").or(named("reactor.core.publisher.Flux"))));
}

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.rmi.client;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
@ -33,7 +33,7 @@ public final class RmiClientInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeExtendsClass(named("sun.rmi.server.UnicastRef")));
return not(isInterface()).and(extendsClass(named("sun.rmi.server.UnicastRef")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.rmi.context.client;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.instrumentation.rmi.context.ContextPropagator.PROPAGATOR;
import static java.util.Collections.singletonMap;
@ -53,7 +53,7 @@ public class RmiClientContextInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<? super TypeDescription> typeMatcher() {
return not(isInterface()).and(safeExtendsClass(named("sun.rmi.transport.StreamRemoteCall")));
return not(isInterface()).and(extendsClass(named("sun.rmi.transport.StreamRemoteCall")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.rmi.context.server;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.instrumentation.rmi.context.ContextPropagator.DD_CONTEXT_CALL_ID;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -28,7 +28,7 @@ public class RmiServerContextInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<? super TypeDescription> typeMatcher() {
return not(isInterface()).and(safeExtendsClass(named("sun.rmi.transport.ObjectTable")));
return not(isInterface()).and(extendsClass(named("sun.rmi.transport.ObjectTable")));
}
@Override

View File

@ -1,6 +1,6 @@
package datadog.trace.instrumentation.rmi.server;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeExtendsClass;
import static datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.extendsClass;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.bootstrap.instrumentation.rmi.ThreadLocalContext.THREAD_LOCAL_CONTEXT;
@ -43,7 +43,7 @@ public final class RmiServerInstrumentation extends Instrumenter.Default {
@Override
public ElementMatcher<TypeDescription> typeMatcher() {
return not(isInterface()).and(safeExtendsClass(named("java.rmi.server.RemoteServer")));
return not(isInterface()).and(extendsClass(named("java.rmi.server.RemoteServer")));
}
@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 datadog.trace.agent.tooling.bytebuddy.matcher.DDElementMatchers.safeHasSuperType;
import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;

Some files were not shown because too many files have changed in this diff Show More