Skip to content

Commit 4041d03

Browse files
breedx-splktrask
authored andcommitted
Guard against null HttpContext (open-telemetry#6792)
Resolves open-telemetry#6787 Co-authored-by: Trask Stalnaker <[email protected]>
1 parent 7ed0482 commit 4041d03

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
2121
import java.io.IOException;
2222
import java.util.logging.Logger;
23+
import javax.annotation.Nullable;
2324
import net.bytebuddy.asm.Advice;
2425
import net.bytebuddy.description.type.TypeDescription;
2526
import net.bytebuddy.matcher.ElementMatcher;
@@ -148,7 +149,7 @@ public static class WrappedFutureCallback<T> implements FutureCallback<T> {
148149
private static final Logger logger = Logger.getLogger(WrappedFutureCallback.class.getName());
149150

150151
private final Context parentContext;
151-
private final HttpContext httpContext;
152+
@Nullable private final HttpContext httpContext;
152153
private final FutureCallback<T> delegate;
153154

154155
private volatile Context context;
@@ -171,7 +172,7 @@ public void completed(T result) {
171172
return;
172173
}
173174

174-
instrumenter().end(context, otelRequest, getResponse(httpContext), null);
175+
instrumenter().end(context, otelRequest, getResponseFromHttpContext(), null);
175176

176177
if (parentContext == null) {
177178
completeDelegate(result);
@@ -193,7 +194,7 @@ public void failed(Exception ex) {
193194
}
194195

195196
// end span before calling delegate
196-
instrumenter().end(context, otelRequest, getResponse(httpContext), ex);
197+
instrumenter().end(context, otelRequest, getResponseFromHttpContext(), ex);
197198

198199
if (parentContext == null) {
199200
failDelegate(ex);
@@ -216,7 +217,7 @@ public void cancelled() {
216217

217218
// TODO (trask) add "canceled" span attribute
218219
// end span before calling delegate
219-
instrumenter().end(context, otelRequest, getResponse(httpContext), null);
220+
instrumenter().end(context, otelRequest, getResponseFromHttpContext(), null);
220221

221222
if (parentContext == null) {
222223
cancelDelegate();
@@ -246,8 +247,12 @@ private void cancelDelegate() {
246247
}
247248
}
248249

249-
private static HttpResponse getResponse(HttpContext context) {
250-
return (HttpResponse) context.getAttribute(HttpCoreContext.HTTP_RESPONSE);
250+
@Nullable
251+
private HttpResponse getResponseFromHttpContext() {
252+
if (httpContext == null) {
253+
return null;
254+
}
255+
return (HttpResponse) httpContext.getAttribute(HttpCoreContext.HTTP_RESPONSE);
251256
}
252257
}
253258
}

instrumentation/apache-httpclient/apache-httpclient-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpclient/v5_0/ApacheHttpAsyncClientInstrumentation.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
2222
import java.io.IOException;
2323
import java.util.logging.Logger;
24+
import javax.annotation.Nullable;
2425
import net.bytebuddy.asm.Advice;
2526
import net.bytebuddy.description.type.TypeDescription;
2627
import net.bytebuddy.matcher.ElementMatcher;
@@ -32,6 +33,7 @@
3233
import org.apache.hc.core5.http.nio.AsyncRequestProducer;
3334
import org.apache.hc.core5.http.nio.DataStreamChannel;
3435
import org.apache.hc.core5.http.nio.RequestChannel;
36+
import org.apache.hc.core5.http.protocol.BasicHttpContext;
3537
import org.apache.hc.core5.http.protocol.HttpContext;
3638
import org.apache.hc.core5.http.protocol.HttpCoreContext;
3739

@@ -67,10 +69,13 @@ public static class ClientAdvice {
6769
@Advice.OnMethodEnter(suppress = Throwable.class)
6870
public static void methodEnter(
6971
@Advice.Argument(value = 0, readOnly = false) AsyncRequestProducer requestProducer,
70-
@Advice.Argument(3) HttpContext httpContext,
72+
@Advice.Argument(value = 3, readOnly = false) HttpContext httpContext,
7173
@Advice.Argument(value = 4, readOnly = false) FutureCallback<?> futureCallback) {
7274

7375
Context parentContext = currentContext();
76+
if (httpContext == null) {
77+
httpContext = new BasicHttpContext();
78+
}
7479

7580
WrappedFutureCallback<?> wrappedFutureCallback =
7681
new WrappedFutureCallback<>(parentContext, httpContext, futureCallback);
@@ -182,7 +187,7 @@ public void completed(T result) {
182187
return;
183188
}
184189

185-
instrumenter().end(context, httpRequest, getResponse(httpContext), null);
190+
instrumenter().end(context, httpRequest, getResponseFromHttpContext(), null);
186191

187192
if (parentContext == null) {
188193
completeDelegate(result);
@@ -204,7 +209,7 @@ public void failed(Exception ex) {
204209
}
205210

206211
// end span before calling delegate
207-
instrumenter().end(context, httpRequest, getResponse(httpContext), ex);
212+
instrumenter().end(context, httpRequest, getResponseFromHttpContext(), ex);
208213

209214
if (parentContext == null) {
210215
failDelegate(ex);
@@ -227,7 +232,7 @@ public void cancelled() {
227232

228233
// TODO (trask) add "canceled" span attribute
229234
// end span before calling delegate
230-
instrumenter().end(context, httpRequest, getResponse(httpContext), null);
235+
instrumenter().end(context, httpRequest, getResponseFromHttpContext(), null);
231236

232237
if (parentContext == null) {
233238
cancelDelegate();
@@ -257,8 +262,9 @@ private void cancelDelegate() {
257262
}
258263
}
259264

260-
private static HttpResponse getResponse(HttpContext context) {
261-
return (HttpResponse) context.getAttribute(HttpCoreContext.HTTP_RESPONSE);
265+
@Nullable
266+
private HttpResponse getResponseFromHttpContext() {
267+
return (HttpResponse) httpContext.getAttribute(HttpCoreContext.HTTP_RESPONSE);
262268
}
263269
}
264270
}

0 commit comments

Comments
 (0)