Skip to content

Commit ebfcd84

Browse files
committed
vertx-http-client-3.0
1 parent 0b0c59c commit ebfcd84

File tree

5 files changed

+93
-70
lines changed

5 files changed

+93
-70
lines changed

instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/HttpClientImplInstrumentation.java

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

66
package io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client;
77

8+
import static io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client.VertxClientSingletons.HTTP_CLIENT_OPTIONS;
89
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
910
import static net.bytebuddy.matcher.ElementMatchers.named;
1011

11-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1313
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1414
import io.vertx.core.http.HttpClientOptions;
@@ -36,7 +36,7 @@ public static class AttachStateAdvice {
3636
public static void attachHttpClientOptions(
3737
@Advice.This HttpClientImpl client,
3838
@Advice.FieldValue("options") HttpClientOptions options) {
39-
VirtualField.find(HttpClientImpl.class, HttpClientOptions.class).set(client, options);
39+
HTTP_CLIENT_OPTIONS.set(client, options);
4040
}
4141
}
4242
}

instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/HttpRequestImplInstrumentation.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55

66
package io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client;
77

8+
import static io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client.VertxClientSingletons.HTTP_CLIENT_OPTIONS;
9+
import static io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client.VertxClientSingletons.REQUEST_INFO;
810
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
911
import static net.bytebuddy.matcher.ElementMatchers.named;
1012
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1113

12-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1314
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1415
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1516
import io.vertx.core.http.HttpClientOptions;
@@ -53,13 +54,11 @@ public static void attachRequestInfo(
5354
@Advice.Argument(0) HttpClientImpl client,
5455
@Advice.Argument(2) String host,
5556
@Advice.Argument(3) int port) {
56-
HttpClientOptions httpClientOptions =
57-
VirtualField.find(HttpClientImpl.class, HttpClientOptions.class).get(client);
58-
VirtualField.find(HttpClientRequest.class, VertxRequestInfo.class)
59-
.set(
60-
request,
61-
VertxRequestInfo.create(
62-
httpClientOptions != null && httpClientOptions.isSsl(), host, port));
57+
HttpClientOptions httpClientOptions = HTTP_CLIENT_OPTIONS.get(client);
58+
REQUEST_INFO.set(
59+
request,
60+
VertxRequestInfo.create(
61+
httpClientOptions != null && httpClientOptions.isSsl(), host, port));
6362
}
6463
}
6564

@@ -71,8 +70,7 @@ public static void attachRequestInfo(
7170
@Advice.Argument(1) boolean ssl,
7271
@Advice.Argument(3) String host,
7372
@Advice.Argument(4) int port) {
74-
VirtualField.find(HttpClientRequest.class, VertxRequestInfo.class)
75-
.set(request, VertxRequestInfo.create(ssl, host, port));
73+
REQUEST_INFO.set(request, VertxRequestInfo.create(ssl, host, port));
7674
}
7775
}
7876

@@ -84,8 +82,7 @@ public static void attachRequestInfo(
8482
@Advice.Argument(1) boolean ssl,
8583
@Advice.Argument(4) String host,
8684
@Advice.Argument(5) int port) {
87-
VirtualField.find(HttpClientRequest.class, VertxRequestInfo.class)
88-
.set(request, VertxRequestInfo.create(ssl, host, port));
85+
REQUEST_INFO.set(request, VertxRequestInfo.create(ssl, host, port));
8986
}
9087
}
9188
}

instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/HttpRequestInstrumentation.java

Lines changed: 61 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
99
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
10+
import static io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client.VertxClientSingletons.CONTEXTS;
11+
import static io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client.VertxClientSingletons.REQUEST_INFO;
1012
import static io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client.VertxClientSingletons.instrumenter;
1113
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1214
import static net.bytebuddy.matcher.ElementMatchers.isPrivate;
@@ -16,7 +18,6 @@
1618

1719
import io.opentelemetry.context.Context;
1820
import io.opentelemetry.context.Scope;
19-
import io.opentelemetry.instrumentation.api.util.VirtualField;
2021
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
2122
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2223
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
@@ -25,7 +26,10 @@
2526
import io.vertx.core.Handler;
2627
import io.vertx.core.http.HttpClientRequest;
2728
import io.vertx.core.http.HttpClientResponse;
29+
import javax.annotation.Nullable;
2830
import net.bytebuddy.asm.Advice;
31+
import net.bytebuddy.asm.Advice.AssignReturned;
32+
import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument;
2933
import net.bytebuddy.description.type.TypeDescription;
3034
import net.bytebuddy.matcher.ElementMatcher;
3135

