From faaf86b91b91ab737da74328e4fef023b3295618 Mon Sep 17 00:00:00 2001 From: Pavol Loffay Date: Mon, 8 Feb 2021 17:36:15 +0100 Subject: [PATCH] Fix classloading issue: put object holders into bootstrap classloader Signed-off-by: Pavol Loffay --- .../nowrapping/BodyCaptureAsyncListener.java | 11 ++- .../Servlet31NoWrappingInstrumentation.java | 18 ++--- ...vlet31NoWrappingInstrumentationModule.java | 8 +- .../servlet/v3_0/nowrapping/Utils.java | 35 ++++---- .../ServletRequestInstrumentation.java | 35 ++++---- .../response/ResponseStreamWriterHolder.java | 44 ---------- .../ServletResponseInstrumentation.java | 13 ++- .../reader/BufferedReaderInstrumentation.java | 1 + .../BufferedReaderInstrumentationTest.java | 3 +- .../src/test/java/org/TestBufferedReader.java | 34 ++++++++ .../SparkJavaBodyInstrumentationModule.java | 81 ------------------- .../instrumentation/SpanAndObjectPair.java | 27 ++----- 12 files changed, 103 insertions(+), 207 deletions(-) delete mode 100644 instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ResponseStreamWriterHolder.java create mode 100644 instrumentation/servlet/servlet-rw/src/test/java/org/TestBufferedReader.java delete mode 100644 instrumentation/spark-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/sparkjava/SparkJavaBodyInstrumentationModule.java rename instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/RequestStreamReaderHolder.java => javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/SpanAndObjectPair.java (50%) diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java index a83fd887b..cb12cdc53 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/BodyCaptureAsyncListener.java @@ -18,8 +18,6 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import java.io.BufferedReader; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicBoolean; @@ -34,6 +32,7 @@ import org.hypertrace.agent.config.Config.AgentConfig; import org.hypertrace.agent.core.config.HypertraceConfig; import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -45,11 +44,11 @@ public class BodyCaptureAsyncListener implements AsyncListener { private final AtomicBoolean responseHandled; private final Span span; - private final ContextStore responseContextStore; + private final ContextStore responseContextStore; private final ContextStore streamContextStore; private final ContextStore writerContextStore; - private final ContextStore requestContextStore; + private final ContextStore requestContextStore; private final ContextStore inputStreamContextStore; private final ContextStore readerContextStore; @@ -58,10 +57,10 @@ public class BodyCaptureAsyncListener implements AsyncListener { public BodyCaptureAsyncListener( AtomicBoolean responseHandled, Span span, - ContextStore responseContextStore, + ContextStore responseContextStore, ContextStore streamContextStore, ContextStore writerContextStore, - ContextStore requestContextStore, + ContextStore requestContextStore, ContextStore inputStreamContextStore, ContextStore readerContextStore) { this.responseHandled = responseHandled; diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java index 19278be69..83377141c 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentation.java @@ -28,8 +28,6 @@ import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.io.BufferedReader; import java.io.PrintWriter; @@ -51,6 +49,7 @@ import org.hypertrace.agent.config.Config.AgentConfig; import org.hypertrace.agent.core.config.HypertraceConfig; import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -103,8 +102,8 @@ public static boolean start( && ContentTypeUtils.shouldCapture(contentType)) { // The HttpServletRequest instrumentation uses this to // enable the instrumentation - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class) - .put(httpRequest, new RequestStreamReaderHolder(currentSpan)); + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class) + .put(httpRequest, new SpanAndObjectPair(currentSpan)); } Utils.addSessionId(currentSpan, httpRequest); @@ -152,18 +151,17 @@ public static void exit( HttpServletRequest httpRequest = (HttpServletRequest) request; AgentConfig agentConfig = HypertraceConfig.get(); + // response context to capture body and clear the context + ContextStore responseContextStore = + InstrumentationContext.get(HttpServletResponse.class, SpanAndObjectPair.class); ContextStore outputStreamContextStore = InstrumentationContext.get(ServletOutputStream.class, BoundedByteArrayOutputStream.class); ContextStore writerContextStore = InstrumentationContext.get(PrintWriter.class, BoundedCharArrayWriter.class); - // response context to capture body and clear the context - ContextStore responseContextStore = - InstrumentationContext.get(HttpServletResponse.class, ResponseStreamWriterHolder.class); - // request context to clear body buffer - ContextStore requestContextStore = - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class); + ContextStore requestContextStore = + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class); ContextStore inputStreamContextStore = InstrumentationContext.get(ServletInputStream.class, ByteBufferSpanPair.class); ContextStore readerContextStore = diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java index a92acd13d..36a773ed7 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Servlet31NoWrappingInstrumentationModule.java @@ -19,10 +19,8 @@ import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletInputStreamInstrumentation; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletRequestInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletOutputStreamInstrumentation; import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletResponseInstrumentation; import io.opentelemetry.javaagent.tooling.InstrumentationModule; @@ -32,6 +30,7 @@ import java.util.List; import java.util.Map; import net.bytebuddy.matcher.ElementMatcher; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -68,13 +67,12 @@ public List typeInstrumentations() { protected Map contextStore() { Map context = new HashMap<>(); // capture request body - context.put("javax.servlet.http.HttpServletRequest", RequestStreamReaderHolder.class.getName()); + context.put("javax.servlet.http.HttpServletRequest", SpanAndObjectPair.class.getName()); context.put("javax.servlet.ServletInputStream", ByteBufferSpanPair.class.getName()); context.put("java.io.BufferedReader", CharBufferSpanPair.class.getName()); // capture response body - context.put( - "javax.servlet.http.HttpServletResponse", ResponseStreamWriterHolder.class.getName()); + context.put("javax.servlet.http.HttpServletResponse", SpanAndObjectPair.class.getName()); context.put("javax.servlet.ServletOutputStream", BoundedByteArrayOutputStream.class.getName()); context.put("java.io.PrintWriter", BoundedCharArrayWriter.class.getName()); return context; diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java index 8e7baa82c..f102c4f60 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/Utils.java @@ -18,8 +18,6 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; @@ -29,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; @@ -50,19 +49,19 @@ public static void addSessionId(Span span, HttpServletRequest httpRequest) { public static void captureResponseBody( Span span, HttpServletResponse httpServletResponse, - ContextStore responseContextStore, + ContextStore responseContextStore, ContextStore streamContextStore, ContextStore writerContextStore) { - ResponseStreamWriterHolder responseStreamWriterHolder = - responseContextStore.get(httpServletResponse); + SpanAndObjectPair responseStreamWriterHolder = responseContextStore.get(httpServletResponse); if (responseStreamWriterHolder == null) { return; } responseContextStore.put(httpServletResponse, null); - if (responseStreamWriterHolder.getServletOutputStream() != null) { - ServletOutputStream servletOutputStream = responseStreamWriterHolder.getServletOutputStream(); + if (responseStreamWriterHolder.getAssociatedObject() instanceof ServletOutputStream) { + ServletOutputStream servletOutputStream = + (ServletOutputStream) responseStreamWriterHolder.getAssociatedObject(); BoundedByteArrayOutputStream buffer = streamContextStore.get(servletOutputStream); if (buffer != null) { try { @@ -74,10 +73,8 @@ public static void captureResponseBody( } streamContextStore.put(servletOutputStream, null); } - } - - if (responseStreamWriterHolder.getPrintWriter() != null) { - PrintWriter printWriter = responseStreamWriterHolder.getPrintWriter(); + } else if (responseStreamWriterHolder.getAssociatedObject() instanceof PrintWriter) { + PrintWriter printWriter = (PrintWriter) responseStreamWriterHolder.getAssociatedObject(); BoundedCharArrayWriter buffer = writerContextStore.get(printWriter); if (buffer != null) { span.setAttribute(HypertraceSemanticAttributes.HTTP_RESPONSE_BODY, buffer.toString()); @@ -88,22 +85,22 @@ public static void captureResponseBody( public static void resetRequestBodyBuffers( HttpServletRequest httpServletRequest, - ContextStore requestContextStore, + ContextStore requestContextStore, ContextStore streamContextStore, ContextStore bufferedReaderContextStore) { - RequestStreamReaderHolder requestStreamReaderHolder = - requestContextStore.get(httpServletRequest); + SpanAndObjectPair requestStreamReaderHolder = requestContextStore.get(httpServletRequest); if (requestContextStore == null) { return; } requestContextStore.put(httpServletRequest, null); - if (requestStreamReaderHolder.getServletInputStream() != null) { - streamContextStore.put(requestStreamReaderHolder.getServletInputStream(), null); - } - if (requestStreamReaderHolder.getBufferedReader() != null) { - bufferedReaderContextStore.put(requestStreamReaderHolder.getBufferedReader(), null); + if (requestStreamReaderHolder.getAssociatedObject() instanceof ServletInputStream) { + streamContextStore.put( + (ServletInputStream) requestStreamReaderHolder.getAssociatedObject(), null); + } else if (requestStreamReaderHolder.getAssociatedObject() instanceof BufferedReader) { + bufferedReaderContextStore.put( + (BufferedReader) requestStreamReaderHolder.getAssociatedObject(), null); } } } diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java index ec8dbe4fc..f28019c98 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/ServletRequestInstrumentation.java @@ -37,6 +37,7 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher.Junction; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair; import org.hypertrace.agent.core.instrumentation.buffer.CharBufferSpanPair; @@ -67,11 +68,11 @@ public Map, String> transfor static class ServletRequest_getInputStream_advice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static RequestStreamReaderHolder enter(@Advice.This ServletRequest servletRequest) { + public static SpanAndObjectPair enter(@Advice.This ServletRequest servletRequest) { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; // span is added in servlet/filter instrumentation if data capture is enabled - RequestStreamReaderHolder requestBufferWrapper = - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class) + SpanAndObjectPair requestBufferWrapper = + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class) .get(httpServletRequest); if (requestBufferWrapper == null) { return null; @@ -87,9 +88,9 @@ public static void exit( @Advice.This ServletRequest servletRequest, @Advice.Return ServletInputStream servletInputStream, @Advice.Thrown Throwable throwable, - @Advice.Enter RequestStreamReaderHolder requestStreamReaderHolder) { + @Advice.Enter SpanAndObjectPair spanAndObjectPair) { - if (requestStreamReaderHolder == null) { + if (spanAndObjectPair == null) { return; } @@ -111,26 +112,25 @@ public static void exit( } ByteBufferSpanPair bufferSpanPair = - Utils.createRequestByteBufferSpanPair( - httpServletRequest, requestStreamReaderHolder.getSpan()); + Utils.createRequestByteBufferSpanPair(httpServletRequest, spanAndObjectPair.getSpan()); contextStore.put(servletInputStream, bufferSpanPair); - requestStreamReaderHolder.setServletInputStream(servletInputStream); + spanAndObjectPair.setAssociatedObject(servletInputStream); } } static class ServletRequest_getReader_advice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static RequestStreamReaderHolder enter(@Advice.This ServletRequest servletRequest) { + public static SpanAndObjectPair enter(@Advice.This ServletRequest servletRequest) { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; - RequestStreamReaderHolder requestStreamReaderHolder = - InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class) + SpanAndObjectPair spanAndObjectPair = + InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class) .get(httpServletRequest); - if (requestStreamReaderHolder == null) { + if (spanAndObjectPair == null) { return null; } CallDepthThreadLocalMap.incrementCallDepth(ServletRequest.class); - return requestStreamReaderHolder; + return spanAndObjectPair; } @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) @@ -138,9 +138,9 @@ public static void exit( @Advice.This ServletRequest servletRequest, @Advice.Return BufferedReader reader, @Advice.Thrown Throwable throwable, - @Advice.Enter RequestStreamReaderHolder requestStreamReaderHolder) { + @Advice.Enter SpanAndObjectPair spanAndObjectPair) { - if (requestStreamReaderHolder == null) { + if (spanAndObjectPair == null) { return; } @@ -162,10 +162,9 @@ public static void exit( } CharBufferSpanPair bufferSpanPair = - Utils.createRequestCharBufferSpanPair( - httpServletRequest, requestStreamReaderHolder.getSpan()); + Utils.createRequestCharBufferSpanPair(httpServletRequest, spanAndObjectPair.getSpan()); contextStore.put(reader, bufferSpanPair); - requestStreamReaderHolder.setBufferedReader(reader); + spanAndObjectPair.setAssociatedObject(reader); } } } diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ResponseStreamWriterHolder.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ResponseStreamWriterHolder.java deleted file mode 100644 index 370aa47f1..000000000 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ResponseStreamWriterHolder.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response; - -import java.io.PrintWriter; -import javax.servlet.ServletOutputStream; - -public class ResponseStreamWriterHolder { - - private final ServletOutputStream servletOutputStream; - private final PrintWriter printWriter; - - public ResponseStreamWriterHolder(ServletOutputStream servletOutputStream) { - this.servletOutputStream = servletOutputStream; - this.printWriter = null; - } - - public ResponseStreamWriterHolder(PrintWriter printWriter) { - this.printWriter = printWriter; - this.servletOutputStream = null; - } - - public ServletOutputStream getServletOutputStream() { - return servletOutputStream; - } - - public PrintWriter getPrintWriter() { - return printWriter; - } -} diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java index 39e16956d..57c658f96 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/response/ServletResponseInstrumentation.java @@ -41,6 +41,7 @@ import net.bytebuddy.matcher.ElementMatcher.Junction; import org.hypertrace.agent.config.Config.AgentConfig; import org.hypertrace.agent.core.config.HypertraceConfig; +import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair; import org.hypertrace.agent.core.instrumentation.buffer.BoundedBuffersFactory; import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream; import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter; @@ -124,8 +125,10 @@ public static void exit( Charset charset = ContentTypeCharsetUtils.toCharset(charsetStr); BoundedByteArrayOutputStream buffer = BoundedBuffersFactory.createStream(charset); contextStore.put(servletOutputStream, buffer); - InstrumentationContext.get(HttpServletResponse.class, ResponseStreamWriterHolder.class) - .put(httpServletResponse, new ResponseStreamWriterHolder(servletOutputStream)); + SpanAndObjectPair spanAndObjectPair = new SpanAndObjectPair(null); + spanAndObjectPair.setAssociatedObject(servletOutputStream); + InstrumentationContext.get(HttpServletResponse.class, SpanAndObjectPair.class) + .put(httpServletResponse, spanAndObjectPair); } } } @@ -179,8 +182,10 @@ public static void exit( BoundedCharArrayWriter writer = BoundedBuffersFactory.createWriter(); contextStore.put(printWriter, writer); - InstrumentationContext.get(HttpServletResponse.class, ResponseStreamWriterHolder.class) - .put(httpServletResponse, new ResponseStreamWriterHolder(printWriter)); + SpanAndObjectPair spanAndObjectPair = new SpanAndObjectPair(null); + spanAndObjectPair.setAssociatedObject(printWriter); + InstrumentationContext.get(HttpServletResponse.class, SpanAndObjectPair.class) + .put(httpServletResponse, spanAndObjectPair); } } } diff --git a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java index fb4712ae0..e0d16bea3 100644 --- a/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java +++ b/instrumentation/servlet/servlet-rw/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentation.java @@ -200,6 +200,7 @@ public static void exit( return; } + System.out.println("Capturing readLine"); if (line == null) { bufferSpanPair.captureBody(HypertraceSemanticAttributes.HTTP_REQUEST_BODY); } else { diff --git a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java index 1822dbe3f..1b868e039 100644 --- a/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java +++ b/instrumentation/servlet/servlet-rw/src/test/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/rw/reader/BufferedReaderInstrumentationTest.java @@ -21,6 +21,7 @@ import java.io.CharArrayReader; import java.io.IOException; import org.BufferedReaderPrintWriterContextAccess; +import org.TestBufferedReader; import org.hypertrace.agent.core.instrumentation.buffer.*; import org.hypertrace.agent.testing.AbstractInstrumenterTest; import org.junit.jupiter.api.Assertions; @@ -119,7 +120,7 @@ public void readLine() throws IOException { Span span = TEST_TRACER.spanBuilder(TEST_SPAN_NAME).startSpan(); BufferedReader bufferedReader = - new BufferedReader(new CharArrayReader((BODY + "\n").toCharArray())); + new TestBufferedReader(new CharArrayReader((BODY + "\n").toCharArray())); BoundedCharArrayWriter buffer = BoundedBuffersFactory.createWriter(); CharBufferSpanPair bufferSpanPair = new CharBufferSpanPair(span, buffer); diff --git a/instrumentation/servlet/servlet-rw/src/test/java/org/TestBufferedReader.java b/instrumentation/servlet/servlet-rw/src/test/java/org/TestBufferedReader.java new file mode 100644 index 000000000..2d28f5e90 --- /dev/null +++ b/instrumentation/servlet/servlet-rw/src/test/java/org/TestBufferedReader.java @@ -0,0 +1,34 @@ +/* + * Copyright The Hypertrace Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; + +public class TestBufferedReader extends BufferedReader { + + public TestBufferedReader(Reader in) { + super(in); + } + + @Override + public String readLine() throws IOException { + System.out.println("override readline"); + return super.readLine(); + } +} diff --git a/instrumentation/spark-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/sparkjava/SparkJavaBodyInstrumentationModule.java b/instrumentation/spark-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/sparkjava/SparkJavaBodyInstrumentationModule.java deleted file mode 100644 index 41f0828fb..000000000 --- a/instrumentation/spark-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/sparkjava/SparkJavaBodyInstrumentationModule.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright The Hypertrace Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.opentelemetry.javaagent.instrumentation.hypertrace.sparkjava; - -import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.Servlet31NoWrappingInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.Servlet31NoWrappingInstrumentationModule; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletInputStreamInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletRequestInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletOutputStreamInstrumentation; -import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletResponseInstrumentation; -import io.opentelemetry.javaagent.tooling.InstrumentationModule; -import io.opentelemetry.javaagent.tooling.TypeInstrumentation; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** - * {@code Spark.after} is not being called if a handler throws an exception. Exception handler - * {@code Spark.exception} cannot be used because it overrides user defined exception handlers. This - * might be fine as on exception there is usually not body send to users. - */ -@AutoService(InstrumentationModule.class) -public class SparkJavaBodyInstrumentationModule extends Servlet31NoWrappingInstrumentationModule { - - @Override - public int getOrder() { - return 1; - } - - @Override - public List typeInstrumentations() { - return Arrays.asList( - new SparkJavaBodyInstrumentation(), - new Servlet31NoWrappingInstrumentation(), - new ServletRequestInstrumentation(), - new ServletInputStreamInstrumentation(), - new ServletResponseInstrumentation(), - new ServletOutputStreamInstrumentation()); - } - - private static class SparkJavaBodyInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher typeMatcher() { - return named("spark.webserver.MatcherFilter").or(named("spark.http.matching.MatcherFilter")); - } - - @Override - public Map, String> transformers() { - return singletonMap( - namedOneOf("doFilter") - .and(takesArgument(0, named("javax.servlet.ServletRequest"))) - .and(takesArgument(1, named("javax.servlet.ServletResponse"))) - .and(isPublic()), - Servlet31NoWrappingInstrumentation.ServletAdvice.class.getName()); - } - } -} diff --git a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/RequestStreamReaderHolder.java b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/SpanAndObjectPair.java similarity index 50% rename from instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/RequestStreamReaderHolder.java rename to javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/SpanAndObjectPair.java index a2b8b252e..ef8f4f3ce 100644 --- a/instrumentation/servlet/servlet-3.0-no-wrapping/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/servlet/v3_0/nowrapping/request/RequestStreamReaderHolder.java +++ b/javaagent-core/src/main/java/org/hypertrace/agent/core/instrumentation/SpanAndObjectPair.java @@ -14,19 +14,16 @@ * limitations under the License. */ -package io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request; +package org.hypertrace.agent.core.instrumentation; import io.opentelemetry.api.trace.Span; -import java.io.BufferedReader; -import javax.servlet.ServletInputStream; -public class RequestStreamReaderHolder { +public class SpanAndObjectPair { private final Span span; - private ServletInputStream servletInputStream; - private BufferedReader bufferedReader; + private Object associatedObject; - public RequestStreamReaderHolder(Span span) { + public SpanAndObjectPair(Span span) { this.span = span; } @@ -34,19 +31,11 @@ public Span getSpan() { return span; } - public ServletInputStream getServletInputStream() { - return servletInputStream; + public Object getAssociatedObject() { + return associatedObject; } - public void setServletInputStream(ServletInputStream servletInputStream) { - this.servletInputStream = servletInputStream; - } - - public BufferedReader getBufferedReader() { - return bufferedReader; - } - - public void setBufferedReader(BufferedReader bufferedReader) { - this.bufferedReader = bufferedReader; + public void setAssociatedObject(Object associatedObject) { + this.associatedObject = associatedObject; } }