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:
parent
6693a93485
commit
c66bd24d3a
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue