Use `safeHasSuperType` instead of `isSubType`

`isSubType` may fail on certain class lookup problems, even on classes
unrelated to given instrumentation, preventing instrumentation from
being applied.
This commit is contained in:
Nikolay Martynov 2018-07-30 16:37:18 -04:00
parent 6693a93485
commit c66bd24d3a
5 changed files with 17 additions and 16 deletions

View File

@ -1,7 +1,6 @@
package datadog.trace.instrumentation.classloaders; package datadog.trace.instrumentation.classloaders;
import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
import static net.bytebuddy.matcher.ElementMatchers.isSubTypeOf;
import com.google.auto.service.AutoService; import com.google.auto.service.AutoService;
import datadog.opentracing.DDTracer; import datadog.opentracing.DDTracer;
@ -28,12 +27,12 @@ public final class ClassLoaderInstrumentation extends Instrumenter.Default {
@Override @Override
public ElementMatcher typeMatcher() { public ElementMatcher typeMatcher() {
return isSubTypeOf(ClassLoader.class); return safeHasSuperType(named("java.lang.ClassLoader"));
} }
@Override @Override
public Map<ElementMatcher, String> transformers() { public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>(); final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put(isConstructor(), ClassloaderAdvice.class.getName()); transformers.put(isConstructor(), ClassloaderAdvice.class.getName());
return transformers; return transformers;
} }

View File

@ -1,9 +1,9 @@
package datadog.trace.instrumentation.http_url_connection; package datadog.trace.instrumentation.http_url_connection;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static io.opentracing.log.Fields.ERROR_OBJECT; import static io.opentracing.log.Fields.ERROR_OBJECT;
import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.isSubTypeOf;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.not;
@ -43,7 +43,7 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
@Override @Override
public ElementMatcher typeMatcher() { public ElementMatcher typeMatcher() {
return isSubTypeOf(HttpURLConnection.class) return safeHasSuperType(named("java.net.HttpURLConnection"))
// This class is a simple delegator. Skip because it does not update its `connected` field. // 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(not(named("sun.net.www.protocol.https.HttpsURLConnectionImpl")));
} }
@ -58,7 +58,7 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
@Override @Override
public Map<ElementMatcher, String> transformers() { public Map<ElementMatcher, String> transformers() {
Map<ElementMatcher, String> transformers = new HashMap<>(); final Map<ElementMatcher, String> transformers = new HashMap<>();
transformers.put( transformers.put(
isMethod() isMethod()
.and(isPublic()) .and(isPublic())
@ -177,7 +177,7 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
private static final Map<HttpURLConnection, HttpURLState> STATE_MAP = private static final Map<HttpURLConnection, HttpURLState> STATE_MAP =
Collections.synchronizedMap(new WeakHashMap<HttpURLConnection, HttpURLState>()); Collections.synchronizedMap(new WeakHashMap<HttpURLConnection, HttpURLState>());
public static HttpURLState get(HttpURLConnection connection) { public static HttpURLState get(final HttpURLConnection connection) {
HttpURLState state = STATE_MAP.get(connection); HttpURLState state = STATE_MAP.get(connection);
if (state == null) { if (state == null) {
// not thread-safe, but neither is HttpURLConnection // not thread-safe, but neither is HttpURLConnection
@ -195,8 +195,8 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default {
return hasDoneIO; return hasDoneIO;
} }
public void setHasDoneIO(boolean value) { public void setHasDoneIO(final boolean value) {
this.hasDoneIO = value; hasDoneIO = value;
} }
} }
} }

View File

@ -1,8 +1,9 @@
package datadog.trace.instrumentation.jdbc; package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static net.bytebuddy.matcher.ElementMatchers.isInterface; import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isSubTypeOf;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.not;
import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.returns;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
@ -10,7 +11,6 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import com.google.auto.service.AutoService; import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.bootstrap.JDBCMaps; import datadog.trace.bootstrap.JDBCMaps;
import java.sql.Connection;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -26,7 +26,7 @@ public final class ConnectionInstrumentation extends Instrumenter.Default {
@Override @Override
public ElementMatcher typeMatcher() { public ElementMatcher typeMatcher() {
return not(isInterface()).and(isSubTypeOf(Connection.class)); return not(isInterface()).and(safeHasSuperType(named("java.sql.Connection")));
} }
@Override @Override

View File

@ -1,10 +1,11 @@
package datadog.trace.instrumentation.jdbc; package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static io.opentracing.log.Fields.ERROR_OBJECT; import static io.opentracing.log.Fields.ERROR_OBJECT;
import static net.bytebuddy.matcher.ElementMatchers.isInterface; import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.isSubTypeOf;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.not;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
@ -36,7 +37,7 @@ public final class PreparedStatementInstrumentation extends Instrumenter.Default
@Override @Override
public ElementMatcher typeMatcher() { public ElementMatcher typeMatcher() {
return not(isInterface()).and(isSubTypeOf(PreparedStatement.class)); return not(isInterface()).and(safeHasSuperType(named("java.sql.PreparedStatement")));
} }
@Override @Override

View File

@ -1,10 +1,11 @@
package datadog.trace.instrumentation.jdbc; package datadog.trace.instrumentation.jdbc;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static io.opentracing.log.Fields.ERROR_OBJECT; import static io.opentracing.log.Fields.ERROR_OBJECT;
import static net.bytebuddy.matcher.ElementMatchers.isInterface; import static net.bytebuddy.matcher.ElementMatchers.isInterface;
import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.isSubTypeOf;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.not;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
@ -37,7 +38,7 @@ public final class StatementInstrumentation extends Instrumenter.Default {
@Override @Override
public ElementMatcher typeMatcher() { public ElementMatcher typeMatcher() {
return not(isInterface()).and(isSubTypeOf(Statement.class)); return not(isInterface()).and(safeHasSuperType(named("java.sql.Statement")));
} }
@Override @Override