Skip to content

Commit 974c315

Browse files
committed
support instrument proxy client
1 parent 12e289d commit 974c315

File tree

2 files changed

+55
-51
lines changed

2 files changed

+55
-51
lines changed

instrumentation/jsonrpc4j-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsonrpc4j/v1_3/JsonRpcProxyInstrumentation.java

+3-51
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,14 @@
66
package io.opentelemetry.javaagent.instrumentation.jsonrpc4j.v1_3;
77

88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
9-
import static io.opentelemetry.javaagent.instrumentation.jsonrpc4j.v1_3.JsonRpcSingletons.CLIENT_INSTRUMENTER;
109
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1110
import static net.bytebuddy.matcher.ElementMatchers.isPrivate;
1211
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
1312
import static net.bytebuddy.matcher.ElementMatchers.named;
1413

1514
import com.googlecode.jsonrpc4j.IJsonRpcClient;
16-
import com.googlecode.jsonrpc4j.ReflectionUtil;
17-
import io.opentelemetry.context.Context;
18-
import io.opentelemetry.context.Scope;
19-
import io.opentelemetry.instrumentation.jsonrpc4j.v1_3.SimpleJsonRpcRequest;
20-
import io.opentelemetry.instrumentation.jsonrpc4j.v1_3.SimpleJsonRpcResponse;
2115
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2216
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
23-
import java.lang.reflect.InvocationHandler;
24-
import java.lang.reflect.Method;
25-
import java.lang.reflect.Proxy;
2617
import java.util.Map;
2718
import net.bytebuddy.asm.Advice;
2819
import net.bytebuddy.description.type.TypeDescription;
@@ -47,7 +38,7 @@ public void transform(TypeTransformer transformer) {
4738
this.getClass().getName() + "$CreateClientProxyAdvice");
4839
}
4940

50-
@SuppressWarnings({"unused", "unchecked"})
41+
@SuppressWarnings({"unused"})
5142
public static class CreateClientProxyAdvice {
5243

5344
@Advice.OnMethodExit(suppress = Throwable.class)
@@ -59,47 +50,8 @@ public static <T> void onExit(
5950
@Advice.Return(readOnly = false) Object proxy) {
6051

6152
proxy =
62-
(T)
63-
Proxy.newProxyInstance(
64-
classLoader,
65-
new Class<?>[] {proxyInterface},
66-
new InvocationHandler() {
67-
@Override
68-
public Object invoke(Object proxy, Method method, Object[] args)
69-
throws Throwable {
70-
71-
Object arguments = ReflectionUtil.parseArguments(method, args);
72-
String methodName = method.getName(); // todo
73-
74-
// before invoke
75-
Context parentContext = Context.current();
76-
SimpleJsonRpcRequest request = new SimpleJsonRpcRequest(method, args);
77-
if (!CLIENT_INSTRUMENTER.shouldStart(parentContext, request)) {
78-
return client.invoke(
79-
methodName, arguments, method.getGenericReturnType(), extraHeaders);
80-
}
81-
82-
Context context = CLIENT_INSTRUMENTER.start(parentContext, request);
83-
Scope scope = context.makeCurrent();
84-
try {
85-
Object result =
86-
client.invoke(
87-
methodName, arguments, method.getGenericReturnType(), extraHeaders);
88-
scope.close();
89-
CLIENT_INSTRUMENTER.end(
90-
context,
91-
new SimpleJsonRpcRequest(method, args),
92-
new SimpleJsonRpcResponse(result),
93-
null);
94-
return result;
95-
} catch (Throwable t) {
96-
// after invoke
97-
scope.close();
98-
CLIENT_INSTRUMENTER.end(context, request, null, t);
99-
throw t;
100-
}
101-
}
102-
});
53+
JsonRpcSingletons.instrumentCreateClientProxy(
54+
classLoader, proxyInterface, client, extraHeaders, proxy);
10355
}
10456
}
10557
}

instrumentation/jsonrpc4j-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jsonrpc4j/v1_3/JsonRpcSingletons.java

+52
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,19 @@
55

66
package io.opentelemetry.javaagent.instrumentation.jsonrpc4j.v1_3;
77

8+
import com.googlecode.jsonrpc4j.IJsonRpcClient;
89
import com.googlecode.jsonrpc4j.InvocationListener;
910
import io.opentelemetry.api.GlobalOpenTelemetry;
11+
import io.opentelemetry.context.Context;
12+
import io.opentelemetry.context.Scope;
1013
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1114
import io.opentelemetry.instrumentation.jsonrpc4j.v1_3.JsonRpcTelemetry;
1215
import io.opentelemetry.instrumentation.jsonrpc4j.v1_3.SimpleJsonRpcRequest;
1316
import io.opentelemetry.instrumentation.jsonrpc4j.v1_3.SimpleJsonRpcResponse;
17+
import java.lang.reflect.InvocationHandler;
18+
import java.lang.reflect.Method;
19+
import java.lang.reflect.Proxy;
20+
import java.util.Map;
1421

1522
public final class JsonRpcSingletons {
1623

@@ -26,4 +33,49 @@ public final class JsonRpcSingletons {
2633
}
2734

2835
private JsonRpcSingletons() {}
36+
37+
@SuppressWarnings({"unchecked"})
38+
public static <T> T instrumentCreateClientProxy(
39+
ClassLoader classLoader,
40+
Class<T> proxyInterface,
41+
IJsonRpcClient client,
42+
Map<String, String> extraHeaders,
43+
Object proxy) {
44+
45+
return (T)
46+
Proxy.newProxyInstance(
47+
classLoader,
48+
new Class<?>[] {proxyInterface},
49+
new InvocationHandler() {
50+
@Override
51+
public Object invoke(Object proxy1, Method method, Object[] args) throws Throwable {
52+
// before invoke
53+
Context parentContext = Context.current();
54+
SimpleJsonRpcRequest request = new SimpleJsonRpcRequest(method, args);
55+
if (!CLIENT_INSTRUMENTER.shouldStart(parentContext, request)) {
56+
return method.invoke(proxy, args);
57+
}
58+
59+
Context context = CLIENT_INSTRUMENTER.start(parentContext, request);
60+
Scope scope = context.makeCurrent();
61+
try {
62+
Object result = method.invoke(proxy, args);
63+
// after invoke
64+
scope.close();
65+
CLIENT_INSTRUMENTER.end(
66+
context,
67+
new SimpleJsonRpcRequest(method, args),
68+
new SimpleJsonRpcResponse(result),
69+
null);
70+
return result;
71+
72+
} catch (Throwable t) {
73+
// after invoke
74+
scope.close();
75+
CLIENT_INSTRUMENTER.end(context, request, null, t);
76+
throw t;
77+
}
78+
}
79+
});
80+
}
2981
}

0 commit comments

Comments
 (0)