@@ -83,67 +87,71 @@ public void transform(TypeTransformer transformer) {
8387
@SuppressWarnings("unused")
8488
public static class EndRequestAdvice {
8589

86-
@Advice.OnMethodEnter(suppress = Throwable.class)
87-
public static void attachContext(
88-
@Advice.This HttpClientRequest request,
89-
@Advice.Local("otelContext") Context context,
90-
@Advice.Local("otelScope") Scope scope) {
90+
public static class AdviceScope {
91+
private final Context context;
92+
private final Scope scope;
93+
94+
public AdviceScope(Context context, Scope scope) {
95+
this.context = context;
96+
this.scope = scope;
97+
}
98+
99+
public void end(@Nullable Throwable throwable, HttpClientRequest request) {
100+
scope.close();
101+
if (throwable != null) {
102+
instrumenter().end(context, request, null, throwable);
103+
}
104+
}
105+
}
91106

92-
VertxRequestInfo requestInfo =
93-
VirtualField.find(HttpClientRequest.class, VertxRequestInfo.class).get(request);
107+
@Nullable
108+
@Advice.OnMethodEnter(suppress = Throwable.class)
109+
public static AdviceScope attachContext(@Advice.This HttpClientRequest request) {
110+
VertxRequestInfo requestInfo = REQUEST_INFO.get(request);
94111
if (requestInfo == null) {
95-
return;
112+
return null;
96113
}
97114

98115
Context parentContext = Java8BytecodeBridge.currentContext();
99116
if (!instrumenter().shouldStart(parentContext, request)) {
100-
return;
117+
return null;
101118
}
102-
103-
context = instrumenter().start(parentContext, request);
104-
Contexts contexts = new Contexts(parentContext, context);
105-
VirtualField.find(HttpClientRequest.class, Contexts.class).set(request, contexts);
106-
107-
scope = context.makeCurrent();
119+
Context context = instrumenter().start(parentContext, request);
120+
CONTEXTS.set(request, new Contexts(parentContext, context));
121+
return new AdviceScope(context, context.makeCurrent());
108122
}
109123

110124
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
111125
public static void endScope(
112126
@Advice.This HttpClientRequest request,
113-
@Advice.Local("otelContext") Context context,
114-
@Advice.Local("otelScope") Scope scope,
115-
@Advice.Thrown Throwable throwable) {
116-
if (scope != null) {
117-
scope.close();
118-
}
119-
if (throwable != null) {
120-
instrumenter().end(context, request, null, throwable);
127+
@Advice.Thrown @Nullable Throwable throwable,
128+
@Advice.Enter @Nullable AdviceScope adviceScope) {
129+
if (adviceScope != null) {
130+
adviceScope.end(throwable, request);
121131
}
122132
}
123133
}
124134

125135
@SuppressWarnings("unused")
126136
public static class HandleExceptionAdvice {
127137

138+
@Nullable
128139
@Advice.OnMethodEnter(suppress = Throwable.class)
129-
public static void handleException(
130-
@Advice.This HttpClientRequest request,
131-
@Advice.Argument(0) Throwable t,
132-
@Advice.Local("otelScope") Scope scope) {
133-
Contexts contexts = VirtualField.find(HttpClientRequest.class, Contexts.class).get(request);
140+
public static Scope handleException(
141+
@Advice.This HttpClientRequest request, @Advice.Argument(0) Throwable t) {
134142

143+
Contexts contexts = CONTEXTS.get(request);
135144
if (contexts == null) {
136-
return;
145+
return null;
137146
}
138-
139147
instrumenter().end(contexts.context, request, null, t);
140148

141149
// Scoping all potential callbacks etc to the parent context
142-
scope = contexts.parentContext.makeCurrent();
150+
return contexts.parentContext.makeCurrent();
143151
}
144152

145153
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
146-
public static void handleResponseExit(@Advice.Local("otelScope") Scope scope) {
154+
public static void handleResponseExit(@Advice.Enter @Nullable Scope scope) {
147155
if (scope != null) {
148156
scope.close();
149157
}
@@ -153,25 +161,23 @@ public static void handleResponseExit(@Advice.Local("otelScope") Scope scope) {
153161
@SuppressWarnings("unused")
154162
public static class HandleResponseAdvice {
155163

164+
@Nullable
156165
@Advice.OnMethodEnter(suppress = Throwable.class)
157-
public static void handleResponseEnter(
158-
@Advice.This HttpClientRequest request,
159-
@Advice.Argument(0) HttpClientResponse response,
160-
@Advice.Local("otelScope") Scope scope) {
161-
Contexts contexts = VirtualField.find(HttpClientRequest.class, Contexts.class).get(request);
166+
public static Scope handleResponseEnter(
167+
@Advice.This HttpClientRequest request, @Advice.Argument(0) HttpClientResponse response) {
162168

169+
Contexts contexts = CONTEXTS.get(request);
163170
if (contexts == null) {
164-
return;
171+
return null;
165172
}
166-
167173
instrumenter().end(contexts.context, request, response, null);
168174

169175
// Scoping all potential callbacks etc to the parent context
170-
scope = contexts.parentContext.makeCurrent();
176+
return contexts.parentContext.makeCurrent();
171177
}
172178

173179
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
174-
public static void handleResponseExit(@Advice.Local("otelScope") Scope scope) {
180+
public static void handleResponseExit(@Advice.Enter @Nullable Scope scope) {
175181
if (scope != null) {
176182
scope.close();
177183
}
@@ -181,19 +187,18 @@ public static void handleResponseExit(@Advice.Local("otelScope") Scope scope) {
181187
@SuppressWarnings("unused")
182188
public static class MountContextAdvice {
183189

190+
@Nullable
184191
@Advice.OnMethodEnter(suppress = Throwable.class)
185-
public static void mountContext(
186-
@Advice.This HttpClientRequest request, @Advice.Local("otelScope") Scope scope) {
187-
Contexts contexts = VirtualField.find(HttpClientRequest.class, Contexts.class).get(request);
192+
public static Scope mountContext(@Advice.This HttpClientRequest request) {
193+
Contexts contexts = CONTEXTS.get(request);
188194
if (contexts == null) {
189-
return;
195+
return null;
190196
}
191-
192-
scope = contexts.context.makeCurrent();
197+
return contexts.context.makeCurrent();
193198
}
194199

195200
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
196-
public static void unmountContext(@Advice.Local("otelScope") Scope scope) {
201+
public static void unmountContext(@Advice.Enter @Nullable Scope scope) {
197202
if (scope != null) {
198203
scope.close();
199204
}
@@ -203,15 +208,16 @@ public static void unmountContext(@Advice.Local("otelScope") Scope scope) {
203208
@SuppressWarnings("unused")
204209
public static class ExceptionHandlerAdvice {
205210

211+
@Nullable
212+
@AssignReturned.ToArguments(@ToArgument(0))
206213
@Advice.OnMethodEnter(suppress = Throwable.class)
207-
public static void wrapExceptionHandler(
214+
public static Handler<Throwable> wrapExceptionHandler(
208215
@Advice.This HttpClientRequest request,
209-
@Advice.Argument(value = 0, readOnly = false) Handler<Throwable> handler) {
210-
if (handler != null) {
211-
VirtualField<HttpClientRequest, Contexts> virtualField =
212-
VirtualField.find(HttpClientRequest.class, Contexts.class);
213-
handler = ExceptionHandlerWrapper.wrap(instrumenter(), request, virtualField, handler);
216+
@Advice.Argument(0) @Nullable Handler<Throwable> handler) {
217+
if (handler == null) {
218+
return null;
214219
}
220+
return ExceptionHandlerWrapper.wrap(instrumenter(), request, CONTEXTS, handler);
215221
}
216222
}
217223
}

instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxClientInstrumentationModule.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 VertxClientInstrumentationModule extends InstrumentationModule {
19+
public class VertxClientInstrumentationModule extends InstrumentationModule
20+
implements ExperimentalInstrumentationModule {
1921

2022
public VertxClientInstrumentationModule() {
2123
super("vertx-http-client", "vertx-http-client-3.0", "vertx");
@@ -34,4 +36,9 @@ public List<TypeInstrumentation> typeInstrumentations() {
3436
new HttpRequestImplInstrumentation(),
3537
new HttpRequestInstrumentation());
3638
}
39+
40+
@Override
41+
public boolean isIndyReady() {
42+
return true;
43+
}
3744
}

instrumentation/vertx/vertx-http-client/vertx-http-client-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v3_0/client/VertxClientSingletons.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,29 @@
66
package io.opentelemetry.javaagent.instrumentation.vertx.v3_0.client;
77

88
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
9+
import io.opentelemetry.instrumentation.api.util.VirtualField;
10+
import io.opentelemetry.javaagent.instrumentation.vertx.client.Contexts;
911
import io.opentelemetry.javaagent.instrumentation.vertx.client.VertxClientInstrumenterFactory;
12+
import io.vertx.core.http.HttpClientOptions;
1013
import io.vertx.core.http.HttpClientRequest;
1114
import io.vertx.core.http.HttpClientResponse;
15+
import io.vertx.core.http.impl.HttpClientImpl;
1216

1317
public final class VertxClientSingletons {
1418

1519
private static final Instrumenter<HttpClientRequest, HttpClientResponse> INSTRUMENTER =
1620
VertxClientInstrumenterFactory.create(
1721
"io.opentelemetry.vertx-http-client-3.0", new Vertx3HttpAttributesGetter());
1822

23+
public static final VirtualField<HttpClientRequest, Contexts> CONTEXTS =
24+
VirtualField.find(HttpClientRequest.class, Contexts.class);
25+
26+
public static final VirtualField<HttpClientRequest, VertxRequestInfo> REQUEST_INFO =
27+
VirtualField.find(HttpClientRequest.class, VertxRequestInfo.class);
28+
29+
public static final VirtualField<HttpClientImpl, HttpClientOptions> HTTP_CLIENT_OPTIONS =
30+
VirtualField.find(HttpClientImpl.class, HttpClientOptions.class);
31+
1932
public static Instrumenter<HttpClientRequest, HttpClientResponse> instrumenter() {
2033
return INSTRUMENTER;
2134
}

0 commit comments

Comments
 (0)