Skip to content

Commit fd1270d

Browse files
authored
Use WeakMap provider in global registry or context store in instrumentations (#187)
* Use dynamic context store Signed-off-by: Pavol Loffay <[email protected]> * use map provider Signed-off-by: Pavol Loffay <[email protected]>
1 parent a1c0667 commit fd1270d

File tree

5 files changed

+52
-47
lines changed

5 files changed

+52
-47
lines changed

instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheClientInstrumentationModule.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import com.google.auto.service.AutoService;
3131
import io.opentelemetry.api.trace.Span;
3232
import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap;
33+
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
34+
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
3335
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
3436
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
3537
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
@@ -72,6 +74,13 @@ public int getOrder() {
7274
return 1;
7375
}
7476

77+
@Override
78+
protected Map<String, String> contextStore() {
79+
Map<String, String> context = new HashMap<>();
80+
context.put("org.apache.http.HttpEntity", Span.class.getName());
81+
return context;
82+
}
83+
7584
@Override
7685
public List<TypeInstrumentation> typeInstrumentations() {
7786
return Arrays.asList(new HttpEntityInstrumentation(), new ApacheClientInstrumentation());
@@ -118,7 +127,9 @@ public static boolean enter(@Advice.Argument(0) HttpMessage request) {
118127
if (callDepth > 0) {
119128
return false;
120129
}
121-
ApacheHttpClientUtils.traceRequest(request);
130+
ContextStore<HttpEntity, Span> contextStore =
131+
InstrumentationContext.get(HttpEntity.class, Span.class);
132+
ApacheHttpClientUtils.traceRequest(contextStore, request);
122133
return true;
123134
}
124135

@@ -138,7 +149,9 @@ public static boolean enter(@Advice.Argument(1) HttpMessage request) {
138149
if (callDepth > 0) {
139150
return false;
140151
}
141-
ApacheHttpClientUtils.traceRequest(request);
152+
ContextStore<HttpEntity, Span> contextStore =
153+
InstrumentationContext.get(HttpEntity.class, Span.class);
154+
ApacheHttpClientUtils.traceRequest(contextStore, request);
142155
return true;
143156
}
144157

@@ -178,8 +191,13 @@ public static void exit(@Advice.Return Object response, @Advice.Enter boolean re
178191

179192
if (agentConfig.getDataCapture().getHttpBody().getResponse().getValue()) {
180193
HttpEntity entity = httpResponse.getEntity();
194+
ContextStore<HttpEntity, Span> contextStore =
195+
InstrumentationContext.get(HttpEntity.class, Span.class);
181196
ApacheHttpClientUtils.traceEntity(
182-
currentSpan, HypertraceSemanticAttributes.HTTP_RESPONSE_BODY.getKey(), entity);
197+
contextStore,
198+
currentSpan,
199+
HypertraceSemanticAttributes.HTTP_RESPONSE_BODY.getKey(),
200+
entity);
183201
}
184202
}
185203
}
@@ -213,7 +231,9 @@ static class HttpEntity_GetContentAdvice {
213231
@Advice.OnMethodExit(suppress = Throwable.class)
214232
public static void exit(@Advice.This HttpEntity thizz, @Advice.Return InputStream inputStream) {
215233
// here the Span.current() is finished for response entities
216-
Span clientSpan = ApacheHttpClientObjectRegistry.httpEntityToSpanMap.remove(thizz);
234+
ContextStore<HttpEntity, Span> contextStore =
235+
InstrumentationContext.get(HttpEntity.class, Span.class);
236+
Span clientSpan = contextStore.get(thizz);
217237
// HttpEntity might be wrapped multiple times
218238
// this ensures that the advice runs only for the most outer one
219239
// the returned inputStream is put into globally accessible map
@@ -250,7 +270,9 @@ static class HttpEntity_WriteToAdvice {
250270
@Advice.OnMethodEnter(suppress = Throwable.class)
251271
public static void enter(
252272
@Advice.This HttpEntity thizz, @Advice.Argument(0) OutputStream outputStream) {
253-
if (!ApacheHttpClientObjectRegistry.httpEntityToSpanMap.containsKey(thizz)) {
273+
ContextStore<HttpEntity, Span> contextStore =
274+
InstrumentationContext.get(HttpEntity.class, Span.class);
275+
if (contextStore.get(thizz) == null) {
254276
return;
255277
}
256278

@@ -267,7 +289,9 @@ public static void enter(
267289
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
268290
public static void exit(
269291
@Advice.This HttpEntity thizz, @Advice.Argument(0) OutputStream outputStream) {
270-
Span clientSpan = ApacheHttpClientObjectRegistry.httpEntityToSpanMap.remove(thizz);
292+
ContextStore<HttpEntity, Span> contextStore =
293+
InstrumentationContext.get(HttpEntity.class, Span.class);
294+
Span clientSpan = contextStore.get(thizz);
271295
if (clientSpan == null) {
272296
return;
273297
}

instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheHttpClientObjectRegistry.java

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

instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheHttpClientUtils.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import io.opentelemetry.api.common.AttributeKey;
2020
import io.opentelemetry.api.trace.Span;
21+
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
2122
import java.io.ByteArrayOutputStream;
2223
import java.io.IOException;
2324
import java.io.UnsupportedEncodingException;
@@ -59,7 +60,8 @@ private static void addHeaders(
5960
}
6061
}
6162

62-
public static void traceRequest(HttpMessage request) {
63+
public static void traceRequest(
64+
ContextStore<HttpEntity, Span> contextStore, HttpMessage request) {
6365
Span currentSpan = Span.current();
6466
AgentConfig agentConfig = HypertraceConfig.get();
6567
if (agentConfig.getDataCapture().getHttpHeaders().getRequest().getValue()) {
@@ -71,11 +73,18 @@ public static void traceRequest(HttpMessage request) {
7173
HttpEntityEnclosingRequest entityRequest = (HttpEntityEnclosingRequest) request;
7274
HttpEntity entity = entityRequest.getEntity();
7375
ApacheHttpClientUtils.traceEntity(
74-
currentSpan, HypertraceSemanticAttributes.HTTP_REQUEST_BODY.getKey(), entity);
76+
contextStore,
77+
currentSpan,
78+
HypertraceSemanticAttributes.HTTP_REQUEST_BODY.getKey(),
79+
entity);
7580
}
7681
}
7782

78-
public static void traceEntity(Span span, String bodyAttributeKey, HttpEntity entity) {
83+
public static void traceEntity(
84+
ContextStore<HttpEntity, Span> contextStore,
85+
Span span,
86+
String bodyAttributeKey,
87+
HttpEntity entity) {
7988
if (entity == null) {
8089
return;
8190
}
@@ -105,6 +114,6 @@ public static void traceEntity(Span span, String bodyAttributeKey, HttpEntity en
105114
// request body is traced via HttpEntity.writeTo(OutputStream) and OutputStream instrumentation
106115
// response body is traced via InputStream HttpEntity.getContent() and InputStream
107116
// instrumentation
108-
ApacheHttpClientObjectRegistry.httpEntityToSpanMap.put(entity, span);
117+
contextStore.put(entity, span);
109118
}
110119
}

javaagent-core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ val versions: Map<String, String> by extra
2525

2626
dependencies {
2727
api("io.opentelemetry:opentelemetry-api:${versions["opentelemetry"]}")
28+
api("io.opentelemetry.javaagent:opentelemetry-javaagent-api:${versions["opentelemetry_java_agent"]}")
2829
implementation("org.slf4j:slf4j-api:1.7.30")
2930

3031
api("com.google.protobuf:protobuf-java:3.11.4")

javaagent-core/src/main/java/org/hypertrace/agent/core/GlobalObjectRegistry.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
package org.hypertrace.agent.core;
1818

19-
import com.blogspot.mydailyjava.weaklockfree.WeakConcurrentMap;
2019
import io.opentelemetry.api.common.AttributeKey;
2120
import io.opentelemetry.api.trace.Span;
21+
import io.opentelemetry.javaagent.instrumentation.api.WeakMap;
2222
import java.io.ByteArrayOutputStream;
2323
import java.io.InputStream;
2424
import java.io.OutputStream;
@@ -27,17 +27,17 @@
2727
public class GlobalObjectRegistry {
2828

2929
// original input stream to span and byte buffer
30-
public static final WeakConcurrentMap<InputStream, SpanAndBuffer> inputStreamToSpanAndBufferMap =
31-
new WeakConcurrentMap<>(false);
30+
public static final WeakMap<InputStream, SpanAndBuffer> inputStreamToSpanAndBufferMap =
31+
WeakMap.Provider.newWeakMap();
3232

3333
// original output stream to byte buffer
34-
public static final WeakConcurrentMap<OutputStream, ByteArrayOutputStream>
35-
outputStreamToBufferMap = new WeakConcurrentMap<>(false);
34+
public static final WeakMap<OutputStream, ByteArrayOutputStream> outputStreamToBufferMap =
35+
WeakMap.Provider.newWeakMap();
3636

3737
// original input stream to buffered one
38-
public static final WeakConcurrentMap<InputStream, InputStream> inputStreamMap =
39-
new WeakConcurrentMap<>(false);
40-
public static final WeakConcurrentMap<Object, Object> objectMap = new WeakConcurrentMap<>(false);
38+
public static final WeakMap<InputStream, InputStream> inputStreamMap =
39+
WeakMap.Provider.newWeakMap();
40+
public static final WeakMap<Object, Object> objectMap = WeakMap.Provider.newWeakMap();
4141

4242
public static class SpanAndBuffer {
4343
public final Span span;

0 commit comments

Comments
 (0)