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 extends ElementMatcher super MethodDescription>, 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 super TypeDescription> typeMatcher() {
- return named("spark.webserver.MatcherFilter").or(named("spark.http.matching.MatcherFilter"));
- }
-
- @Override
- public Map extends ElementMatcher super MethodDescription>, 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;
}
}