Skip to content

Commit 611071a

Browse files
committed
Fix Repeat Add trace interceptor
1 parent 303ffd4 commit 611071a

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/grpc/v1/define/AbstractServerImplBuilderInstrumentation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ public boolean isOverrideArgs() {
6565
protected ClassMatch enhanceClass() {
6666
return MultiClassNameMatch.byMultiClassMatch(
6767
"io.grpc.internal.AbstractServerImplBuilder", //grpc version <= 1.58.1
68-
"io.grpc.internal.ServerImplBuilder", //grpc version >= 1.59.0
69-
"io.grpc.internal.ForwardingServerBuilder" //grpc version >= 1.59.0
68+
"io.grpc.internal.ServerImplBuilder" //grpc version >= 1.59.0
7069
);
7170
}
7271
}

apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/grpc/v1/server/AbstractServerImplBuilderInterceptor.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020

2121
import io.grpc.ServerBuilder;
2222

23+
import java.lang.reflect.Field;
2324
import java.lang.reflect.Method;
25+
import java.util.List;
2426

2527
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
2628
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
@@ -32,12 +34,23 @@
3234
public class AbstractServerImplBuilderInterceptor implements InstanceMethodsAroundInterceptor {
3335
@Override
3436
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
35-
MethodInterceptResult result) {
37+
MethodInterceptResult result) throws Throwable {
3638
if (objInst.getSkyWalkingDynamicField() == null) {
3739
ServerBuilder<?> builder = (ServerBuilder) objInst;
38-
ServerInterceptor interceptor = new ServerInterceptor();
39-
builder.intercept(interceptor);
40-
objInst.setSkyWalkingDynamicField(interceptor);
40+
Field field = findField(builder.getClass());
41+
if (field != null) {
42+
field.setAccessible(true);
43+
List<?> interceptors = (List<?>) field.get(builder);
44+
boolean hasCustomInterceptor = interceptors.stream()
45+
.anyMatch(i -> i.getClass() == ServerInterceptor.class);
46+
47+
if (!hasCustomInterceptor) {
48+
ServerInterceptor interceptor = new ServerInterceptor();
49+
builder.intercept(interceptor);
50+
objInst.setSkyWalkingDynamicField(interceptor);
51+
}
52+
53+
}
4154
}
4255
}
4356

@@ -52,4 +65,16 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec
5265
Class<?>[] argumentsTypes, Throwable t) {
5366

5467
}
68+
69+
private static Field findField(Class<?> clazz) {
70+
while (clazz != null) {
71+
for (Field f : clazz.getDeclaredFields()) {
72+
if (f.getName().equals("interceptors")) {
73+
return f;
74+
}
75+
}
76+
clazz = clazz.getSuperclass();
77+
}
78+
return null;
79+
}
5580
}

0 commit comments

Comments
 (0)