Skip to content

Commit 535b7e4

Browse files
committed
play-ws-2.x
1 parent 2fd5aa3 commit 535b7e4

File tree

2 files changed

+40
-16
lines changed

2 files changed

+40
-16
lines changed

instrumentation/play/play-ws/play-ws-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayWsInstrumentationModule.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,22 @@
1313
import io.opentelemetry.context.Context;
1414
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1515
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
16+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1617
import io.opentelemetry.javaagent.instrumentation.playws.AbstractBootstrapInstrumentation;
1718
import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation;
1819
import io.opentelemetry.javaagent.instrumentation.playws.HandlerPublisherInstrumentation;
1920
import java.util.List;
2021
import net.bytebuddy.asm.Advice;
22+
import net.bytebuddy.asm.Advice.AssignReturned;
23+
import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument;
2124
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
2225
import play.shaded.ahc.org.asynchttpclient.Request;
2326
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
2427
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
2528

2629
@AutoService(InstrumentationModule.class)
27-
public class PlayWsInstrumentationModule extends InstrumentationModule {
30+
public class PlayWsInstrumentationModule extends InstrumentationModule
31+
implements ExperimentalInstrumentationModule {
2832
public PlayWsInstrumentationModule() {
2933
super("play-ws", "play-ws-2.0");
3034
}
@@ -37,20 +41,26 @@ public List<TypeInstrumentation> typeInstrumentations() {
3741
new AbstractBootstrapInstrumentation());
3842
}
3943

44+
@Override
45+
public boolean isIndyReady() {
46+
return true;
47+
}
48+
4049
@SuppressWarnings("unused")
4150
public static class ClientAdvice {
4251

52+
@AssignReturned.ToArguments(@ToArgument(value = 1, index = 1))
4353
@Advice.OnMethodEnter(suppress = Throwable.class)
44-
public static void methodEnter(
54+
public static Object[] methodEnter(
4555
@Advice.Argument(0) Request request,
46-
@Advice.Argument(value = 1, readOnly = false) AsyncHandler<?> asyncHandler,
47-
@Advice.Local("otelContext") Context context) {
56+
@Advice.Argument(1) AsyncHandler<?> originalAsyncHandler) {
57+
AsyncHandler<?> asyncHandler = originalAsyncHandler;
4858
Context parentContext = currentContext();
4959
if (!instrumenter().shouldStart(parentContext, request)) {
50-
return;
60+
return new Object[] {null, asyncHandler};
5161
}
5262

53-
context = instrumenter().start(parentContext, request);
63+
Context context = instrumenter().start(parentContext, request);
5464

5565
if (asyncHandler instanceof StreamedAsyncHandler) {
5666
asyncHandler =
@@ -60,13 +70,15 @@ public static void methodEnter(
6070
// websocket upgrade handlers aren't supported
6171
asyncHandler = new AsyncHandlerWrapper<>(asyncHandler, request, context, parentContext);
6272
}
73+
return new Object[] {context, asyncHandler};
6374
}
6475

6576
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
6677
public static void methodExit(
6778
@Advice.Argument(0) Request request,
6879
@Advice.Thrown Throwable throwable,
69-
@Advice.Local("otelContext") Context context) {
80+
@Advice.Enter Object[] enterResult) {
81+
Context context = (Context) enterResult[0];
7082
if (context != null && throwable != null) {
7183
instrumenter().end(context, request, null, throwable);
7284
}

instrumentation/play/play-ws/play-ws-2.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsInstrumentationModule.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,23 @@
1313
import io.opentelemetry.context.Context;
1414
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1515
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
16+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1617
import io.opentelemetry.javaagent.instrumentation.playws.AbstractBootstrapInstrumentation;
1718
import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation;
1819
import io.opentelemetry.javaagent.instrumentation.playws.HandlerPublisherInstrumentation;
1920
import java.util.List;
21+
import javax.annotation.Nullable;
2022
import net.bytebuddy.asm.Advice;
23+
import net.bytebuddy.asm.Advice.AssignReturned;
24+
import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument;
2125
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
2226
import play.shaded.ahc.org.asynchttpclient.Request;
2327
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
2428
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
2529

2630
@AutoService(InstrumentationModule.class)
27-
public class PlayWsInstrumentationModule extends InstrumentationModule {
31+
public class PlayWsInstrumentationModule extends InstrumentationModule
32+
implements ExperimentalInstrumentationModule {
2833
public PlayWsInstrumentationModule() {
2934
super("play-ws", "play-ws-2.1");
3035
}
@@ -37,20 +42,25 @@ public List<TypeInstrumentation> typeInstrumentations() {
3742
new AbstractBootstrapInstrumentation());
3843
}
3944

45+
@Override
46+
public boolean isIndyReady() {
47+
return true;
48+
}
49+
4050
@SuppressWarnings("unused")
4151
public static class ClientAdvice {
4252

53+
@AssignReturned.ToArguments(@ToArgument(value = 1, index = 1))
4354
@Advice.OnMethodEnter(suppress = Throwable.class)
44-
public static void methodEnter(
55+
public static Object[] methodEnter(
4556
@Advice.Argument(0) Request request,
46-
@Advice.Argument(value = 1, readOnly = false) AsyncHandler<?> asyncHandler,
47-
@Advice.Local("otelContext") Context context) {
57+
@Advice.Argument(1) AsyncHandler<?> originalAsyncHandler) {
58+
AsyncHandler<?> asyncHandler = originalAsyncHandler;
4859
Context parentContext = currentContext();
4960
if (!instrumenter().shouldStart(parentContext, request)) {
50-
return;
61+
return new Object[] {null, asyncHandler};
5162
}
52-
53-
context = instrumenter().start(parentContext, request);
63+
Context context = instrumenter().start(parentContext, request);
5464

5565
if (asyncHandler instanceof StreamedAsyncHandler) {
5666
asyncHandler =
@@ -60,13 +70,15 @@ public static void methodEnter(
6070
// websocket upgrade handlers aren't supported
6171
asyncHandler = new AsyncHandlerWrapper<>(asyncHandler, request, context, parentContext);
6272
}
73+
return new Object[] {context, asyncHandler};
6374
}
6475

6576
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
6677
public static void methodExit(
6778
@Advice.Argument(0) Request request,
68-
@Advice.Thrown Throwable throwable,
69-
@Advice.Local("otelContext") Context context) {
79+
@Advice.Thrown @Nullable Throwable throwable,
80+
@Advice.Enter Object[] enterResult) {
81+
Context context = (Context) enterResult[0];
7082
if (context != null && throwable != null) {
7183
instrumenter().end(context, request, null, throwable);
7284
}

0 commit comments

Comments
 (0)