Use more efficient namedOneOf where possible (#3200)

* Use more efficient namedOneOf where possible

* Fix - hasClassesNamed does and not or
This commit is contained in:
Trask Stalnaker 2021-06-06 19:41:34 -07:00 committed by GitHub
parent 5faa39b597
commit cefaecab3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 53 additions and 52 deletions

View File

@ -11,7 +11,7 @@ import static io.opentelemetry.javaagent.instrumentation.extannotations.External
import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; import static net.bytebuddy.matcher.ElementMatchers.declaresMethod;
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.none; import static net.bytebuddy.matcher.ElementMatchers.none;
import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.not;
@ -82,18 +82,11 @@ public class ExternalAnnotationInstrumentation implements TypeInstrumentation {
traceAnnotationMatcher = none(); traceAnnotationMatcher = none();
} else { } else {
ElementMatcher.Junction<ClassLoader> classLoaderMatcher = none(); ElementMatcher.Junction<ClassLoader> classLoaderMatcher = none();
ElementMatcher.Junction<NamedElement> methodTraceMatcher = none();
for (String annotationName : additionalTraceAnnotations) { for (String annotationName : additionalTraceAnnotations) {
if (methodTraceMatcher == null) {
classLoaderMatcher = hasClassesNamed(annotationName);
methodTraceMatcher = named(annotationName);
} else {
classLoaderMatcher = classLoaderMatcher.or(hasClassesNamed(annotationName)); classLoaderMatcher = classLoaderMatcher.or(hasClassesNamed(annotationName));
methodTraceMatcher = methodTraceMatcher.or(named(annotationName));
}
} }
this.classLoaderOptimization = classLoaderMatcher; this.classLoaderOptimization = classLoaderMatcher;
this.traceAnnotationMatcher = methodTraceMatcher; this.traceAnnotationMatcher = namedOneOf(additionalTraceAnnotations.toArray(new String[0]));
} }
excludedMethodsMatcher = configureExcludedMethods(); excludedMethodsMatcher = configureExcludedMethods();

View File

@ -12,6 +12,7 @@ import static io.opentelemetry.javaagent.instrumentation.geode.GeodeInstrumenter
import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
@ -40,22 +41,23 @@ public class GeodeRegionInstrumentation implements TypeInstrumentation {
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
isMethod() isMethod()
.and( .and(
named("clear") namedOneOf(
"clear",
"create",
"destroy",
"entrySet",
"get",
"getAll",
"invalidate",
"replace")
.or(nameStartsWith("contains")) .or(nameStartsWith("contains"))
.or(named("create"))
.or(named("destroy"))
.or(named("entrySet"))
.or(named("get"))
.or(named("getAll"))
.or(named("invalidate"))
.or(nameStartsWith("keySet")) .or(nameStartsWith("keySet"))
.or(nameStartsWith("put")) .or(nameStartsWith("put"))
.or(nameStartsWith("remove")) .or(nameStartsWith("remove"))),
.or(named("replace"))),
this.getClass().getName() + "$SimpleAdvice"); this.getClass().getName() + "$SimpleAdvice");
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
isMethod() isMethod()
.and(named("existsValue").or(named("query")).or(named("selectValue"))) .and(namedOneOf("existsValue", "query", "selectValue"))
.and(takesArgument(0, String.class)), .and(takesArgument(0, String.class)),
this.getClass().getName() + "$QueryAdvice"); this.getClass().getName() + "$QueryAdvice");
} }

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.jaxrsclient.v2_0;
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.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -35,7 +36,7 @@ public class JerseyClientConnectionErrorInstrumentation implements TypeInstrumen
this.getClass().getName() + "$InvokeAdvice"); this.getClass().getName() + "$InvokeAdvice");
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
isMethod() isMethod()
.and(named("submit").or(named("createRunnableForAsyncProcessing"))) .and(namedOneOf("submit", "createRunnableForAsyncProcessing"))
.and(takesArgument(0, named("org.glassfish.jersey.client.ClientRequest"))) .and(takesArgument(0, named("org.glassfish.jersey.client.ClientRequest")))
.and(takesArgument(1, named("org.glassfish.jersey.client.ResponseCallback"))), .and(takesArgument(1, named("org.glassfish.jersey.client.ResponseCallback"))),
this.getClass().getName() + "$SubmitAdvice"); this.getClass().getName() + "$SubmitAdvice");

View File

