Skip to content

Commit 8081608

Browse files
SylvainJugelaurit
andauthored
migrate more http clients to indy-ready (open-telemetry#13897)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent 4ec198f commit 8081608

File tree

20 files changed

+349
-220
lines changed

20 files changed

+349
-220
lines changed

instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientInstrumentationModule.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import com.google.auto.service.AutoService;
1111
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
13+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1314
import java.util.List;
1415

1516
@AutoService(InstrumentationModule.class)
16-
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule {
17+
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule
18+
implements ExperimentalInstrumentationModule {
1719
public AsyncHttpClientInstrumentationModule() {
1820
super("async-http-client", "async-http-client-1.9");
1921
}
@@ -22,4 +24,9 @@ public AsyncHttpClientInstrumentationModule() {
2224
public List<TypeInstrumentation> typeInstrumentations() {
2325
return asList(new RequestInstrumentation(), new ResponseInstrumentation());
2426
}
27+
28+
@Override
29+
public boolean isIndyReady() {
30+
return true;
31+
}
2532
}

instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientSingletons.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,28 @@
55

66
package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9;
77

8+
import com.ning.http.client.AsyncHandler;
89
import com.ning.http.client.Request;
910
import com.ning.http.client.Response;
1011
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
12+
import io.opentelemetry.instrumentation.api.util.VirtualField;
1113
import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters;
1214

1315
public final class AsyncHttpClientSingletons {
1416
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.async-http-client-1.9";
1517

1618
private static final Instrumenter<Request, Response> INSTRUMENTER;
1719

20+
public static final VirtualField<AsyncHandler<?>, AsyncHandlerData> ASYNC_HANDLER_DATA;
21+
1822
static {
1923
INSTRUMENTER =
2024
JavaagentHttpClientInstrumenters.create(
2125
INSTRUMENTATION_NAME,
2226
new AsyncHttpClientHttpAttributesGetter(),
2327
HttpHeaderSetter.INSTANCE);
28+
29+
ASYNC_HANDLER_DATA = VirtualField.find(AsyncHandler.class, AsyncHandlerData.class);
2430
}
2531

2632
public static Instrumenter<Request, Response> instrumenter() {

instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/RequestInstrumentation.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9;
77

88
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
9+
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9.AsyncHttpClientSingletons.ASYNC_HANDLER_DATA;
910
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9.AsyncHttpClientSingletons.instrumenter;
1011
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1112
import static net.bytebuddy.matcher.ElementMatchers.named;
@@ -15,9 +16,9 @@
1516
import com.ning.http.client.Request;
1617
import io.opentelemetry.context.Context;
1718
import io.opentelemetry.context.Scope;
18-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1919
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2020
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
21+
import javax.annotation.Nullable;
2122
import net.bytebuddy.asm.Advice;
2223
import net.bytebuddy.description.type.TypeDescription;
2324
import net.bytebuddy.matcher.ElementMatcher;
@@ -42,24 +43,22 @@ public void transform(TypeTransformer transformer) {
4243
@SuppressWarnings("unused")
4344
public static class ExecuteAdvice {
4445

46+
@Nullable
4547
@Advice.OnMethodEnter(suppress = Throwable.class)
46-
public static void onEnter(
47-
@Advice.Argument(0) Request request,
48-
@Advice.Argument(1) AsyncHandler<?> handler,
49-
@Advice.Local("otelScope") Scope scope) {
48+
public static Scope onEnter(
49+
@Advice.Argument(0) Request request, @Advice.Argument(1) AsyncHandler<?> handler) {
5050
Context parentContext = currentContext();
5151
if (!instrumenter().shouldStart(parentContext, request)) {
52-
return;
52+
return null;
5353
}
5454

5555
Context context = instrumenter().start(parentContext, request);
56-
VirtualField.find(AsyncHandler.class, AsyncHandlerData.class)
57-
.set(handler, AsyncHandlerData.create(parentContext, context, request));
58-
scope = context.makeCurrent();
56+
ASYNC_HANDLER_DATA.set(handler, AsyncHandlerData.create(parentContext, context, request));
57+
return context.makeCurrent();
5958
}
6059

6160
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
62-
public static void onExit(@Advice.Local("otelScope") Scope scope) {
61+
public static void onExit(@Advice.Enter @Nullable Scope scope) {
6362
if (scope != null) {
6463
scope.close();
6564
}

instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/ResponseInstrumentation.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@
66
package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9;
77

88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
9+
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9.AsyncHttpClientSingletons.ASYNC_HANDLER_DATA;
910
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v1_9.AsyncHttpClientSingletons.instrumenter;
1011
import static net.bytebuddy.matcher.ElementMatchers.hasSuperClass;
1112
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1213
import static net.bytebuddy.matcher.ElementMatchers.named;
1314
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1415

1516
import com.ning.http.client.AsyncCompletionHandler;
16-
import com.ning.http.client.AsyncHandler;
1717
import com.ning.http.client.Response;
1818
import io.opentelemetry.context.Scope;
19-
import io.opentelemetry.instrumentation.api.util.VirtualField;
2019
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2120
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
2221
import net.bytebuddy.asm.Advice;
@@ -54,13 +53,11 @@ public static class OnCompletedAdvice {
5453
public static Scope onEnter(
5554
@Advice.This AsyncCompletionHandler<?> handler, @Advice.Argument(0) Response response) {
5655

57-
VirtualField<AsyncHandler<?>, AsyncHandlerData> virtualField =
58-
VirtualField.find(AsyncHandler.class, AsyncHandlerData.class);
59-
AsyncHandlerData data = virtualField.get(handler);
56+
AsyncHandlerData data = ASYNC_HANDLER_DATA.get(handler);
6057
if (data == null) {
6158
return null;
6259
}
63-
virtualField.set(handler, null);
60+
ASYNC_HANDLER_DATA.set(handler, null);
6461
instrumenter().end(data.getContext(), data.getRequest(), response, null);
6562
return data.getParentContext().makeCurrent();
6663
}
@@ -80,13 +77,11 @@ public static class OnThrowableAdvice {
8077
public static Scope onEnter(
8178
@Advice.This AsyncCompletionHandler<?> handler, @Advice.Argument(0) Throwable throwable) {
8279

83-
VirtualField<AsyncHandler<?>, AsyncHandlerData> virtualField =
84-
VirtualField.find(AsyncHandler.class, AsyncHandlerData.class);
85-
AsyncHandlerData data = virtualField.get(handler);
80+
AsyncHandlerData data = ASYNC_HANDLER_DATA.get(handler);
8681
if (data == null) {
8782
return null;
8883
}
89-
virtualField.set(handler, null);
84+
ASYNC_HANDLER_DATA.set(handler, null);
9085
instrumenter().end(data.getContext(), data.getRequest(), null, throwable);
9186
return data.getParentContext().makeCurrent();
9287
}

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncCompletionHandlerInstrumentation.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,20 @@
66
package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0;
77

88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
9+
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0.AsyncHttpClientSingletons.ASYNC_HANDLER_REQUEST_CONTEXT;
910
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0.AsyncHttpClientSingletons.instrumenter;
1011
import static net.bytebuddy.matcher.ElementMatchers.hasSuperClass;
1112
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1213
import static net.bytebuddy.matcher.ElementMatchers.named;
1314
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1415

1516
import io.opentelemetry.context.Scope;
16-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1717
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1818
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1919
import net.bytebuddy.asm.Advice;
2020
import net.bytebuddy.description.type.TypeDescription;
2121
import net.bytebuddy.matcher.ElementMatcher;
2222
import org.asynchttpclient.AsyncCompletionHandler;
23-
import org.asynchttpclient.AsyncHandler;
2423
import org.asynchttpclient.Response;
2524

2625
public class AsyncCompletionHandlerInstrumentation implements TypeInstrumentation {
@@ -54,13 +53,11 @@ public static class OnCompletedAdvice {
5453
public static Scope onEnter(
5554
@Advice.This AsyncCompletionHandler<?> handler, @Advice.Argument(0) Response response) {
5655

57-
VirtualField<AsyncHandler<?>, RequestContext> virtualField =
58-
VirtualField.find(AsyncHandler.class, RequestContext.class);
59-
RequestContext requestContext = virtualField.get(handler);
56+
RequestContext requestContext = ASYNC_HANDLER_REQUEST_CONTEXT.get(handler);
6057
if (requestContext == null) {
6158
return null;
6259
}
63-
virtualField.set(handler, null);
60+
ASYNC_HANDLER_REQUEST_CONTEXT.set(handler, null);
6461
instrumenter().end(requestContext.getContext(), requestContext, response, null);
6562
return requestContext.getParentContext().makeCurrent();
6663
}
@@ -80,13 +77,11 @@ public static class OnThrowableAdvice {
8077
public static Scope onEnter(
8178
@Advice.This AsyncCompletionHandler<?> handler, @Advice.Argument(0) Throwable throwable) {
8279

83-
VirtualField<AsyncHandler<?>, RequestContext> virtualField =
84-
VirtualField.find(AsyncHandler.class, RequestContext.class);
85-
RequestContext requestContext = virtualField.get(handler);
80+
RequestContext requestContext = ASYNC_HANDLER_REQUEST_CONTEXT.get(handler);
8681
if (requestContext == null) {
8782
return null;
8883
}
89-
virtualField.set(handler, null);
84+
ASYNC_HANDLER_REQUEST_CONTEXT.set(handler, null);
9085
instrumenter().end(requestContext.getContext(), requestContext, null, throwable);
9186
return requestContext.getParentContext().makeCurrent();
9287
}

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientInstrumentation.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77

88
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
99
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
10+
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0.AsyncHttpClientSingletons.ASYNC_HANDLER_REQUEST_CONTEXT;
1011
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0.AsyncHttpClientSingletons.instrumenter;
1112
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1213
import static net.bytebuddy.matcher.ElementMatchers.named;
1314
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1415

1516
import io.opentelemetry.context.Context;
1617
import io.opentelemetry.context.Scope;
17-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1818
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1919
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
20+
import javax.annotation.Nullable;
2021
import net.bytebuddy.asm.Advice;
2122
import net.bytebuddy.description.type.TypeDescription;
2223
import net.bytebuddy.matcher.ElementMatcher;
@@ -43,15 +44,14 @@ public void transform(TypeTransformer transformer) {
4344
@SuppressWarnings("unused")
4445
public static class ExecuteRequestAdvice {
4546

47+
@Nullable
4648
@Advice.OnMethodEnter(suppress = Throwable.class)
47-
public static void onEnter(
48-
@Advice.Argument(0) Request request,
49-
@Advice.Argument(1) AsyncHandler<?> handler,
50-
@Advice.Local("otelScope") Scope scope) {
49+
public static Scope onEnter(
50+
@Advice.Argument(0) Request request, @Advice.Argument(1) AsyncHandler<?> handler) {
5151
Context parentContext = currentContext();
5252
RequestContext requestContext = new RequestContext(parentContext, request);
5353
if (!instrumenter().shouldStart(parentContext, requestContext)) {
54-
return;
54+
return null;
5555
}
5656

5757
Context context = instrumenter().start(parentContext, requestContext);
@@ -70,12 +70,12 @@ public static void onEnter(
7070
// 2.1, so the instrumentation module will need to be essentially duplicated (or a common
7171
// module introduced)
7272

73-
VirtualField.find(AsyncHandler.class, RequestContext.class).set(handler, requestContext);
74-
scope = context.makeCurrent();
73+
ASYNC_HANDLER_REQUEST_CONTEXT.set(handler, requestContext);
74+
return context.makeCurrent();
7575
}
7676

7777
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
78-
public static void onExit(@Advice.Local("otelScope") Scope scope) {
78+
public static void onExit(@Advice.Enter @Nullable Scope scope) {
7979
if (scope != null) {
8080
scope.close();
8181
}

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientInstrumentationModule.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import com.google.auto.service.AutoService;
1111
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
13+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1314
import java.util.List;
1415

1516
@AutoService(InstrumentationModule.class)
16-
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule {
17+
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule
18+
implements ExperimentalInstrumentationModule {
1719
public AsyncHttpClientInstrumentationModule() {
1820
super("async-http-client", "async-http-client-2.0");
1921
}
@@ -26,4 +28,9 @@ public List<TypeInstrumentation> typeInstrumentations() {
2628
new NettyRequestSenderInstrumentation(),
2729
new NettyResponseFutureInstrumentation());
2830
}
31+
32+
@Override
33+
public boolean isIndyReady() {
34+
return true;
35+
}
2936
}

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientSingletons.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,30 @@
55

66
package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0;
77

8+
import io.opentelemetry.context.Context;
89
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10+
import io.opentelemetry.instrumentation.api.util.VirtualField;
911
import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters;
12+
import org.asynchttpclient.AsyncHandler;
13+
import org.asynchttpclient.Request;
1014
import org.asynchttpclient.Response;
1115

1216
public final class AsyncHttpClientSingletons {
1317
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.async-http-client-2.0";
1418

1519
private static final Instrumenter<RequestContext, Response> INSTRUMENTER;
20+
public static final VirtualField<AsyncHandler<?>, RequestContext> ASYNC_HANDLER_REQUEST_CONTEXT;
21+
public static final VirtualField<Request, Context> REQUEST_CONTEXT;
1622

1723
static {
1824
INSTRUMENTER =
1925
JavaagentHttpClientInstrumenters.create(
2026
INSTRUMENTATION_NAME,
2127
new AsyncHttpClientHttpAttributesGetter(),
2228
HttpHeaderSetter.INSTANCE);
29+
30+
ASYNC_HANDLER_REQUEST_CONTEXT = VirtualField.find(AsyncHandler.class, RequestContext.class);
31+
REQUEST_CONTEXT = VirtualField.find(Request.class, Context.class);
2332
}
2433

2534
public static Instrumenter<RequestContext, Response> instrumenter() {

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/NettyRequestSenderInstrumentation.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55

66
package io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0;
77

8+
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0.AsyncHttpClientSingletons.ASYNC_HANDLER_REQUEST_CONTEXT;
9+
import static io.opentelemetry.javaagent.instrumentation.asynchttpclient.v2_0.AsyncHttpClientSingletons.REQUEST_CONTEXT;
810
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
911
import static net.bytebuddy.matcher.ElementMatchers.named;
1012
import static net.bytebuddy.matcher.ElementMatchers.returns;
1113
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1214

1315
import io.opentelemetry.context.Context;
1416
import io.opentelemetry.context.Scope;
15-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1617
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
1718
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1819
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1920
import net.bytebuddy.asm.Advice;
2021
import net.bytebuddy.description.type.TypeDescription;
2122
import net.bytebuddy.matcher.ElementMatcher;
22-
import org.asynchttpclient.AsyncHandler;
2323
import org.asynchttpclient.Request;
2424
import org.asynchttpclient.netty.NettyResponseFuture;
2525

@@ -59,8 +59,7 @@ public static class AttachContextAdvice {
5959

6060
@Advice.OnMethodEnter
6161
public static void attachContext(@Advice.Argument(0) Request request) {
62-
VirtualField.find(Request.class, Context.class)
63-
.set(request, Java8BytecodeBridge.currentContext());
62+
REQUEST_CONTEXT.set(request, Java8BytecodeBridge.currentContext());
6463
}
6564
}
6665

@@ -70,7 +69,7 @@ public static class MountContextAdvice {
7069
@Advice.OnMethodEnter
7170
public static Scope mountContext(@Advice.Argument(0) NettyResponseFuture<?> responseFuture) {
7271
Request request = responseFuture.getCurrentRequest();
73-
Context context = VirtualField.find(Request.class, Context.class).get(request);
72+
Context context = REQUEST_CONTEXT.get(request);
7473
return context == null ? null : context.makeCurrent();
7574
}
7675

@@ -88,8 +87,7 @@ public static class RememberNettyRequestAdvice {
8887
@Advice.OnMethodExit
8988
public static void rememberNettyRequest(@Advice.Return NettyResponseFuture<?> responseFuture) {
9089
RequestContext requestContext =
91-
VirtualField.find(AsyncHandler.class, RequestContext.class)
92-
.get(responseFuture.getAsyncHandler());
90+
ASYNC_HANDLER_REQUEST_CONTEXT.get(responseFuture.getAsyncHandler());
9391
if (requestContext != null) {
9492
requestContext.setNettyRequest(responseFuture.getNettyRequest());
9593
}

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/NettyResponseFutureInstrumentation.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1515
import java.util.concurrent.CompletableFuture;
1616
import net.bytebuddy.asm.Advice;
17+
import net.bytebuddy.asm.Advice.AssignReturned;
1718
import net.bytebuddy.description.type.TypeDescription;
1819
import net.bytebuddy.matcher.ElementMatcher;
1920

@@ -34,9 +35,10 @@ public void transform(TypeTransformer transformer) {
3435
@SuppressWarnings("unused")
3536
public static class WrapFutureAdvice {
3637

38+
@AssignReturned.ToReturned
3739
@Advice.OnMethodExit(suppress = Throwable.class)
38-
public static void onExit(@Advice.Return(readOnly = false) CompletableFuture<?> result) {
39-
result = CompletableFutureWrapper.wrap(result, Java8BytecodeBridge.currentContext());
40+
public static CompletableFuture<?> onExit(@Advice.Return CompletableFuture<?> result) {
41+
return CompletableFutureWrapper.wrap(result, Java8BytecodeBridge.currentContext());
4042
}
4143
}
4244
}

0 commit comments

Comments
 (0)