diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseBucketInstrumentation.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseBucketInstrumentation.java index 83f4b30a15..1d13b9449f 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseBucketInstrumentation.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseBucketInstrumentation.java @@ -18,7 +18,6 @@ import io.opentelemetry.instrumentation.rxjava.TracedOnSubscribe; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.api.CallDepth; -import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -54,14 +53,15 @@ public class CouchbaseBucketInstrumentation implements TypeInstrumentation { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void subscribeResult( - @Advice.Origin Method method, + @Advice.Origin("#t") Class declaringClass, + @Advice.Origin("#m") String methodName, @Advice.FieldValue("bucket") String bucket, @Advice.Return(readOnly = false) Observable result, @Advice.Local("otelCallDepth") CallDepth callDepth) { if (callDepth.decrementAndGet() > 0) { return; } - CouchbaseRequest request = CouchbaseRequest.create(bucket, method); + CouchbaseRequest request = CouchbaseRequest.create(bucket, declaringClass, methodName); result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request)); } } @@ -77,7 +77,8 @@ public class CouchbaseBucketInstrumentation implements TypeInstrumentation { @Advice.OnMethodExit(onThrowable = Throwable.class) public static void subscribeResult( - @Advice.Origin Method method, + @Advice.Origin("#t") Class declaringClass, + @Advice.Origin("#m") String methodName, @Advice.FieldValue("bucket") String bucket, @Advice.Argument(value = 0, optional = true) Object query, @Advice.Return(readOnly = false) Observable result, @@ -88,7 +89,7 @@ public class CouchbaseBucketInstrumentation implements TypeInstrumentation { CouchbaseRequest request = query == null - ? CouchbaseRequest.create(bucket, method) + ? CouchbaseRequest.create(bucket, declaringClass, methodName) : CouchbaseRequest.create(bucket, query); result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request)); } diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClusterInstrumentation.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClusterInstrumentation.java index 57b4de72af..b8c412ce27 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClusterInstrumentation.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClusterInstrumentation.java @@ -18,7 +18,6 @@ import io.opentelemetry.instrumentation.rxjava.TracedOnSubscribe; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.api.CallDepth; -import java.lang.reflect.Method; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -51,14 +50,15 @@ public class CouchbaseClusterInstrumentation implements TypeInstrumentation { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void subscribeResult( - @Advice.Origin Method method, + @Advice.Origin("#t") Class declaringClass, + @Advice.Origin("#m") String methodName, @Advice.Return(readOnly = false) Observable result, @Advice.Local("otelCallDepth") CallDepth callDepth) { if (callDepth.decrementAndGet() > 0) { return; } - CouchbaseRequest request = CouchbaseRequest.create(null, method); + CouchbaseRequest request = CouchbaseRequest.create(null, declaringClass, methodName); result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request)); } } diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseRequest.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseRequest.java index abb88678b6..e87c7ab9a7 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseRequest.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseRequest.java @@ -7,18 +7,27 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0; import com.google.auto.value.AutoValue; import io.opentelemetry.instrumentation.api.db.SqlStatementInfo; -import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nullable; @AutoValue public abstract class CouchbaseRequest { - public static CouchbaseRequest create(@Nullable String bucket, Method method) { - Class declaringClass = method.getDeclaringClass(); - String className = - declaringClass.getSimpleName().replace("CouchbaseAsync", "").replace("DefaultAsync", ""); - String operation = className + "." + method.getName(); + private static final ClassValue> methodOperationNames = + new ClassValue>() { + @Override + protected Map computeValue(Class type) { + return new ConcurrentHashMap<>(); + } + }; + public static CouchbaseRequest create( + @Nullable String bucket, Class declaringClass, String methodName) { + String operation = + methodOperationNames + .get(declaringClass) + .computeIfAbsent(methodName, m -> computeOperation(declaringClass, m)); return new AutoValue_CouchbaseRequest(bucket, null, operation, true); } @@ -29,6 +38,12 @@ public abstract class CouchbaseRequest { bucket, statement.getFullStatement(), statement.getOperation(), false); } + private static String computeOperation(Class declaringClass, String methodName) { + String className = + declaringClass.getSimpleName().replace("CouchbaseAsync", "").replace("DefaultAsync", ""); + return className + "." + methodName; + } + @Nullable public abstract String bucket();