@ -6,6 +6,7 @@
package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -29,8 +30,9 @@ public class JerseyResourceMethodDispatcherInstrumentation implements TypeInstru
.and( .and(
takesArgument( takesArgument(
1, 1,
named("javax.ws.rs.core.Request") namedOneOf(
.or(named("org.glassfish.jersey.server.ContainerRequest")))), "javax.ws.rs.core.Request",
"org.glassfish.jersey.server.ContainerRequest"))),
JerseyResourceMethodDispatcherInstrumentation.class.getName() + "$DispatchAdvice"); JerseyResourceMethodDispatcherInstrumentation.class.getName() + "$DispatchAdvice");
} }

View File

@ -6,6 +6,7 @@
package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -33,8 +34,9 @@ public class ResteasyRootNodeTypeInstrumentation implements TypeInstrumentation
.and( .and(
takesArgument( takesArgument(
1, 1,
named("org.jboss.resteasy.core.ResourceInvoker") namedOneOf(
.or(named("org.jboss.resteasy.spi.ResourceInvoker")))), "org.jboss.resteasy.core.ResourceInvoker",
"org.jboss.resteasy.spi.ResourceInvoker"))),
ResteasyRootNodeTypeInstrumentation.class.getName() + "$AddInvokerAdvice"); ResteasyRootNodeTypeInstrumentation.class.getName() + "$AddInvokerAdvice");
} }

View File

@ -6,6 +6,7 @@
package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines; package io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -24,13 +25,11 @@ public class KotlinCoroutinesInstrumentation implements TypeInstrumentation {
@Override @Override
public void transform(TypeTransformer transformer) { public void transform(TypeTransformer transformer) {
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
named("launch") namedOneOf("launch", "launch$default")
.or(named("launch$default"))
.and(takesArgument(1, named("kotlin.coroutines.CoroutineContext"))), .and(takesArgument(1, named("kotlin.coroutines.CoroutineContext"))),
this.getClass().getName() + "$LaunchAdvice"); this.getClass().getName() + "$LaunchAdvice");
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
named("runBlocking") namedOneOf("runBlocking", "runBlocking$default")
.or(named("runBlocking$default"))
.and(takesArgument(0, named("kotlin.coroutines.CoroutineContext"))), .and(takesArgument(0, named("kotlin.coroutines.CoroutineContext"))),
this.getClass().getName() + "$RunBlockingAdvice"); this.getClass().getName() + "$RunBlockingAdvice");
} }

View File

@ -13,6 +13,7 @@ import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.ha
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.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.ILoggingEvent;
@ -45,7 +46,7 @@ public class LoggingEventInstrumentation implements TypeInstrumentation {
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
isMethod() isMethod()
.and(isPublic()) .and(isPublic())
.and(named("getMDCPropertyMap").or(named("getMdc"))) .and(namedOneOf("getMDCPropertyMap", "getMdc"))
.and(takesArguments(0)), .and(takesArguments(0)),
LoggingEventInstrumentation.class.getName() + "$GetMdcAdvice"); LoggingEventInstrumentation.class.getName() + "$GetMdcAdvice");
} }

View File

