Skip to content

Commit 8d67311

Browse files
authored
Fix classloading issue: put object holders into bootstrap classloader (#256)
Signed-off-by: Pavol Loffay <[email protected]>
1 parent dddabf5 commit 8d67311

File tree

12 files changed

+103
-207
lines changed

12 files changed

+103
-207
lines changed

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
import io.opentelemetry.api.trace.Span;
2020
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
21-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder;
22-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder;
2321
import java.io.BufferedReader;
2422
import java.io.PrintWriter;
2523
import java.util.concurrent.atomic.AtomicBoolean;
@@ -34,6 +32,7 @@
3432
import org.hypertrace.agent.config.Config.AgentConfig;
3533
import org.hypertrace.agent.core.config.HypertraceConfig;
3634
import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes;
35+
import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair;
3736
import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream;
3837
import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter;
3938
import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair;
@@ -45,11 +44,11 @@ public class BodyCaptureAsyncListener implements AsyncListener {
4544
private final AtomicBoolean responseHandled;
4645
private final Span span;
4746

48-
private final ContextStore<HttpServletResponse, ResponseStreamWriterHolder> responseContextStore;
47+
private final ContextStore<HttpServletResponse, SpanAndObjectPair> responseContextStore;
4948
private final ContextStore<ServletOutputStream, BoundedByteArrayOutputStream> streamContextStore;
5049
private final ContextStore<PrintWriter, BoundedCharArrayWriter> writerContextStore;
5150

52-
private final ContextStore<HttpServletRequest, RequestStreamReaderHolder> requestContextStore;
51+
private final ContextStore<HttpServletRequest, SpanAndObjectPair> requestContextStore;
5352
private final ContextStore<ServletInputStream, ByteBufferSpanPair> inputStreamContextStore;
5453
private final ContextStore<BufferedReader, CharBufferSpanPair> readerContextStore;
5554

@@ -58,10 +57,10 @@ public class BodyCaptureAsyncListener implements AsyncListener {
5857
public BodyCaptureAsyncListener(
5958
AtomicBoolean responseHandled,
6059
Span span,
61-
ContextStore<HttpServletResponse, ResponseStreamWriterHolder> responseContextStore,
60+
ContextStore<HttpServletResponse, SpanAndObjectPair> responseContextStore,
6261
ContextStore<ServletOutputStream, BoundedByteArrayOutputStream> streamContextStore,
6362
ContextStore<PrintWriter, BoundedCharArrayWriter> writerContextStore,
64-
ContextStore<HttpServletRequest, RequestStreamReaderHolder> requestContextStore,
63+
ContextStore<HttpServletRequest, SpanAndObjectPair> requestContextStore,
6564
ContextStore<ServletInputStream, ByteBufferSpanPair> inputStreamContextStore,
6665
ContextStore<BufferedReader, CharBufferSpanPair> readerContextStore) {
6766
this.responseHandled = responseHandled;

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
2929
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
3030
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
31-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder;
32-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder;
3331
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
3432
import java.io.BufferedReader;
3533
import java.io.PrintWriter;
@@ -51,6 +49,7 @@
5149
import org.hypertrace.agent.config.Config.AgentConfig;
5250
import org.hypertrace.agent.core.config.HypertraceConfig;
5351
import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes;
52+
import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair;
5453
import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream;
5554
import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter;
5655
import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair;
@@ -103,8 +102,8 @@ public static boolean start(
103102
&& ContentTypeUtils.shouldCapture(contentType)) {
104103
// The HttpServletRequest instrumentation uses this to
105104
// enable the instrumentation
106-
InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class)
107-
.put(httpRequest, new RequestStreamReaderHolder(currentSpan));
105+
InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class)
106+
.put(httpRequest, new SpanAndObjectPair(currentSpan));
108107
}
109108

110109
Utils.addSessionId(currentSpan, httpRequest);
@@ -152,18 +151,17 @@ public static void exit(
152151
HttpServletRequest httpRequest = (HttpServletRequest) request;
153152
AgentConfig agentConfig = HypertraceConfig.get();
154153

154+
// response context to capture body and clear the context
155+
ContextStore<HttpServletResponse, SpanAndObjectPair> responseContextStore =
156+
InstrumentationContext.get(HttpServletResponse.class, SpanAndObjectPair.class);
155157
ContextStore<ServletOutputStream, BoundedByteArrayOutputStream> outputStreamContextStore =
156158
InstrumentationContext.get(ServletOutputStream.class, BoundedByteArrayOutputStream.class);
157159
ContextStore<PrintWriter, BoundedCharArrayWriter> writerContextStore =
158160
InstrumentationContext.get(PrintWriter.class, BoundedCharArrayWriter.class);
159161

160-
// response context to capture body and clear the context
161-
ContextStore<HttpServletResponse, ResponseStreamWriterHolder> responseContextStore =
162-
InstrumentationContext.get(HttpServletResponse.class, ResponseStreamWriterHolder.class);
163-
164162
// request context to clear body buffer
165-
ContextStore<HttpServletRequest, RequestStreamReaderHolder> requestContextStore =
166-
InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class);
163+
ContextStore<HttpServletRequest, SpanAndObjectPair> requestContextStore =
164+
InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class);
167165
ContextStore<ServletInputStream, ByteBufferSpanPair> inputStreamContextStore =
168166
InstrumentationContext.get(ServletInputStream.class, ByteBufferSpanPair.class);
169167
ContextStore<BufferedReader, CharBufferSpanPair> readerContextStore =

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@
1919
import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed;
2020

2121
import com.google.auto.service.AutoService;
22-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder;
2322
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletInputStreamInstrumentation;
2423
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.ServletRequestInstrumentation;
25-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder;
2624
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletOutputStreamInstrumentation;
2725
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ServletResponseInstrumentation;
2826
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
@@ -32,6 +30,7 @@
3230
import java.util.List;
3331
import java.util.Map;
3432
import net.bytebuddy.matcher.ElementMatcher;
33+
import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair;
3534
import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream;
3635
import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter;
3736
import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair;
@@ -68,13 +67,12 @@ public List<TypeInstrumentation> typeInstrumentations() {
6867
protected Map<String, String> contextStore() {
6968
Map<String, String> context = new HashMap<>();
7069
// capture request body
71-
context.put("javax.servlet.http.HttpServletRequest", RequestStreamReaderHolder.class.getName());
70+
context.put("javax.servlet.http.HttpServletRequest", SpanAndObjectPair.class.getName());
7271
context.put("javax.servlet.ServletInputStream", ByteBufferSpanPair.class.getName());
7372
context.put("java.io.BufferedReader", CharBufferSpanPair.class.getName());
7473

7574
// capture response body
76-
context.put(
77-
"javax.servlet.http.HttpServletResponse", ResponseStreamWriterHolder.class.getName());
75+
context.put("javax.servlet.http.HttpServletResponse", SpanAndObjectPair.class.getName());
7876
context.put("javax.servlet.ServletOutputStream", BoundedByteArrayOutputStream.class.getName());
7977
context.put("java.io.PrintWriter", BoundedCharArrayWriter.class.getName());
8078
return context;

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

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818

1919
import io.opentelemetry.api.trace.Span;
2020
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
21-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.request.RequestStreamReaderHolder;
22-
import io.opentelemetry.javaagent.instrumentation.hypertrace.servlet.v3_0.nowrapping.response.ResponseStreamWriterHolder;
2321
import java.io.BufferedReader;
2422
import java.io.PrintWriter;
2523
import java.io.UnsupportedEncodingException;
@@ -29,6 +27,7 @@
2927
import javax.servlet.http.HttpServletResponse;
3028
import javax.servlet.http.HttpSession;
3129
import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes;
30+
import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair;
3231
import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream;
3332
import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter;
3433
import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair;
@@ -50,19 +49,19 @@ public static void addSessionId(Span span, HttpServletRequest httpRequest) {
5049
public static void captureResponseBody(
5150
Span span,
5251
HttpServletResponse httpServletResponse,
53-
ContextStore<HttpServletResponse, ResponseStreamWriterHolder> responseContextStore,
52+
ContextStore<HttpServletResponse, SpanAndObjectPair> responseContextStore,
5453
ContextStore<ServletOutputStream, BoundedByteArrayOutputStream> streamContextStore,
5554
ContextStore<PrintWriter, BoundedCharArrayWriter> writerContextStore) {
5655

57-
ResponseStreamWriterHolder responseStreamWriterHolder =
58-
responseContextStore.get(httpServletResponse);
56+
SpanAndObjectPair responseStreamWriterHolder = responseContextStore.get(httpServletResponse);
5957
if (responseStreamWriterHolder == null) {
6058
return;
6159
}
6260
responseContextStore.put(httpServletResponse, null);
6361

64-
if (responseStreamWriterHolder.getServletOutputStream() != null) {
65-
ServletOutputStream servletOutputStream = responseStreamWriterHolder.getServletOutputStream();
62+
if (responseStreamWriterHolder.getAssociatedObject() instanceof ServletOutputStream) {
63+
ServletOutputStream servletOutputStream =
64+
(ServletOutputStream) responseStreamWriterHolder.getAssociatedObject();
6665
BoundedByteArrayOutputStream buffer = streamContextStore.get(servletOutputStream);
6766
if (buffer != null) {
6867
try {
@@ -74,10 +73,8 @@ public static void captureResponseBody(
7473
}
7574
streamContextStore.put(servletOutputStream, null);
7675
}
77-
}
78-
79-
if (responseStreamWriterHolder.getPrintWriter() != null) {
80-
PrintWriter printWriter = responseStreamWriterHolder.getPrintWriter();
76+
} else if (responseStreamWriterHolder.getAssociatedObject() instanceof PrintWriter) {
77+
PrintWriter printWriter = (PrintWriter) responseStreamWriterHolder.getAssociatedObject();
8178
BoundedCharArrayWriter buffer = writerContextStore.get(printWriter);
8279
if (buffer != null) {
8380
span.setAttribute(HypertraceSemanticAttributes.HTTP_RESPONSE_BODY, buffer.toString());
@@ -88,22 +85,22 @@ public static void captureResponseBody(
8885

8986
public static void resetRequestBodyBuffers(
9087
HttpServletRequest httpServletRequest,
91-
ContextStore<HttpServletRequest, RequestStreamReaderHolder> requestContextStore,
88+
ContextStore<HttpServletRequest, SpanAndObjectPair> requestContextStore,
9289
ContextStore<ServletInputStream, ByteBufferSpanPair> streamContextStore,
9390
ContextStore<BufferedReader, CharBufferSpanPair> bufferedReaderContextStore) {
9491

95-
RequestStreamReaderHolder requestStreamReaderHolder =
96-
requestContextStore.get(httpServletRequest);
92+
SpanAndObjectPair requestStreamReaderHolder = requestContextStore.get(httpServletRequest);
9793
if (requestContextStore == null) {
9894
return;
9995
}
10096
requestContextStore.put(httpServletRequest, null);
10197

102-
if (requestStreamReaderHolder.getServletInputStream() != null) {
103-
streamContextStore.put(requestStreamReaderHolder.getServletInputStream(), null);
104-
}
105-
if (requestStreamReaderHolder.getBufferedReader() != null) {
106-
bufferedReaderContextStore.put(requestStreamReaderHolder.getBufferedReader(), null);
98+
if (requestStreamReaderHolder.getAssociatedObject() instanceof ServletInputStream) {
99+
streamContextStore.put(
100+
(ServletInputStream) requestStreamReaderHolder.getAssociatedObject(), null);
101+
} else if (requestStreamReaderHolder.getAssociatedObject() instanceof BufferedReader) {
102+
bufferedReaderContextStore.put(
103+
(BufferedReader) requestStreamReaderHolder.getAssociatedObject(), null);
107104
}
108105
}
109106
}

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

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import net.bytebuddy.description.type.TypeDescription;
3838
import net.bytebuddy.matcher.ElementMatcher;
3939
import net.bytebuddy.matcher.ElementMatcher.Junction;
40+
import org.hypertrace.agent.core.instrumentation.SpanAndObjectPair;
4041
import org.hypertrace.agent.core.instrumentation.buffer.ByteBufferSpanPair;
4142
import org.hypertrace.agent.core.instrumentation.buffer.CharBufferSpanPair;
4243

@@ -67,11 +68,11 @@ public Map<? extends ElementMatcher<? super MethodDescription>, String> transfor
6768

6869
static class ServletRequest_getInputStream_advice {
6970
@Advice.OnMethodEnter(suppress = Throwable.class)
70-
public static RequestStreamReaderHolder enter(@Advice.This ServletRequest servletRequest) {
71+
public static SpanAndObjectPair enter(@Advice.This ServletRequest servletRequest) {
7172
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
7273
// span is added in servlet/filter instrumentation if data capture is enabled
73-
RequestStreamReaderHolder requestBufferWrapper =
74-
InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class)
74+
SpanAndObjectPair requestBufferWrapper =
75+
InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class)
7576
.get(httpServletRequest);
7677
if (requestBufferWrapper == null) {
7778
return null;
@@ -87,9 +88,9 @@ public static void exit(
8788
@Advice.This ServletRequest servletRequest,
8889
@Advice.Return ServletInputStream servletInputStream,
8990
@Advice.Thrown Throwable throwable,
90-
@Advice.Enter RequestStreamReaderHolder requestStreamReaderHolder) {
91+
@Advice.Enter SpanAndObjectPair spanAndObjectPair) {
9192

92-
if (requestStreamReaderHolder == null) {
93+
if (spanAndObjectPair == null) {
9394
return;
9495
}
9596

@@ -111,36 +112,35 @@ public static void exit(
111112
}
112113

113114
ByteBufferSpanPair bufferSpanPair =
114-
Utils.createRequestByteBufferSpanPair(
115-
httpServletRequest, requestStreamReaderHolder.getSpan());
115+
Utils.createRequestByteBufferSpanPair(httpServletRequest, spanAndObjectPair.getSpan());
116116
contextStore.put(servletInputStream, bufferSpanPair);
117-
requestStreamReaderHolder.setServletInputStream(servletInputStream);
117+
spanAndObjectPair.setAssociatedObject(servletInputStream);
118118
}
119119
}
120120

121121
static class ServletRequest_getReader_advice {
122122
@Advice.OnMethodEnter(suppress = Throwable.class)
123-
public static RequestStreamReaderHolder enter(@Advice.This ServletRequest servletRequest) {
123+
public static SpanAndObjectPair enter(@Advice.This ServletRequest servletRequest) {
124124
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
125-
RequestStreamReaderHolder requestStreamReaderHolder =
126-
InstrumentationContext.get(HttpServletRequest.class, RequestStreamReaderHolder.class)
125+
SpanAndObjectPair spanAndObjectPair =
126+
InstrumentationContext.get(HttpServletRequest.class, SpanAndObjectPair.class)
127127
.get(httpServletRequest);
128-
if (requestStreamReaderHolder == null) {
128+
if (spanAndObjectPair == null) {
129129
return null;
130130
}
131131

132132
CallDepthThreadLocalMap.incrementCallDepth(ServletRequest.class);
133-
return requestStreamReaderHolder;
133+
return spanAndObjectPair;
134134
}
135135

136136
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
137137
public static void exit(
138138
@Advice.This ServletRequest servletRequest,
139139
@Advice.Return BufferedReader reader,
140140
@Advice.Thrown Throwable throwable,
141-
@Advice.Enter RequestStreamReaderHolder requestStreamReaderHolder) {
141+
@Advice.Enter SpanAndObjectPair spanAndObjectPair) {
142142

143-
if (requestStreamReaderHolder == null) {
143+
if (spanAndObjectPair == null) {
144144
return;
145145
}
146146

@@ -162,10 +162,9 @@ public static void exit(
162162
}
163163

164164
CharBufferSpanPair bufferSpanPair =
165-
Utils.createRequestCharBufferSpanPair(
166-
httpServletRequest, requestStreamReaderHolder.getSpan());
165+
Utils.createRequestCharBufferSpanPair(httpServletRequest, spanAndObjectPair.getSpan());
167166
contextStore.put(reader, bufferSpanPair);
168-
requestStreamReaderHolder.setBufferedReader(reader);
167+
spanAndObjectPair.setAssociatedObject(reader);
169168
}
170169
}
171170
}

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

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)