Skip to content

Commit de11929

Browse files
authored
Simplify jetty9 http client instrumentation (#11595)
1 parent 1565d18 commit de11929

File tree

4 files changed

+54
-69
lines changed

4 files changed

+54
-69
lines changed

instrumentation/jetty-httpclient/jetty-httpclient-9.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/httpclient/v9_2/JettyHttpClient9Instrumentation.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import io.opentelemetry.context.Context;
1616
import io.opentelemetry.context.Scope;
17-
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyHttpClient9TracingInterceptor;
17+
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientTracingListener;
1818
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1919
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
2020
import java.util.List;
@@ -50,19 +50,13 @@ public static void addTracingEnter(
5050
@Advice.Local("otelContext") Context context,
5151
@Advice.Local("otelScope") Scope scope) {
5252
Context parentContext = currentContext();
53-
if (!instrumenter().shouldStart(parentContext, httpRequest)) {
53+
context =
54+
JettyClientTracingListener.handleRequest(parentContext, httpRequest, instrumenter());
55+
if (context == null) {
5456
return;
5557
}
5658

57-
// First step is to attach the tracer to the Jetty request. Request listeners are wrapped here
58-
JettyHttpClient9TracingInterceptor requestInterceptor =
59-
new JettyHttpClient9TracingInterceptor(parentContext, instrumenter());
60-
requestInterceptor.attachToRequest(httpRequest);
61-
62-
// Second step is to wrap all the important result callback
6359
listeners = wrapResponseListeners(parentContext, listeners);
64-
65-
context = requestInterceptor.getContext();
6660
scope = context.makeCurrent();
6761
}
6862

instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/TracingHttpClient.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import io.opentelemetry.context.Context;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
12-
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyHttpClient9TracingInterceptor;
12+
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientTracingListener;
1313
import java.util.List;
1414
import org.eclipse.jetty.client.HttpClient;
1515
import org.eclipse.jetty.client.HttpClientTransport;
@@ -60,10 +60,12 @@ static TracingHttpClient buildNew(
6060
@Override
6161
protected void send(HttpRequest request, List<Response.ResponseListener> listeners) {
6262
Context parentContext = Context.current();
63-
JettyHttpClient9TracingInterceptor requestInterceptor =
64-
new JettyHttpClient9TracingInterceptor(parentContext, this.instrumenter);
65-
requestInterceptor.attachToRequest(request);
66-
List<Response.ResponseListener> wrapped = wrapResponseListeners(parentContext, listeners);
67-
super.send(request, wrapped);
63+
Context context =
64+
JettyClientTracingListener.handleRequest(parentContext, request, instrumenter);
65+
// wrap listeners only when a span was started (context is not null)
66+
if (context != null) {
67+
listeners = wrapResponseListeners(parentContext, listeners);
68+
}
69+
super.send(request, listeners);
6870
}
6971
}
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,26 @@
1515
import java.util.ListIterator;
1616
import java.util.logging.Logger;
1717
import javax.annotation.Nullable;
18+
import org.eclipse.jetty.client.HttpRequest;
1819
import org.eclipse.jetty.client.api.Request;
1920
import org.eclipse.jetty.client.api.Response;
2021

2122
/**
22-
* JettyHttpClient9TracingInterceptor does three jobs stimulated from the Jetty Request object from
23-
* attachToRequest() 1. Start the CLIENT span and create the tracer 2. Set the listener callbacks
24-
* for each important lifecycle actions that would cause the start and close of the span 3. Set
25-
* callback wrappers on two important request-based callbacks
23+
* JettyClientTracingListener performs three actions when {@link #handleRequest(Context,
24+
* HttpRequest, Instrumenter)} is called 1. Start the CLIENT span 2. Set the listener callbacks for
25+
* each lifecycle action that signal end of the request 3. Wrap request listeners to propagate
26+
* context into the listeners
2627
*
2728
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
2829
* at any time.
2930
*/
30-
public final class JettyHttpClient9TracingInterceptor
31+
public final class JettyClientTracingListener
3132
implements Request.BeginListener,
3233
Request.FailureListener,
3334
Response.SuccessListener,
3435
Response.FailureListener {
3536

36-
private static final Logger logger =
37-
Logger.getLogger(JettyHttpClient9TracingInterceptor.class.getName());
37+
private static final Logger logger = Logger.getLogger(JettyClientTracingListener.class.getName());
3838

3939
private static final Class<?>[] requestlistenerInterfaces = {
4040
Request.BeginListener.class,
@@ -46,46 +46,48 @@ public final class JettyHttpClient9TracingInterceptor
4646
Request.QueuedListener.class
4747
};
4848

49-
@Nullable private Context context;
50-
51-
@Nullable
52-
public Context getContext() {
53-
return this.context;
54-
}
55-
56-
private final Context parentContext;
57-
49+
private final Context context;
5850
private final Instrumenter<Request, Response> instrumenter;
5951

60-
public JettyHttpClient9TracingInterceptor(
61-
Context parentCtx, Instrumenter<Request, Response> instrumenter) {
62-
this.parentContext = parentCtx;
52+
private JettyClientTracingListener(
53+
Context context, Instrumenter<Request, Response> instrumenter) {
54+
this.context = context;
6355
this.instrumenter = instrumenter;
6456
}
6557

66-
public void attachToRequest(Request jettyRequest) {
67-
List<JettyHttpClient9TracingInterceptor> current =
68-
jettyRequest.getRequestListeners(JettyHttpClient9TracingInterceptor.class);
69-
58+
@Nullable
59+
public static Context handleRequest(
60+
Context parentContext, HttpRequest request, Instrumenter<Request, Response> instrumenter) {
61+
List<JettyClientTracingListener> current =
62+
request.getRequestListeners(JettyClientTracingListener.class);
7063
if (!current.isEmpty()) {
71-
logger.warning("A tracing interceptor is already in place for this request!");
72-
return;
64+
logger.warning("A tracing request listener is already in place for this request!");
65+
return null;
66+
}
67+
68+
if (!instrumenter.shouldStart(parentContext, request)) {
69+
return null;
7370
}
74-
startSpan(jettyRequest);
71+
72+
Context context = instrumenter.start(parentContext, request);
7573

7674
// wrap all important request-based listeners that may already be attached, null should ensure
77-
// are returned here
78-
List<Request.RequestListener> existingListeners = jettyRequest.getRequestListeners(null);
79-
wrapRequestListeners(existingListeners);
80-
81-
jettyRequest
82-
.onRequestBegin(this)
83-
.onRequestFailure(this)
84-
.onResponseFailure(this)
85-
.onResponseSuccess(this);
75+
// that all listeners are returned here
76+
List<Request.RequestListener> existingListeners = request.getRequestListeners(null);
77+
wrapRequestListeners(existingListeners, context);
78+
79+
JettyClientTracingListener listener = new JettyClientTracingListener(context, instrumenter);
80+
request
81+
.onRequestBegin(listener)
82+
.onRequestFailure(listener)
83+
.onResponseFailure(listener)
84+
.onResponseSuccess(listener);
85+
86+
return context;
8687
}
8788

88-
private void wrapRequestListeners(List<Request.RequestListener> requestListeners) {
89+
private static void wrapRequestListeners(
90+
List<Request.RequestListener> requestListeners, Context context) {
8991
ListIterator<Request.RequestListener> iterator = requestListeners.listIterator();
9092

9193
while (iterator.hasNext()) {
@@ -121,34 +123,21 @@ private void wrapRequestListeners(List<Request.RequestListener> requestListeners
121123
}
122124
}
123125

124-
private void startSpan(Request request) {
125-
if (!instrumenter.shouldStart(this.parentContext, request)) {
126-
return;
127-
}
128-
this.context = instrumenter.start(this.parentContext, request);
129-
}
130-
131126
@Override
132127
public void onBegin(Request request) {}
133128

134129
@Override
135130
public void onSuccess(Response response) {
136-
if (this.context != null) {
137-
instrumenter.end(this.context, response.getRequest(), response, null);
138-
}
131+
instrumenter.end(this.context, response.getRequest(), response, null);
139132
}
140133

141134
@Override
142135
public void onFailure(Request request, Throwable t) {
143-
if (this.context != null) {
144-
instrumenter.end(this.context, request, null, t);
145-
}
136+
instrumenter.end(this.context, request, null, t);
146137
}
147138

148139
@Override
149140
public void onFailure(Response response, Throwable t) {
150-
if (this.context != null) {
151-
instrumenter.end(this.context, response.getRequest(), response, t);
152-
}
141+
instrumenter.end(this.context, response.getRequest(), response, t);
153142
}
154143
}

instrumentation/jetty-httpclient/jetty-httpclient-9.2/library/src/main/java/io/opentelemetry/instrumentation/jetty/httpclient/v9_2/internal/JettyClientWrapUtil.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static List<Response.ResponseListener> wrapResponseListeners(
5050

5151
private static Response.ResponseListener wrapTheListener(
5252
Response.ResponseListener listener, Context context) {
53-
if (listener == null || listener instanceof JettyHttpClient9TracingInterceptor) {
53+
if (listener == null || listener instanceof JettyClientTracingListener) {
5454
return listener;
5555
}
5656

0 commit comments

Comments
 (0)