@ -10,6 +10,7 @@ import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.ha
import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext; import static io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge.currentContext;
import static io.opentelemetry.javaagent.instrumentation.methods.MethodInstrumenters.instrumenter; import static io.opentelemetry.javaagent.instrumentation.methods.MethodInstrumenters.instrumenter;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import io.opentelemetry.context.Context; import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope; import io.opentelemetry.context.Scope;
@ -18,7 +19,6 @@ import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Set; import java.util.Set;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher;
@ -43,17 +43,9 @@ public class MethodInstrumentation implements TypeInstrumentation {
@Override @Override
public void transform(TypeTransformer transformer) { public void transform(TypeTransformer transformer) {
ElementMatcher.Junction<MethodDescription> methodMatchers = null;
for (String methodName : methodNames) {
if (methodMatchers == null) {
methodMatchers = named(methodName);
} else {
methodMatchers = methodMatchers.or(named(methodName));
}
}
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
methodMatchers, MethodInstrumentation.class.getName() + "$MethodAdvice"); namedOneOf(methodNames.toArray(new String[0])),
MethodInstrumentation.class.getName() + "$MethodAdvice");
} }
public static class MethodAdvice { public static class MethodAdvice {

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.mongo.v3_7;
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.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import com.mongodb.async.SingleResultCallback; import com.mongodb.async.SingleResultCallback;
@ -22,8 +23,8 @@ final class BaseClusterInstrumentation implements TypeInstrumentation {
@Override @Override
public ElementMatcher<TypeDescription> typeMatcher() { public ElementMatcher<TypeDescription> typeMatcher() {
return named("com.mongodb.connection.BaseCluster") return namedOneOf(
.or(named("com.mongodb.internal.connection.BaseCluster")); "com.mongodb.connection.BaseCluster", "com.mongodb.internal.connection.BaseCluster");
} }
@Override @Override

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.netty.v4_0;
import static io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.NettyHttpServerTracer.tracer; import static io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.NettyHttpServerTracer.tracer;
import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -22,8 +23,9 @@ public class AbstractChannelHandlerContextInstrumentation implements TypeInstrum
@Override @Override
public ElementMatcher<TypeDescription> typeMatcher() { public ElementMatcher<TypeDescription> typeMatcher() {
// Different classes depending on Netty version // Different classes depending on Netty version
return named("io.netty.channel.AbstractChannelHandlerContext") return namedOneOf(
.or(named("io.netty.channel.DefaultChannelHandlerContext")); "io.netty.channel.AbstractChannelHandlerContext",
"io.netty.channel.DefaultChannelHandlerContext");
} }
@Override @Override

View File

@ -9,6 +9,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.
import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed;
import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -38,7 +39,7 @@ public class ChannelInstrumentation implements TypeInstrumentation {
@Override @Override
public void transform(TypeTransformer transformer) { public void transform(TypeTransformer transformer) {
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
isMethod().and(named("write").or(named("writeAndFlush"))), isMethod().and(namedOneOf("write", "writeAndFlush")),
ChannelInstrumentation.class.getName() + "$AttachContextAdvice"); ChannelInstrumentation.class.getName() + "$AttachContextAdvice");
} }

View File

@ -9,6 +9,7 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.
import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed;
import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isMethod;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import io.netty.channel.Channel; import io.netty.channel.Channel;
import io.opentelemetry.instrumentation.netty.v4_1.AttributeKeys; import io.opentelemetry.instrumentation.netty.v4_1.AttributeKeys;
@ -39,7 +40,7 @@ public class ChannelInstrumentation implements TypeInstrumentation {
@Override @Override
public void transform(TypeTransformer transformer) { public void transform(TypeTransformer transformer) {
transformer.applyAdviceToMethod( transformer.applyAdviceToMethod(
isMethod().and(named("write").or(named("writeAndFlush"))), isMethod().and(namedOneOf("write", "writeAndFlush")),
ChannelInstrumentation.class.getName() + "$AttachContextAdvice"); ChannelInstrumentation.class.getName() + "$AttachContextAdvice");
} }

View File

@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.spring.batch.chunk;
import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -24,10 +25,11 @@ public class StepBuilderInstrumentation implements TypeInstrumentation {
@Override @Override
public ElementMatcher<TypeDescription> typeMatcher() { public ElementMatcher<TypeDescription> typeMatcher() {
// Spring Batch Java DSL and XML config // Spring Batch Java DSL and XML config
return named("org.springframework.batch.core.step.builder.AbstractTaskletStepBuilder") return namedOneOf(
"org.springframework.batch.core.step.builder.AbstractTaskletStepBuilder",
// JSR-352 XML config // JSR-352 XML config
.or(named("org.springframework.batch.core.jsr.step.builder.JsrSimpleStepBuilder")) "org.springframework.batch.core.jsr.step.builder.JsrSimpleStepBuilder",
.or(named("org.springframework.batch.core.jsr.step.builder.JsrBatchletStepBuilder")); "org.springframework.batch.core.jsr.step.builder.JsrBatchletStepBuilder");
} }
@Override @Override

View File

@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.vertx.reactive;
import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.ClassLoaderMatcher.hasClassesNamed;
import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
@ -31,8 +32,9 @@ public class AsyncResultSingleInstrumentation implements TypeInstrumentation {
@Override @Override
public ElementMatcher<TypeDescription> typeMatcher() { public ElementMatcher<TypeDescription> typeMatcher() {
return named("io.vertx.reactivex.core.impl.AsyncResultSingle") return namedOneOf(
.or(named("io.vertx.reactivex.impl.AsyncResultSingle")); "io.vertx.reactivex.core.impl.AsyncResultSingle",
"io.vertx.reactivex.impl.AsyncResultSingle");
} }
@Override @Override