diff --git a/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisCommandDataInstrumentation.java b/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisCommandDataInstrumentation.java index 40d0f0ee3ddd..ed7a8ba4ab0c 100644 --- a/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisCommandDataInstrumentation.java +++ b/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisCommandDataInstrumentation.java @@ -15,6 +15,8 @@ import io.opentelemetry.javaagent.instrumentation.redisson.CompletableFutureWrapper; import java.util.concurrent.CompletableFuture; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; +import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import org.redisson.misc.RPromise; @@ -42,19 +44,21 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class WrapPromiseAdvice { + @AssignReturned.ToArguments(@ToArgument(0)) @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter(@Advice.Argument(value = 0, readOnly = false) RPromise promise) { - promise = RedissonPromiseWrapper.wrap(promise); + public static RPromise onEnter(@Advice.Argument(0) RPromise promise) { + return RedissonPromiseWrapper.wrap(promise); } } @SuppressWarnings("unused") public static class WrapCompletableFutureAdvice { + @AssignReturned.ToArguments(@ToArgument(0)) @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.Argument(value = 0, readOnly = false) CompletableFuture completableFuture) { - completableFuture = CompletableFutureWrapper.wrap(completableFuture); + public static CompletableFuture onEnter( + @Advice.Argument(0) CompletableFuture completableFuture) { + return CompletableFutureWrapper.wrap(completableFuture); } } } diff --git a/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisConnectionInstrumentation.java b/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisConnectionInstrumentation.java index b414cf17a871..4b3ea9923278 100644 --- a/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisConnectionInstrumentation.java +++ b/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisConnectionInstrumentation.java @@ -18,6 +18,7 @@ import io.opentelemetry.javaagent.instrumentation.redisson.PromiseWrapper; import io.opentelemetry.javaagent.instrumentation.redisson.RedissonRequest; import java.net.InetSocketAddress; +import javax.annotation.Nullable; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -38,47 +39,63 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class SendAdvice { - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.This RedisConnection connection, - @Advice.Argument(0) Object arg, - @Advice.Local("otelRequest") RedissonRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { + public static class AdviceScope { + private final RedissonRequest request; + private final Context context; + private final Scope scope; - Context parentContext = currentContext(); - InetSocketAddress remoteAddress = (InetSocketAddress) connection.getChannel().remoteAddress(); - request = RedissonRequest.create(remoteAddress, arg); - PromiseWrapper promise = request.getPromiseWrapper(); - if (promise == null) { - return; + private AdviceScope(RedissonRequest request, Context context, Scope scope) { + this.request = request; + this.context = context; + this.scope = scope; } - if (!instrumenter().shouldStart(parentContext, request)) { - return; + + @Nullable + public static AdviceScope start(RedisConnection connection, Object arg) { + InetSocketAddress remoteAddress = + (InetSocketAddress) connection.getChannel().remoteAddress(); + RedissonRequest request = RedissonRequest.create(remoteAddress, arg); + PromiseWrapper promise = request.getPromiseWrapper(); + if (promise == null) { + return null; + } + Context parentContext = currentContext(); + if (!instrumenter().shouldStart(parentContext, request)) { + return null; + } + + Context context = instrumenter().start(parentContext, request); + Scope scope = context.makeCurrent(); + + promise.setEndOperationListener( + new EndOperationListener<>(instrumenter(), context, request)); + return new AdviceScope(request, context, scope); } - context = instrumenter().start(parentContext, request); - scope = context.makeCurrent(); + public void end(@Nullable Throwable throwable) { + scope.close(); - promise.setEndOperationListener(new EndOperationListener<>(instrumenter(), context, request)); + if (throwable != null) { + instrumenter().end(context, request, null, throwable); + } + // span ended in EndOperationListener + } + } + + @Nullable + @Advice.OnMethodEnter(suppress = Throwable.class) + public static AdviceScope onEnter( + @Advice.This RedisConnection connection, @Advice.Argument(0) Object arg) { + return AdviceScope.start(connection, arg); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( - @Advice.Thrown Throwable throwable, - @Advice.Local("otelRequest") RedissonRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - - if (scope == null) { - return; - } - scope.close(); - - if (throwable != null) { - instrumenter().end(context, request, null, throwable); + @Advice.Thrown @Nullable Throwable throwable, + @Advice.Enter @Nullable AdviceScope adviceScope) { + if (adviceScope != null) { + adviceScope.end(throwable); } - // span ended in EndOperationListener } } } diff --git a/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedissonInstrumentationModule.java b/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedissonInstrumentationModule.java index 8bafa8244d32..b3e6603b9389 100644 --- a/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedissonInstrumentationModule.java +++ b/instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedissonInstrumentationModule.java @@ -12,11 +12,13 @@ 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.List; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) -public class RedissonInstrumentationModule extends InstrumentationModule { +public class RedissonInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public RedissonInstrumentationModule() { super("redisson", "redisson-3.0"); @@ -31,4 +33,9 @@ public ElementMatcher.Junction classLoaderMatcher() { public List typeInstrumentations() { return asList(new RedisConnectionInstrumentation(), new RedisCommandDataInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisCommandDataInstrumentation.java b/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisCommandDataInstrumentation.java index 50bab352a2c1..9fb1c737a7ca 100644 --- a/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisCommandDataInstrumentation.java +++ b/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisCommandDataInstrumentation.java @@ -14,6 +14,8 @@ import io.opentelemetry.javaagent.instrumentation.redisson.CompletableFutureWrapper; import java.util.concurrent.CompletableFuture; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; +import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -35,10 +37,11 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class WrapCompletableFutureAdvice { + @AssignReturned.ToArguments(@ToArgument(0)) @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.Argument(value = 0, readOnly = false) CompletableFuture completableFuture) { - completableFuture = CompletableFutureWrapper.wrap(completableFuture); + public static CompletableFuture onEnter( + @Advice.Argument(0) CompletableFuture completableFuture) { + return CompletableFutureWrapper.wrap(completableFuture); } } } diff --git a/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisConnectionInstrumentation.java b/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisConnectionInstrumentation.java index 4a2938f45d5e..db17d470caea 100644 --- a/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisConnectionInstrumentation.java +++ b/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisConnectionInstrumentation.java @@ -18,6 +18,7 @@ import io.opentelemetry.javaagent.instrumentation.redisson.PromiseWrapper; import io.opentelemetry.javaagent.instrumentation.redisson.RedissonRequest; import java.net.InetSocketAddress; +import javax.annotation.Nullable; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -38,47 +39,62 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class SendAdvice { - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.This RedisConnection connection, - @Advice.Argument(0) Object arg, - @Advice.Local("otelRequest") RedissonRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { + public static class AdviceScope { + private final RedissonRequest request; + private final Context context; + private final Scope scope; - Context parentContext = currentContext(); - InetSocketAddress remoteAddress = (InetSocketAddress) connection.getChannel().remoteAddress(); - request = RedissonRequest.create(remoteAddress, arg); - PromiseWrapper promise = request.getPromiseWrapper(); - if (promise == null) { - return; + private AdviceScope(RedissonRequest request, Context context, Scope scope) { + this.request = request; + this.context = context; + this.scope = scope; } - if (!instrumenter().shouldStart(parentContext, request)) { - return; + + @Nullable + public static AdviceScope start(RedisConnection connection, Object arg) { + Context parentContext = currentContext(); + InetSocketAddress remoteAddress = + (InetSocketAddress) connection.getChannel().remoteAddress(); + RedissonRequest request = RedissonRequest.create(remoteAddress, arg); + PromiseWrapper promise = request.getPromiseWrapper(); + if (promise == null) { + return null; + } + if (!instrumenter().shouldStart(parentContext, request)) { + return null; + } + + Context context = instrumenter().start(parentContext, request); + Scope scope = context.makeCurrent(); + + promise.setEndOperationListener( + new EndOperationListener<>(instrumenter(), context, request)); + return new AdviceScope(request, context, scope); } - context = instrumenter().start(parentContext, request); - scope = context.makeCurrent(); + public void end(@Nullable Throwable throwable) { + scope.close(); + if (throwable != null) { + instrumenter().end(context, request, null, throwable); + } + // span ended in EndOperationListener + } + } - promise.setEndOperationListener(new EndOperationListener<>(instrumenter(), context, request)); + @Nullable + @Advice.OnMethodEnter(suppress = Throwable.class) + public static AdviceScope onEnter( + @Advice.This RedisConnection connection, @Advice.Argument(0) Object arg) { + return AdviceScope.start(connection, arg); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( - @Advice.Thrown Throwable throwable, - @Advice.Local("otelRequest") RedissonRequest request, - @Advice.Local("otelContext") Context context, - @Advice.Local("otelScope") Scope scope) { - - if (scope == null) { - return; - } - scope.close(); - - if (throwable != null) { - instrumenter().end(context, request, null, throwable); + @Advice.Thrown @Nullable Throwable throwable, + @Advice.Enter @Nullable AdviceScope adviceScope) { + if (adviceScope != null) { + adviceScope.end(throwable); } - // span ended in EndOperationListener } } } diff --git a/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedissonInstrumentationModule.java b/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedissonInstrumentationModule.java index e97df31dcd45..e28f6336346b 100644 --- a/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedissonInstrumentationModule.java +++ b/instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedissonInstrumentationModule.java @@ -11,11 +11,13 @@ 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.List; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) -public class RedissonInstrumentationModule extends InstrumentationModule { +public class RedissonInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public RedissonInstrumentationModule() { super("redisson", "redisson-3.17"); @@ -30,4 +32,9 @@ public ElementMatcher.Junction classLoaderMatcher() { public List typeInstrumentations() { return asList(new RedisConnectionInstrumentation(), new RedisCommandDataInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } }