Skip to content

Commit b83f539

Browse files
SylvainJugetrask
andauthored
make finatra indy-ready (open-telemetry#15030)
Co-authored-by: Trask Stalnaker <[email protected]>
1 parent 43bf602 commit b83f539

File tree

5 files changed

+69
-47
lines changed

5 files changed

+69
-47
lines changed

instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraExceptionManagerInstrumentation.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55

66
package io.opentelemetry.javaagent.instrumentation.finatra;
77

8+
import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraSingletons.THROWABLE;
89
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
910
import static net.bytebuddy.matcher.ElementMatchers.named;
1011
import static net.bytebuddy.matcher.ElementMatchers.returns;
1112
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1213

1314
import com.twitter.finagle.http.Response;
14-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1515
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1616
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1717
import net.bytebuddy.asm.Advice;
@@ -45,9 +45,7 @@ public static void handleException(
4545
return;
4646
}
4747

48-
VirtualField<Response, Throwable> virtualField =
49-
VirtualField.find(Response.class, Throwable.class);
50-
virtualField.set(response, throwable);
48+
THROWABLE.set(response, throwable);
5149
}
5250
}
5351
}

instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraInstrumentationModule.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 FinatraInstrumentationModule extends InstrumentationModule {
17+
public class FinatraInstrumentationModule extends InstrumentationModule
18+
implements ExperimentalInstrumentationModule {
1719
public FinatraInstrumentationModule() {
1820
super("finatra", "finatra-2.9");
1921
}
@@ -25,4 +27,9 @@ public List<TypeInstrumentation> typeInstrumentations() {
2527
new FinatraRouteBuilderInstrumentation(),
2628
new FinatraExceptionManagerInstrumentation());
2729
}
30+
31+
@Override
32+
public boolean isIndyReady() {
33+
return true;
34+
}
2835
}

instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraResponseListener.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,15 @@
55

66
package io.opentelemetry.javaagent.instrumentation.finatra;
77

8+
import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraSingletons.THROWABLE;
89
import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraSingletons.instrumenter;
910

1011
import com.twitter.finagle.http.Response;
1112
import com.twitter.util.FutureEventListener;
1213
import io.opentelemetry.context.Context;
13-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1414

