Skip to content

Commit 8a76d1a

Browse files
authored
Merge pull request #293 from lostsnow/fix/grpc-tracing
fixes grpc tracing
2 parents 3b201dd + 032b156 commit 8a76d1a

File tree

14 files changed

+100
-62
lines changed

14 files changed

+100
-62
lines changed

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/framework/grpc/AbstractStubAdapter.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
import io.dongtai.iast.core.bytecode.enhance.IastContext;
44
import io.dongtai.iast.core.bytecode.enhance.plugin.AbstractClassVisitor;
5-
import org.objectweb.asm.ClassVisitor;
6-
import org.objectweb.asm.MethodVisitor;
7-
import org.objectweb.asm.Type;
5+
import org.objectweb.asm.*;
86

97
public class AbstractStubAdapter extends AbstractClassVisitor {
108
public AbstractStubAdapter(ClassVisitor classVisitor, IastContext context) {

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/framework/grpc/DispatchGrpc.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public ClassVisitor dispatch(ClassVisitor classVisitor, IastContext context) {
3838
case classOfByteString:
3939
classVisitor = new ByteStringAdapter(classVisitor, null);
4040
break;
41+
default:
42+
break;
4143
}
4244
return classVisitor;
4345
}

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/framework/grpc/ServerStreamListenerImplAdapter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ public ServerStreamListenerImplAdapter(ClassVisitor classVisitor, IastContext co
1414
@Override
1515
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
1616
MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions);
17-
if (name.equals("closed")) {
18-
mv = new ServerStreamListenerImplAdviceAdapter(mv, access, name, descriptor);
17+
if ("messagesAvailable".equals(name)) {
18+
mv = new ServerStreamListenerImplStartAdviceAdapter(mv, access, name, descriptor);
19+
setTransformed();
20+
} else if ("closed".equals(name)) {
21+
mv = new ServerStreamListenerImplClosedAdviceAdapter(mv, access, name, descriptor);
1922
setTransformed();
2023
}
2124
return mv;

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/framework/grpc/ServerStreamListenerImplAdviceAdapter.java

Lines changed: 0 additions & 21 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.dongtai.iast.core.bytecode.enhance.plugin.framework.grpc;
2+
3+
import io.dongtai.iast.core.bytecode.enhance.asm.AsmMethods;
4+
import io.dongtai.iast.core.bytecode.enhance.asm.AsmTypes;
5+
import io.dongtai.iast.core.utils.AsmUtils;
6+
import org.objectweb.asm.MethodVisitor;
7+
import org.objectweb.asm.commons.AdviceAdapter;
8+
9+
public class ServerStreamListenerImplStartAdviceAdapter extends AdviceAdapter implements AsmTypes, AsmMethods {
10+
protected ServerStreamListenerImplStartAdviceAdapter(MethodVisitor methodVisitor, int access, String name, String descriptor) {
11+
super(AsmUtils.api, methodVisitor, access, name, descriptor);
12+
}
13+
14+
@Override
15+
protected void onMethodEnter() {
16+
invokeStatic(ASM_TYPE_SPY_HANDLER, SPY_HANDLER$getDispatcher);
17+
invokeInterface(ASM_TYPE_SPY_DISPATCHER, SPY$startGrpcCall);
18+
}
19+
}

dongtai-core/src/main/java/io/dongtai/iast/core/handler/context/ContextManager.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.dongtai.iast.core.handler.context;
22

3+
import io.dongtai.iast.core.EngineManager;
4+
35
/**
46
* @author owefsad
57
*/
@@ -30,7 +32,10 @@ public static String getSpanId(String traceId, int agentId) {
3032

3133
public static String getSegmentId() {
3234
TracingContext context = CONTEXT.get();
33-
return context.createSegmentId();
35+
if (context != null) {
36+
return context.createSegmentId();
37+
}
38+
return getOrCreateGlobalTraceId(null, EngineManager.getAgentId());
3439
}
3540

3641
public static String getHeaderKey() {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.dongtai.iast.core.handler.context;
2+
3+
import java.lang.dongtai.TraceIdHandler;
4+
5+
public class TraceManager implements TraceIdHandler {
6+
@Override
7+
public String getTraceKey() {
8+
return ContextManager.getHeaderKey();
9+
}
10+
11+
@Override
12+
public String getTraceId() {
13+
return ContextManager.getSegmentId();
14+
}
15+
}

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/framework/grpc/GrpcHandler.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,15 @@
88
import io.dongtai.iast.core.handler.hookpoint.graphy.GraphBuilder;
99
import io.dongtai.iast.core.handler.hookpoint.models.MethodEvent;
1010
import io.dongtai.iast.core.service.ErrorLogReport;
11-
import io.dongtai.iast.core.utils.HttpClientUtils;
12-
import io.dongtai.iast.core.utils.StackUtils;
13-
import io.dongtai.iast.core.utils.TaintPoolUtils;
11+
import io.dongtai.iast.core.utils.*;
1412
import io.dongtai.log.DongTaiLog;
1513

1614
import java.io.File;
15+
import java.lang.dongtai.TraceIdHandler;
1716
import java.lang.reflect.Method;
1817
import java.net.MalformedURLException;
1918
import java.net.URL;
20-
import java.util.HashMap;
21-
import java.util.HashSet;
22-
import java.util.Map;
23-
import java.util.Set;
19+
import java.util.*;
2420

2521
public class GrpcHandler {
2622
private static IastClassLoader gRpcClassLoader;
@@ -56,7 +52,7 @@ private static void createClassLoader(Object channel) {
5652

5753
Class<?> classOfGrpcProxy = gRpcClassLoader.loadClass("io.dongtai.plugin.GrpcProxy");
5854
methodOfInterceptChannel = classOfGrpcProxy
59-
.getDeclaredMethod("interceptChannel", Object.class, String.class, String.class);
55+
.getDeclaredMethod("interceptChannel", Object.class, TraceIdHandler.class);
6056
methodOfInterceptService = classOfGrpcProxy
6157
.getDeclaredMethod("interceptService", Object.class);
6258
methodOfGetRequestMetadata = classOfGrpcProxy.getDeclaredMethod("getServerMeta");
@@ -66,6 +62,10 @@ private static void createClassLoader(Object channel) {
6662
}
6763
}
6864

65+
public static void setSharedTraceId(String traceId) {
66+
sharedTraceId.set(traceId);
67+
}
68+
6969
/**
7070
* 拦截 Grpc client 的 channel,后续client调用Server端服务会经过该拦截器
7171
*
@@ -77,10 +77,7 @@ public static Object interceptChannel(Object channel) {
7777
createClassLoader(channel);
7878
}
7979
try {
80-
// todo: 考虑测试并发场景
81-
String traceId = ContextManager.getSegmentId();
82-
sharedTraceId.set(traceId);
83-
return methodOfInterceptChannel.invoke(null, channel, ContextManager.getHeaderKey(), traceId);
80+
return methodOfInterceptChannel.invoke(null, channel, new GrpcTraceManager());
8481
} catch (Exception e) {
8582
DongTaiLog.error(e);
8683
}
@@ -213,11 +210,11 @@ public static void sendMessage(Object message) {
213210
MethodEvent event = new MethodEvent(
214211
0,
215212
0,
216-
"io.grpc.stub.ClientCalls",
217-
"io.grpc.stub.ClientCalls",
218-
"blockingUnaryCall",
219-
"io.grpc.stub.ClientCalls.blockingUnaryCall(io.grpc.Channel, io.grpc.MethodDescriptor<ReqT,RespT>, io.grpc.CallOptions, ReqT)",
220-
"io.grpc.stub.ClientCalls.blockingUnaryCall(io.grpc.Channel, io.grpc.MethodDescriptor<ReqT,RespT>, io.grpc.CallOptions, ReqT)",
213+
"io.grpc.internal.ServerCallImpl",
214+
"io.grpc.internal.ServerCallImpl",
215+
"sendMessage",
216+
"io.grpc.internal.ServerCallImpl.sendMessage(RespT)",
217+
"io.grpc.internal.ServerCallImpl.sendMessage(RespT)",
221218
null,
222219
new Object[]{message},
223220
null,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.dongtai.iast.core.handler.hookpoint.framework.grpc;
2+
3+
import io.dongtai.iast.core.handler.context.TraceManager;
4+
5+
public class GrpcTraceManager extends TraceManager {
6+
@Override
7+
public String getTraceId() {
8+
String traceId = super.getTraceId();
9+
GrpcHandler.setSharedTraceId(traceId);
10+
return traceId;
11+
}
12+
}

dongtai-plugins/dongtai-grpc/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
<version>${grpc-all.version}</version>
2626
<scope>provided</scope>
2727
</dependency>
28+
<dependency>
29+
<groupId>io.dongtai.iast</groupId>
30+
<artifactId>dongtai-spy</artifactId>
31+
</dependency>
2832
</dependencies>
2933

3034
<build>

0 commit comments

Comments
 (0)