Skip to content

Commit d004d6d

Browse files
authored
Capture servlet request bodies explicitly (#270)
Signed-off-by: Pavol Loffay <p.loffay@gmail.com>
1 parent dad264d commit d004d6d

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,24 @@ public static void resetRequestBodyBuffers(
9696
requestContextStore.put(httpServletRequest, null);
9797

9898
if (requestStreamReaderHolder.getAssociatedObject() instanceof ServletInputStream) {
99-
streamContextStore.put(
100-
(ServletInputStream) requestStreamReaderHolder.getAssociatedObject(), null);
99+
ServletInputStream servletInputStream =
100+
(ServletInputStream) requestStreamReaderHolder.getAssociatedObject();
101+
ByteBufferSpanPair byteBufferSpanPair = streamContextStore.get(servletInputStream);
102+
if (byteBufferSpanPair != null) {
103+
// capture body explicitly e.g. Jackson does not call ServletInputStream$read() until -1 is
104+
// returned
105+
// it does not even call ServletInputStream#available()
106+
byteBufferSpanPair.captureBody(HypertraceSemanticAttributes.HTTP_REQUEST_BODY);
107+
streamContextStore.put(servletInputStream, null);
108+
}
101109
} else if (requestStreamReaderHolder.getAssociatedObject() instanceof BufferedReader) {
102-
bufferedReaderContextStore.put(
103-
(BufferedReader) requestStreamReaderHolder.getAssociatedObject(), null);
110+
BufferedReader bufferedReader =
111+
(BufferedReader) requestStreamReaderHolder.getAssociatedObject();
112+
CharBufferSpanPair charBufferSpanPair = bufferedReaderContextStore.get(bufferedReader);
113+
if (charBufferSpanPair != null) {
114+
charBufferSpanPair.captureBody(HypertraceSemanticAttributes.HTTP_REQUEST_BODY);
115+
bufferedReaderContextStore.put(bufferedReader, null);
116+
}
104117
}
105118
}
106119
}

instrumentation/servlet/servlet-3.0-no-wrapping/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet30NoWrappingInstrumentationTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818

1919
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoAsyncResponse_stream;
2020
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoAsyncResponse_writer;
21+
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoReader_read_large_array;
2122
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoStream_arr;
2223
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoStream_arr_offset;
2324
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoStream_readLine_print;
25+
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoStream_read_large_array;
2426
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoStream_single_byte;
2527
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.EchoWriter_single_char;
2628
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.TestServlets.GetHello;
@@ -73,6 +75,8 @@ public static void startServer() throws Exception {
7375
handler.addServlet(TestServlets.Forward_to_post.class, "/forward_to_echo");
7476
handler.addServlet(EchoAsyncResponse_stream.class, "/echo_async_response_stream");
7577
handler.addServlet(EchoAsyncResponse_writer.class, "/echo_async_response_writer");
78+
handler.addServlet(EchoStream_read_large_array.class, "/echo_stream_read_large_array");
79+
handler.addServlet(EchoReader_read_large_array.class, "/echo_reader_read_large_array");
7680
server.setHandler(handler);
7781
server.start();
7882
serverPort = server.getConnectors()[0].getLocalPort();
@@ -103,6 +107,16 @@ public void postJson_stream_single_byte() throws Exception {
103107
postJson(String.format("http://localhost:%d/echo_stream_single_byte", serverPort));
104108
}
105109

110+
@Test
111+
public void postJson_stream_read_large_array() throws Exception {
112+
postJson(String.format("http://localhost:%d/echo_stream_read_large_array", serverPort));
113+
}
114+
115+
@Test
116+
public void postJson_reader_read_large_array() throws Exception {
117+
postJson(String.format("http://localhost:%d/echo_reader_read_large_array", serverPort));
118+
}
119+
106120
@Test
107121
public void postJson_stream_arr() throws Exception {
108122
postJson(String.format("http://localhost:%d/echo_stream_arr", serverPort));

instrumentation/servlet/servlet-3.0-no-wrapping/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/TestServlets.java

+26
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,30 @@ protected void service(HttpServletRequest req, HttpServletResponse resp)
265265
req.getRequestDispatcher("/echo_stream_single_byte").forward(req, resp);
266266
}
267267
}
268+
269+
public static class EchoStream_read_large_array extends HttpServlet {
270+
@Override
271+
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
272+
req.getInputStream().read(new byte[1000], 0, 1000);
273+
274+
resp.setStatus(200);
275+
resp.setContentType("application/json");
276+
resp.setHeader(RESPONSE_HEADER, RESPONSE_HEADER_VALUE);
277+
278+
resp.getWriter().print(RESPONSE_BODY.toCharArray());
279+
}
280+
}
281+
282+
public static class EchoReader_read_large_array extends HttpServlet {
283+
@Override
284+
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
285+
req.getReader().read(new char[1000], 0, 1000);
286+
287+
resp.setStatus(200);
288+
resp.setContentType("application/json");
289+
resp.setHeader(RESPONSE_HEADER, RESPONSE_HEADER_VALUE);
290+
291+
resp.getWriter().print(RESPONSE_BODY.toCharArray());
292+
}
293+
}
268294
}

0 commit comments

Comments
 (0)