Cache couchbase operation attribute values per method (#3819)
* Cache couchbase operation attribute values per method * avoid using reflection * spotless
This commit is contained in:
parent
d9080a745b
commit
3ea22bb3ed
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Map<String, String>> methodOperationNames =
|
||||
new ClassValue<Map<String, String>>() {
|
||||
@Override
|
||||
protected Map<String, String> 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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue