Skip to content

Commit 098a622

Browse files
committed
make google-http-client indy ready + cleanup
1 parent d95f01b commit 098a622

File tree

6 files changed

+74
-49
lines changed

6 files changed

+74
-49
lines changed

instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/AsyncHttpClientInstrumentationModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import java.util.List;
1515

1616
@AutoService(InstrumentationModule.class)
17-
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule implements
18-
ExperimentalInstrumentationModule {
17+
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule
18+
implements ExperimentalInstrumentationModule {
1919
public AsyncHttpClientInstrumentationModule() {
2020
super("async-http-client", "async-http-client-1.9");
2121
}

instrumentation/async-http-client/async-http-client-1.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v1_9/RequestInstrumentation.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
import io.opentelemetry.instrumentation.api.util.VirtualField;
1919
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2020
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
21+
import javax.annotation.Nullable;
2122
import net.bytebuddy.asm.Advice;
2223
import net.bytebuddy.description.type.TypeDescription;
2324
import net.bytebuddy.matcher.ElementMatcher;
24-
import javax.annotation.Nullable;
2525

2626
public class RequestInstrumentation implements TypeInstrumentation {
2727

@@ -45,7 +45,8 @@ public static class ExecuteAdvice {
4545

4646
@Nullable
4747
@Advice.OnMethodEnter(suppress = Throwable.class)
48-
public static Scope onEnter(@Advice.Argument(0) Request request, @Advice.Argument(1) AsyncHandler<?> handler) {
48+
public static Scope onEnter(
49+
@Advice.Argument(0) Request request, @Advice.Argument(1) AsyncHandler<?> handler) {
4950
Context parentContext = currentContext();
5051
if (!instrumenter().shouldStart(parentContext, request)) {
5152
return null;

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientInstrumentation.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
import io.opentelemetry.instrumentation.api.util.VirtualField;
1818
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1919
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
20+
import javax.annotation.Nullable;
2021
import net.bytebuddy.asm.Advice;
2122
import net.bytebuddy.description.type.TypeDescription;
2223
import net.bytebuddy.matcher.ElementMatcher;
2324
import org.asynchttpclient.AsyncHandler;
2425
import org.asynchttpclient.Request;
25-
import javax.annotation.Nullable;
2626

2727
public class AsyncHttpClientInstrumentation implements TypeInstrumentation {
2828

@@ -46,7 +46,8 @@ public static class ExecuteRequestAdvice {
4646

4747
@Nullable
4848
@Advice.OnMethodEnter(suppress = Throwable.class)
49-
public static Scope onEnter(@Advice.Argument(0) Request request, @Advice.Argument(1) AsyncHandler<?> handler) {
49+
public static Scope onEnter(
50+
@Advice.Argument(0) Request request, @Advice.Argument(1) AsyncHandler<?> handler) {
5051

5152
Context parentContext = currentContext();
5253
RequestContext requestContext = new RequestContext(parentContext, request);

instrumentation/async-http-client/async-http-client-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/asynchttpclient/v2_0/AsyncHttpClientInstrumentationModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import java.util.List;
1515

1616
@AutoService(InstrumentationModule.class)
17-
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule implements
18-
ExperimentalInstrumentationModule {
17+
public class AsyncHttpClientInstrumentationModule extends InstrumentationModule
18+
implements ExperimentalInstrumentationModule {
1919
public AsyncHttpClientInstrumentationModule() {
2020
super("async-http-client", "async-http-client-2.0");
2121
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import com.google.auto.service.AutoService;
1111
import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule;
1212
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
13+
import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule;
1314
import java.util.List;
1415

1516
@AutoService(InstrumentationModule.class)
16-
public class GoogleHttpClientInstrumentationModule extends InstrumentationModule {
17+
public class GoogleHttpClientInstrumentationModule extends InstrumentationModule implements
18+
ExperimentalInstrumentationModule {
1719
public GoogleHttpClientInstrumentationModule() {
1820
super("google-http-client", "google-http-client-1.19");
1921
}
@@ -22,4 +24,9 @@ public GoogleHttpClientInstrumentationModule() {
2224
public List<TypeInstrumentation> typeInstrumentations() {
2325
return singletonList(new GoogleHttpRequestInstrumentation());
2426
}
27+
28+
@Override
29+
public boolean isIndyReady() {
30+
return true;
31+
}
2532
}

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

Lines changed: 56 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2222
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
2323
import java.util.concurrent.Executor;
24+
import javax.annotation.Nullable;
2425
import net.bytebuddy.asm.Advice;
2526
import net.bytebuddy.description.type.TypeDescription;
2627
import net.bytebuddy.matcher.ElementMatcher;
@@ -49,78 +50,93 @@ public void transform(TypeTransformer transformer) {
4950
this.getClass().getName() + "$ExecuteAsyncAdvice");
5051
}
5152

53+
public static class AdviceLocals {
54+
public final Context context;
55+
public final Scope scope;
56+
57+
public AdviceLocals(Context context, Scope scope) {
58+
this.context = context;
59+
this.scope = scope;
60+
}
61+
62+
public static AdviceLocals start(HttpRequest request) {
63+
64+
Context parentContext = currentContext();
65+
if (!instrumenter().shouldStart(parentContext, request)) {
66+
return null;
67+
}
68+
69+
Context context = instrumenter().start(parentContext, request);
70+
return new AdviceLocals(context, context.makeCurrent());
71+
}
72+
73+
public void end(HttpRequest request, HttpResponse response, Throwable throwable) {
74+
scope.close();
75+
instrumenter().end(context, request, response, throwable);
76+
}
77+
78+
public void endWhenThrown(HttpRequest request, Throwable throwable) {
79+
scope.close();
80+
if (throwable != null) {
81+
instrumenter().end(context, request, null, throwable);
82+
}
83+
}
84+
}
85+
5286
@SuppressWarnings("unused")
5387
public static class ExecuteAdvice {
5488

89+
@Nullable
5590
@Advice.OnMethodEnter(suppress = Throwable.class)
56-
public static void methodEnter(
57-
@Advice.This HttpRequest request,
58-
@Advice.Local("otelContext") Context context,
59-
@Advice.Local("otelScope") Scope scope) {
60-
61-
context = VirtualField.find(HttpRequest.class, Context.class).get(request);
62-
if (context != null) {
91+
public static AdviceLocals methodEnter(@Advice.This HttpRequest request) {
92+
Context virtualFieldContext =
93+
VirtualField.find(HttpRequest.class, Context.class).get(request);
94+
if (virtualFieldContext != null) {
6395
// span was created by GoogleHttpClientAsyncAdvice instrumentation below
6496
// (executeAsync ends up calling execute from a separate thread)
6597
// so make it current and end it in method exit
66-
scope = context.makeCurrent();
67-
return;
68-
}
69-
Context parentContext = currentContext();
70-
if (!instrumenter().shouldStart(parentContext, request)) {
71-
return;
98+
return new AdviceLocals(virtualFieldContext, virtualFieldContext.makeCurrent());
7299
}
73-
context = instrumenter().start(parentContext, request);
74-
scope = context.makeCurrent();
100+
101+
return AdviceLocals.start(request);
75102
}
76103

77104
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
78105
public static void methodExit(
79106
@Advice.This HttpRequest request,
80107
@Advice.Return HttpResponse response,
81108
@Advice.Thrown Throwable throwable,
82-
@Advice.Local("otelContext") Context context,
83-
@Advice.Local("otelScope") Scope scope) {
84-
if (scope == null) {
85-
return;
86-
}
109+
@Advice.Enter @Nullable AdviceLocals locals) {
87110

88-
scope.close();
89-
instrumenter().end(context, request, response, throwable);
111+
if (locals != null) {
112+
locals.end(request, response, throwable);
113+
}
90114
}
91115
}
92116

93117
@SuppressWarnings("unused")
94118
public static class ExecuteAsyncAdvice {
95119

120+
@Nullable
96121
@Advice.OnMethodEnter(suppress = Throwable.class)
97-
public static void methodEnter(
98-
@Advice.This HttpRequest request,
99-
@Advice.Local("otelContext") Context context,
100-
@Advice.Local("otelScope") Scope scope) {
101-
Context parentContext = currentContext();
102-
if (!instrumenter().shouldStart(parentContext, request)) {
103-
return;
122+
public static AdviceLocals methodEnter(@Advice.This HttpRequest request) {
123+
124+
AdviceLocals locals = AdviceLocals.start(request);
125+
if (locals != null) {
126+
VirtualField.find(HttpRequest.class, Context.class).set(request, locals.context);
104127
}
105-
context = instrumenter().start(parentContext, request);
106-
scope = context.makeCurrent();
107128

108-
VirtualField.find(HttpRequest.class, Context.class).set(request, context);
129+
return locals;
109130
}
110131

111132
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
112133
public static void methodExit(
113134
@Advice.This HttpRequest request,
114135
@Advice.Thrown Throwable throwable,
115-
@Advice.Local("otelContext") Context context,
116-
@Advice.Local("otelScope") Scope scope) {
117-
if (scope == null) {
118-
return;
119-
}
136+
@Advice.Enter @Nullable AdviceLocals locals) {
120137

121-
scope.close();
122-
if (throwable != null) {
123-
instrumenter().end(context, request, null, throwable);
138+
if (locals != null) {
139+
locals.endWhenThrown(request, throwable);
124140
}
125141
}
126142
}

0 commit comments

Comments
 (0)