1515
public final class FinatraResponseListener implements FutureEventListener<Response> {
1616

17-
private static final VirtualField<Response, Throwable> responseThrowableField =
18-
VirtualField.find(Response.class, Throwable.class);
19-
2017
private final Context context;
2118
private final FinatraRequest request;
2219

@@ -27,7 +24,7 @@ public FinatraResponseListener(Context context, FinatraRequest request) {
2724

2825
@Override
2926
public void onSuccess(Response response) {
30-
Throwable throwable = responseThrowableField.get(response);
27+
Throwable throwable = THROWABLE.get(response);
3128
instrumenter().end(context, request, null, throwable);
3229
}
3330

instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraRouteInstrumentation.java

Lines changed: 53 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
import com.twitter.util.Future;
2121
import io.opentelemetry.context.Context;
2222
import io.opentelemetry.context.Scope;
23-
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
2423
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2524
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
25+
import javax.annotation.Nullable;
2626
import net.bytebuddy.asm.Advice;
2727
import net.bytebuddy.description.type.TypeDescription;
2828
import net.bytebuddy.matcher.ElementMatcher;
@@ -50,50 +50,66 @@ public void transform(TypeTransformer transformer) {
5050
@SuppressWarnings("unused")
5151
public static class HandleMatchAdvice {
5252

53-
@Advice.OnMethodEnter(suppress = Throwable.class)
54-
public static void nameSpan(
55-
@Advice.This Route route,
56-
@Advice.FieldValue("routeInfo") RouteInfo routeInfo,
57-
@Advice.FieldValue("clazz") Class<?> controllerClass,
58-
@Advice.Local("otelContext") Context context,
59-
@Advice.Local("otelScope") Scope scope,
60-
@Advice.Local("otelRequest") FinatraRequest request) {
61-
Context parentContext = Java8BytecodeBridge.currentContext();
62-
updateServerSpanName(parentContext, routeInfo);
63-
64-
Class<?> callbackClass = getCallbackClass(route);
65-
// We expect callback to be an inner class of the controller class. If it is not we are not
66-
// going to record it at all.
67-
if (callbackClass != null) {
68-
request = FinatraRequest.create(controllerClass, callbackClass, "apply");
69-
} else {
70-
request = FinatraRequest.create(controllerClass);
53+
public static class AdviceScope {
54+
private final FinatraRequest request;
55+
private final Context context;
56+
private final Scope scope;
57+
58+
private AdviceScope(FinatraRequest request, Context context, Scope scope) {
59+
this.request = request;
60+
this.context = context;
61+
this.scope = scope;
7162
}
7263

73-
if (!instrumenter().shouldStart(parentContext, request)) {
74-
return;
64+
@Nullable
65+
public static AdviceScope start(Route route, RouteInfo routeInfo, Class<?> controllerClass) {
66+
67+
Context parentContext = Context.current();
68+
updateServerSpanName(parentContext, routeInfo);
69+
70+
Class<?> callbackClass = getCallbackClass(route);
71+
// We expect callback to be an inner class of the controller class. If it is not we are not
72+
// going to record it at all.
73+
FinatraRequest request;
74+
if (callbackClass != null) {
75+
request = FinatraRequest.create(controllerClass, callbackClass, "apply");
76+
} else {
77+
request = FinatraRequest.create(controllerClass);
78+
}
79+
80+
if (!instrumenter().shouldStart(parentContext, request)) {
81+
return null;
82+
}
83+
Context context = instrumenter().start(parentContext, request);
84+
return new AdviceScope(request, context, context.makeCurrent());
7585
}
7686

77-
context = instrumenter().start(parentContext, request);
78-
scope = context.makeCurrent();
87+
public void end(
88+
@Nullable Throwable throwable, @Nullable Some<Future<Response>> responseOption) {
89+
scope.close();
90+
if (throwable != null || responseOption == null) {
91+
instrumenter().end(context, request, null, throwable);
92+
} else {
93+
responseOption.get().addEventListener(new FinatraResponseListener(context, request));
94+
}
95+
}
96+
}
97+
98+
@Advice.OnMethodEnter(suppress = Throwable.class)
99+
public static AdviceScope nameSpan(
100+
@Advice.This Route route,
101+
@Advice.FieldValue("routeInfo") RouteInfo routeInfo,
102+
@Advice.FieldValue("clazz") Class<?> controllerClass) {
103+
return AdviceScope.start(route, routeInfo, controllerClass);
79104
}
80105

81106
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
82107
public static void setupCallback(
83-
@Advice.Thrown Throwable throwable,
84-
@Advice.Return Some<Future<Response>> responseOption,
85-
@Advice.Local("otelContext") Context context,
86-
@Advice.Local("otelScope") Scope scope,
87-
@Advice.Local("otelRequest") FinatraRequest request) {
88-
if (scope == null) {
89-
return;
90-
}
91-
scope.close();
92-
93-
if (throwable != null) {
94-
instrumenter().end(context, request, null, throwable);
95-
} else {
96-
responseOption.get().addEventListener(new FinatraResponseListener(context, request));
108+
@Advice.Thrown @Nullable Throwable throwable,
109+
@Advice.Return @Nullable Some<Future<Response>> responseOption,
110+
@Advice.Enter @Nullable AdviceScope adviceScope) {
111+
if (adviceScope != null) {
112+
adviceScope.end(throwable, responseOption);
97113
}
98114
}
99115
}

instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java

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

66
package io.opentelemetry.javaagent.instrumentation.finatra;
77

8+
import com.twitter.finagle.http.Response;
89
import com.twitter.finatra.http.contexts.RouteInfo;
910
import com.twitter.finatra.http.internal.routing.Route;
1011
import io.opentelemetry.api.GlobalOpenTelemetry;
@@ -18,6 +19,9 @@
1819

1920
public final class FinatraSingletons {
2021

22+
public static final VirtualField<Response, Throwable> THROWABLE =
23+
VirtualField.find(Response.class, Throwable.class);
24+
2125
private static final Instrumenter<FinatraRequest, Void> INSTRUMENTER;
2226

2327
static {

0 commit comments

Comments
 (0)