Skip to content

Commit a948194

Browse files
authored
make redisson indy-ready (#14766)
1 parent 950dcb6 commit a948194

File tree

6 files changed

+126
-72
lines changed

6 files changed

+126
-72
lines changed

instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisCommandDataInstrumentation.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import io.opentelemetry.javaagent.instrumentation.redisson.CompletableFutureWrapper;
1616
import java.util.concurrent.CompletableFuture;
1717
import net.bytebuddy.asm.Advice;
18+
import net.bytebuddy.asm.Advice.AssignReturned;
19+
import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument;
1820
import net.bytebuddy.description.type.TypeDescription;
1921
import net.bytebuddy.matcher.ElementMatcher;
2022
import org.redisson.misc.RPromise;
@@ -42,19 +44,21 @@ public void transform(TypeTransformer transformer) {
4244
@SuppressWarnings("unused")
4345
public static class WrapPromiseAdvice {
4446

47+
@AssignReturned.ToArguments(@ToArgument(0))
4548
@Advice.OnMethodEnter(suppress = Throwable.class)
46-
public static void onEnter(@Advice.Argument(value = 0, readOnly = false) RPromise<?> promise) {
47-
promise = RedissonPromiseWrapper.wrap(promise);
49+
public static RPromise<?> onEnter(@Advice.Argument(0) RPromise<?> promise) {
50+
return RedissonPromiseWrapper.wrap(promise);
4851
}
4952
}
5053

5154
@SuppressWarnings("unused")
5255
public static class WrapCompletableFutureAdvice {
5356

57+
@AssignReturned.ToArguments(@ToArgument(0))
5458
@Advice.OnMethodEnter(suppress = Throwable.class)
55-
public static void onEnter(
56-
@Advice.Argument(value = 0, readOnly = false) CompletableFuture<?> completableFuture) {
57-
completableFuture = CompletableFutureWrapper.wrap(completableFuture);
59+
public static CompletableFuture<?> onEnter(
60+
@Advice.Argument(0) CompletableFuture<?> completableFuture) {
61+
return CompletableFutureWrapper.wrap(completableFuture);
5862
}
5963
}
6064
}

instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedisConnectionInstrumentation.java

Lines changed: 48 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.opentelemetry.javaagent.instrumentation.redisson.PromiseWrapper;
1919
import io.opentelemetry.javaagent.instrumentation.redisson.RedissonRequest;
2020
import java.net.InetSocketAddress;
21+
import javax.annotation.Nullable;
2122
import net.bytebuddy.asm.Advice;
2223
import net.bytebuddy.description.type.TypeDescription;
2324
import net.bytebuddy.matcher.ElementMatcher;
@@ -38,47 +39,63 @@ public void transform(TypeTransformer transformer) {
3839
@SuppressWarnings("unused")
3940
public static class SendAdvice {
4041

41-
@Advice.OnMethodEnter(suppress = Throwable.class)
42-
public static void onEnter(
43-
@Advice.This RedisConnection connection,
44-
@Advice.Argument(0) Object arg,
45-
@Advice.Local("otelRequest") RedissonRequest request,
46-
@Advice.Local("otelContext") Context context,
47-
@Advice.Local("otelScope") Scope scope) {
42+
public static class AdviceScope {
43+
private final RedissonRequest request;
44+
private final Context context;
45+
private final Scope scope;
4846

49-
Context parentContext = currentContext();
50-
InetSocketAddress remoteAddress = (InetSocketAddress) connection.getChannel().remoteAddress();
51-
request = RedissonRequest.create(remoteAddress, arg);
52-
PromiseWrapper<?> promise = request.getPromiseWrapper();
53-
if (promise == null) {
54-
return;
47+
private AdviceScope(RedissonRequest request, Context context, Scope scope) {
48+
this.request = request;
49+
this.context = context;
50+
this.scope = scope;
5551
}
56-
if (!instrumenter().shouldStart(parentContext, request)) {
57-
return;
52+
53+
@Nullable
54+
public static AdviceScope start(RedisConnection connection, Object arg) {
55+
InetSocketAddress remoteAddress =
56+
(InetSocketAddress) connection.getChannel().remoteAddress();
57+
RedissonRequest request = RedissonRequest.create(remoteAddress, arg);
58+
PromiseWrapper<?> promise = request.getPromiseWrapper();
59+
if (promise == null) {
60+
return null;
61+
}
62+
Context parentContext = currentContext();
63+
if (!instrumenter().shouldStart(parentContext, request)) {
64+
return null;
65+
}
66+
67+
Context context = instrumenter().start(parentContext, request);
68+
Scope scope = context.makeCurrent();
69+
70+
promise.setEndOperationListener(
71+
new EndOperationListener<>(instrumenter(), context, request));
72+
return new AdviceScope(request, context, scope);
5873
}
5974

60-
context = instrumenter().start(parentContext, request);
61-
scope = context.makeCurrent();
75+
public void end(@Nullable Throwable throwable) {
76+
scope.close();
6277

63-
promise.setEndOperationListener(new EndOperationListener<>(instrumenter(), context, request));
78+
if (throwable != null) {
79+
instrumenter().end(context, request, null, throwable);
80+
}
81+
// span ended in EndOperationListener
82+
}
83+
}
84+
85+
@Nullable
86+
@Advice.OnMethodEnter(suppress = Throwable.class)
87+
public static AdviceScope onEnter(
88+
@Advice.This RedisConnection connection, @Advice.Argument(0) Object arg) {
89+
return AdviceScope.start(connection, arg);
6490
}
6591

6692
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
6793
public static void stopSpan(
68-
@Advice.Thrown Throwable throwable,
69-
@Advice.Local("otelRequest") RedissonRequest request,
70-
@Advice.Local("otelContext") Context context,
71-
@Advice.Local("otelScope") Scope scope) {
72-
73-
if (scope == null) {
74-
return;
75-
}
76-
scope.close();
77-
78-
if (throwable != null) {
79-
instrumenter().end(context, request, null, throwable);
94+
@Advice.Thrown @Nullable Throwable throwable,
95+
@Advice.Enter @Nullable AdviceScope adviceScope) {
96+
if (adviceScope != null) {
97+
adviceScope.end(throwable);
8098
}
81-
// span ended in EndOperationListener
8299
}
83100
}
84101
}

instrumentation/redisson/redisson-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_0/RedissonInstrumentationModule.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import com.google.auto.service.AutoService;
1313
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1414
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
15+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1516
import java.util.List;
1617
import net.bytebuddy.matcher.ElementMatcher;
1718

1819
@AutoService(InstrumentationModule.class)
19-
public class RedissonInstrumentationModule extends InstrumentationModule {
20+
public class RedissonInstrumentationModule extends InstrumentationModule
21+
implements ExperimentalInstrumentationModule {
2022

2123
public RedissonInstrumentationModule() {
2224
super("redisson", "redisson-3.0");
@@ -31,4 +33,9 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3133
public List<TypeInstrumentation> typeInstrumentations() {
3234
return asList(new RedisConnectionInstrumentation(), new RedisCommandDataInstrumentation());
3335
}
36+
37+
@Override
38+
public boolean isIndyReady() {
39+
return true;
40+
}
3441
}

instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisCommandDataInstrumentation.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import io.opentelemetry.javaagent.instrumentation.redisson.CompletableFutureWrapper;
1515
import java.util.concurrent.CompletableFuture;
1616
import net.bytebuddy.asm.Advice;
17+
import net.bytebuddy.asm.Advice.AssignReturned;
18+
import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument;
1719
import net.bytebuddy.description.type.TypeDescription;
1820
import net.bytebuddy.matcher.ElementMatcher;
1921

@@ -35,10 +37,11 @@ public void transform(TypeTransformer transformer) {
3537
@SuppressWarnings("unused")
3638
public static class WrapCompletableFutureAdvice {
3739

40+
@AssignReturned.ToArguments(@ToArgument(0))
3841
@Advice.OnMethodEnter(suppress = Throwable.class)
39-
public static void onEnter(
40-
@Advice.Argument(value = 0, readOnly = false) CompletableFuture<?> completableFuture) {
41-
completableFuture = CompletableFutureWrapper.wrap(completableFuture);
42+
public static CompletableFuture<?> onEnter(
43+
@Advice.Argument(0) CompletableFuture<?> completableFuture) {
44+
return CompletableFutureWrapper.wrap(completableFuture);
4245
}
4346
}
4447
}

instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedisConnectionInstrumentation.java

Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.opentelemetry.javaagent.instrumentation.redisson.PromiseWrapper;
1919
import io.opentelemetry.javaagent.instrumentation.redisson.RedissonRequest;
2020
import java.net.InetSocketAddress;
21+
import javax.annotation.Nullable;
2122
import net.bytebuddy.asm.Advice;
2223
import net.bytebuddy.description.type.TypeDescription;
2324
import net.bytebuddy.matcher.ElementMatcher;
@@ -38,47 +39,62 @@ public void transform(TypeTransformer transformer) {
3839
@SuppressWarnings("unused")
3940
public static class SendAdvice {
4041

41-
@Advice.OnMethodEnter(suppress = Throwable.class)
42-
public static void onEnter(
43-
@Advice.This RedisConnection connection,
44-
@Advice.Argument(0) Object arg,
45-
@Advice.Local("otelRequest") RedissonRequest request,
46-
@Advice.Local("otelContext") Context context,
47-
@Advice.Local("otelScope") Scope scope) {
42+
public static class AdviceScope {
43+
private final RedissonRequest request;
44+
private final Context context;
45+
private final Scope scope;
4846

49-
Context parentContext = currentContext();
50-
InetSocketAddress remoteAddress = (InetSocketAddress) connection.getChannel().remoteAddress();
51-
request = RedissonRequest.create(remoteAddress, arg);
52-
PromiseWrapper<?> promise = request.getPromiseWrapper();
53-
if (promise == null) {
54-
return;
47+
private AdviceScope(RedissonRequest request, Context context, Scope scope) {
48+
this.request = request;
49+
this.context = context;
50+
this.scope = scope;
5551
}
56-
if (!instrumenter().shouldStart(parentContext, request)) {
57-
return;
52+
53+
@Nullable
54+
public static AdviceScope start(RedisConnection connection, Object arg) {
55+
Context parentContext = currentContext();
56+
InetSocketAddress remoteAddress =
57+
(InetSocketAddress) connection.getChannel().remoteAddress();
58+
RedissonRequest request = RedissonRequest.create(remoteAddress, arg);
59+
PromiseWrapper<?> promise = request.getPromiseWrapper();
60+
if (promise == null) {
61+
return null;
62+
}
63+
if (!instrumenter().shouldStart(parentContext, request)) {
64+
return null;
65+
}
66+
67+
Context context = instrumenter().start(parentContext, request);
68+
Scope scope = context.makeCurrent();
69+
70+
promise.setEndOperationListener(
71+
new EndOperationListener<>(instrumenter(), context, request));
72+
return new AdviceScope(request, context, scope);
5873
}
5974

60-
context = instrumenter().start(parentContext, request);
61-
scope = context.makeCurrent();
75+
public void end(@Nullable Throwable throwable) {
76+
scope.close();
77+
if (throwable != null) {
78+
instrumenter().end(context, request, null, throwable);
79+
}
80+
// span ended in EndOperationListener
81+
}
82+
}
6283

63-
promise.setEndOperationListener(new EndOperationListener<>(instrumenter(), context, request));
84+
@Nullable
85+
@Advice.OnMethodEnter(suppress = Throwable.class)
86+
public static AdviceScope onEnter(
87+
@Advice.This RedisConnection connection, @Advice.Argument(0) Object arg) {
88+
return AdviceScope.start(connection, arg);
6489
}
6590

6691
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
6792
public static void stopSpan(
68-
@Advice.Thrown Throwable throwable,
69-
@Advice.Local("otelRequest") RedissonRequest request,
70-
@Advice.Local("otelContext") Context context,
71-
@Advice.Local("otelScope") Scope scope) {
72-
73-
if (scope == null) {
74-
return;
75-
}
76-
scope.close();
77-
78-
if (throwable != null) {
79-
instrumenter().end(context, request, null, throwable);
93+
@Advice.Thrown @Nullable Throwable throwable,
94+
@Advice.Enter @Nullable AdviceScope adviceScope) {
95+
if (adviceScope != null) {
96+
adviceScope.end(throwable);
8097
}
81-
// span ended in EndOperationListener
8298
}
8399
}
84100
}

instrumentation/redisson/redisson-3.17/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/redisson/v3_17/RedissonInstrumentationModule.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
import com.google.auto.service.AutoService;
1212
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1313
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
14+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1415
import java.util.List;
1516
import net.bytebuddy.matcher.ElementMatcher;
1617

1718
@AutoService(InstrumentationModule.class)
18-
public class RedissonInstrumentationModule extends InstrumentationModule {
19+
public class RedissonInstrumentationModule extends InstrumentationModule
20+
implements ExperimentalInstrumentationModule {
1921

2022
public RedissonInstrumentationModule() {
2123
super("redisson", "redisson-3.17");
@@ -30,4 +32,9 @@ public ElementMatcher.Junction<ClassLoader> classLoaderMatcher() {
3032
public List<TypeInstrumentation> typeInstrumentations() {
3133
return asList(new RedisConnectionInstrumentation(), new RedisCommandDataInstrumentation());
3234
}
35+
36+
@Override
37+
public boolean isIndyReady() {
38+
return true;
39+
}
3340
}

0 commit comments

Comments
 (0)