Skip to content

Commit 2469bbb

Browse files
committed
fix issue with virtual field
1 parent b2eb052 commit 2469bbb

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

instrumentation/google-http-client-1.19/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/googlehttpclient/GoogleHttpRequestInstrumentation.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,18 @@ public void transform(TypeTransformer transformer) {
5151
}
5252

5353
public static class AdviceLocals {
54-
public final Context context;
55-
public final Scope scope;
54+
55+
private static final VirtualField<HttpRequest, Context> virtualField =
56+
VirtualField.find(HttpRequest.class, Context.class);
57+
private final Context context;
58+
private final Scope scope;
5659

5760
public AdviceLocals(Context context, Scope scope) {
5861
this.context = context;
5962
this.scope = scope;
6063
}
6164

65+
@Nullable
6266
public static AdviceLocals start(HttpRequest request) {
6367

6468
Context parentContext = currentContext();
@@ -81,6 +85,18 @@ public void endWhenThrown(HttpRequest request, Throwable throwable) {
8185
instrumenter().end(context, request, null, throwable);
8286
}
8387
}
88+
89+
public static AdviceLocals fromVirtualFieldContext(HttpRequest request) {
90+
Context context = virtualField.get(request);
91+
if (context == null) {
92+
return null;
93+
}
94+
return new AdviceLocals(context, context.makeCurrent());
95+
}
96+
97+
public void storeContextToVirtualField(HttpRequest request) {
98+
virtualField.set(request, context);
99+
}
84100
}
85101

86102
@SuppressWarnings("unused")
@@ -89,13 +105,13 @@ public static class ExecuteAdvice {
89105
@Nullable
90106
@Advice.OnMethodEnter(suppress = Throwable.class)
91107
public static AdviceLocals methodEnter(@Advice.This HttpRequest request) {
92-
Context virtualFieldContext =
93-
VirtualField.find(HttpRequest.class, Context.class).get(request);
94-
if (virtualFieldContext != null) {
108+
109+
AdviceLocals locals = AdviceLocals.fromVirtualFieldContext(request);
110+
if (locals != null) {
95111
// span was created by GoogleHttpClientAsyncAdvice instrumentation below
96112
// (executeAsync ends up calling execute from a separate thread)
97113
// so make it current and end it in method exit
98-
return new AdviceLocals(virtualFieldContext, virtualFieldContext.makeCurrent());
114+
return locals;
99115
}
100116

101117
return AdviceLocals.start(request);
@@ -123,9 +139,8 @@ public static AdviceLocals methodEnter(@Advice.This HttpRequest request) {
123139

124140
AdviceLocals locals = AdviceLocals.start(request);
125141
if (locals != null) {
126-
VirtualField.find(HttpRequest.class, Context.class).set(request, locals.context);
142+
locals.storeContextToVirtualField(request);
127143
}
128-
129144
return locals;
130145
}
131146

0 commit comments

Comments
 (0)