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 21e37e919a23..d4d02ded51a0 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 @@ -19,6 +19,7 @@ import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import rx.Observable; @@ -46,24 +47,26 @@ public void transform(TypeTransformer transformer) { public static class CouchbaseClientAdvice { @Advice.OnMethodEnter - public static void trackCallDepth(@Advice.Local("otelCallDepth") CallDepth callDepth) { - callDepth = CallDepth.forClass(CouchbaseCluster.class); + public static CallDepth trackCallDepth() { + CallDepth callDepth = CallDepth.forClass(CouchbaseCluster.class); callDepth.getAndIncrement(); + return callDepth; } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void subscribeResult( + public static Observable subscribeResult( @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) { + @Advice.Return Observable result, + @Advice.Enter CallDepth callDepth) { if (callDepth.decrementAndGet() > 0) { - return; + return result; } CouchbaseRequestInfo request = CouchbaseRequestInfo.create(bucket, declaringClass, methodName); - result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request)); + return Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request)); } } @@ -71,28 +74,30 @@ public static void subscribeResult( public static class CouchbaseClientQueryAdvice { @Advice.OnMethodEnter - public static void trackCallDepth(@Advice.Local("otelCallDepth") CallDepth callDepth) { - callDepth = CallDepth.forClass(CouchbaseCluster.class); + public static CallDepth trackCallDepth() { + CallDepth callDepth = CallDepth.forClass(CouchbaseCluster.class); callDepth.getAndIncrement(); + return callDepth; } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class) - public static void subscribeResult( + public static Observable subscribeResult( @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, - @Advice.Local("otelCallDepth") CallDepth callDepth) { + @Advice.Return Observable result, + @Advice.Enter CallDepth callDepth) { if (callDepth.decrementAndGet() > 0) { - return; + return result; } CouchbaseRequestInfo request = query == null ? CouchbaseRequestInfo.create(bucket, declaringClass, methodName) : CouchbaseRequestInfo.create(bucket, query); - result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request)); + return 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 b1dceae135b8..6cc8ca558541 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 @@ -19,6 +19,7 @@ import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import rx.Observable; @@ -43,23 +44,25 @@ public void transform(TypeTransformer transformer) { public static class CouchbaseClientAdvice { @Advice.OnMethodEnter - public static void trackCallDepth(@Advice.Local("otelCallDepth") CallDepth callDepth) { - callDepth = CallDepth.forClass(CouchbaseCluster.class); + public static CallDepth trackCallDepth() { + CallDepth callDepth = CallDepth.forClass(CouchbaseCluster.class); callDepth.getAndIncrement(); + return callDepth; } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void subscribeResult( + public static Observable subscribeResult( @Advice.Origin("#t") Class declaringClass, @Advice.Origin("#m") String methodName, - @Advice.Return(readOnly = false) Observable result, - @Advice.Local("otelCallDepth") CallDepth callDepth) { + @Advice.Return Observable result, + @Advice.Enter CallDepth callDepth) { if (callDepth.decrementAndGet() > 0) { - return; + return result; } CouchbaseRequestInfo request = CouchbaseRequestInfo.create(null, declaringClass, methodName); - result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request)); + return 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/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java index 6fcde8978997..1bc0e582bca5 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java @@ -41,4 +41,9 @@ public String getModuleGroup() { public List injectedClassNames() { return singletonList("rx.OpenTelemetryTracingUtil"); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseCoreInstrumentation.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseCoreInstrumentation.java index 21868b89221a..e0ab0144e75a 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseCoreInstrumentation.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseCoreInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_6; +import static io.opentelemetry.javaagent.instrumentation.couchbase.v2_6.VirtualFieldHelper.COUCHBASE_REQUEST_INFO; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -12,7 +13,6 @@ import com.couchbase.client.core.message.CouchbaseRequest; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -43,9 +43,7 @@ public static class CouchbaseCoreAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void addOperationIdToSpan(@Advice.Argument(0) CouchbaseRequest request) { - VirtualField virtualField = - VirtualField.find(CouchbaseRequest.class, CouchbaseRequestInfo.class); - CouchbaseRequestInfo requestInfo = virtualField.get(request); + CouchbaseRequestInfo requestInfo = COUCHBASE_REQUEST_INFO.get(request); if (requestInfo != null) { return; } @@ -55,7 +53,7 @@ public static void addOperationIdToSpan(@Advice.Argument(0) CouchbaseRequest req if (requestInfo != null) { // The scope from the initial rxJava subscribe is not available to the networking layer // To transfer the request info it is added to the context store - virtualField.set(request, requestInfo); + COUCHBASE_REQUEST_INFO.set(request, requestInfo); requestInfo.setOperationId(request.operationId()); } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseInstrumentationModule.java index aa9ba653af9d..f7c6ad268c73 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseInstrumentationModule.java @@ -30,4 +30,9 @@ public List typeInstrumentations() { public String getModuleGroup() { return "couchbase"; } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseNetworkInstrumentation.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseNetworkInstrumentation.java index 4794b9fcaf2a..5049e5f540bb 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseNetworkInstrumentation.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseNetworkInstrumentation.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_6; +import static io.opentelemetry.javaagent.instrumentation.couchbase.v2_6.VirtualFieldHelper.COUCHBASE_REQUEST_INFO; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -12,7 +13,6 @@ import com.couchbase.client.core.message.CouchbaseRequest; import com.couchbase.client.deps.io.netty.channel.ChannelHandlerContext; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.couchbase.v2_0.CouchbaseRequestInfo; @@ -51,10 +51,7 @@ public static void addNetworkTagsToSpan( @Advice.Argument(0) ChannelHandlerContext channelHandlerContext, @Advice.Argument(1) CouchbaseRequest request) { - VirtualField virtualField = - VirtualField.find(CouchbaseRequest.class, CouchbaseRequestInfo.class); - - CouchbaseRequestInfo requestInfo = virtualField.get(request); + CouchbaseRequestInfo requestInfo = COUCHBASE_REQUEST_INFO.get(request); if (requestInfo != null) { requestInfo.setPeerAddress(channelHandlerContext.channel().remoteAddress()); requestInfo.setLocalAddress(localSocket); diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/VirtualFieldHelper.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/VirtualFieldHelper.java new file mode 100644 index 000000000000..306f07831c2f --- /dev/null +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/VirtualFieldHelper.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.couchbase.v2_6; + +import com.couchbase.client.core.message.CouchbaseRequest; +import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.javaagent.instrumentation.couchbase.v2_0.CouchbaseRequestInfo; + +public final class VirtualFieldHelper { + public static final VirtualField COUCHBASE_REQUEST_INFO = + VirtualField.find(CouchbaseRequest.class, CouchbaseRequestInfo.class); + + private VirtualFieldHelper() {} +} diff --git a/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java index 6f1d7cb3c40c..b4a5f49d2c11 100644 --- a/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-3.1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1_6/CouchbaseInstrumentationModule.java @@ -10,12 +10,14 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.Collections; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) -public class CouchbaseInstrumentationModule extends InstrumentationModule { +public class CouchbaseInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public CouchbaseInstrumentationModule() { super("couchbase", "couchbase-3.1.6"); } @@ -32,4 +34,9 @@ public ElementMatcher.Junction classLoaderMatcher() { public List typeInstrumentations() { return Collections.singletonList(new CouchbaseEnvironmentInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java index 0195e3a079ff..92663fd046f2 100644 --- a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java @@ -10,12 +10,14 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.Collections; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) -public class CouchbaseInstrumentationModule extends InstrumentationModule { +public class CouchbaseInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public CouchbaseInstrumentationModule() { super("couchbase", "couchbase-3.1"); } @@ -32,4 +34,9 @@ public ElementMatcher.Junction classLoaderMatcher() { public List typeInstrumentations() { return Collections.singletonList(new CouchbaseEnvironmentInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java index 54096711467f..4e87927a86d3 100644 --- a/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-3.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_2/CouchbaseInstrumentationModule.java @@ -10,12 +10,14 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.Collections; import java.util.List; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) -public class CouchbaseInstrumentationModule extends InstrumentationModule { +public class CouchbaseInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public CouchbaseInstrumentationModule() { super("couchbase", "couchbase-3.2"); } @@ -30,4 +32,9 @@ public ElementMatcher.Junction classLoaderMatcher() { public List typeInstrumentations() { return Collections.singletonList(new CouchbaseEnvironmentInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } }