Skip to content

Commit bde6978

Browse files
authored
Merge pull request #601 from 15911075183ma/fix-feign-traceId
fix:修复高并发下traceId重复问题
2 parents 4917fba + ebfc8ae commit bde6978

File tree

2 files changed

+17
-27
lines changed

2 files changed

+17
-27
lines changed

dongtai-core/src/main/java/io/dongtai/iast/core/bytecode/enhance/plugin/framework/feign/FeignSyncHandlerAdapter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import org.objectweb.asm.MethodVisitor;
99

1010
public class FeignSyncHandlerAdapter extends AbstractClassVisitor {
11-
private static final String FEIGN_SYNC_HANDLER_INVOKE = "feign.SynchronousMethodHandler.invoke(java.lang.Object[])";
11+
//此HOOK点添加header有并发安全风险,故修改为executeAndDecode
12+
// private static final String FEIGN_SYNC_HANDLER_INVOKE = "feign.SynchronousMethodHandler.invoke(java.lang.Object[])";
13+
private static final String FEIGN_SYNC_HANDLER_INVOKE = "feign.SynchronousMethodHandler.executeAndDecode(feign.RequestTemplate,feign.Request$Options)";
1214

1315
public FeignSyncHandlerAdapter(ClassVisitor classVisitor, ClassContext context) {
1416
super(classVisitor, context);

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/service/trace/FeignService.java

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,18 @@
88
import io.dongtai.iast.core.utils.TaintPoolUtils;
99
import io.dongtai.log.DongTaiLog;
1010

11-
import java.lang.reflect.Field;
1211
import java.lang.reflect.Method;
1312
import java.util.concurrent.atomic.AtomicInteger;
1413

1514
public class FeignService {
15+
1616
public static void solveSyncInvoke(MethodEvent event, AtomicInteger invokeIdSequencer) {
1717
try {
18-
if (event.parameterInstances.length != 1) {
19-
return;
20-
}
18+
Object parameterInstance = event.parameterInstances[0];
19+
20+
Method appendHeader = parameterInstance.getClass().getDeclaredMethod("appendHeader", String.class, String[].class);
21+
appendHeader.setAccessible(true);
2122

22-
Object handlerObj = event.objectInstance;
23-
Field metadataField = handlerObj.getClass().getDeclaredField("metadata");
24-
metadataField.setAccessible(true);
25-
Object metadata = metadataField.get(event.objectInstance);
26-
Method templateMethod = metadata.getClass().getMethod("template");
27-
Object template = templateMethod.invoke(metadata);
2823

2924
// get args
3025
Object args = event.parameterInstances[0];
@@ -33,35 +28,28 @@ public static void solveSyncInvoke(MethodEvent event, AtomicInteger invokeIdSequ
3328
boolean hasTaint = !event.getSourceHashes().isEmpty();
3429
event.addParameterValue(0, args, hasTaint);
3530

36-
Method addHeaderMethod = template.getClass().getDeclaredMethod("header", String.class, String[].class);
37-
addHeaderMethod.setAccessible(true);
3831
// clear old traceId header
39-
/*
40-
防止高并发下的treeMap修改问题,暂时可解决
41-
*/
42-
synchronized (template){
43-
//将生成traceId下放到锁内
44-
String traceId = ContextManager.nextTraceId();
32+
//曾经的hook点在高并发下有线程安全问题,新hook点判断无此问题,除去锁
33+
String traceId = ContextManager.nextTraceId();
34+
DongTaiLog.trace("InvokeId is {}, request headers is {}",event.getInvokeId(),traceId);
35+
appendHeader.invoke(parameterInstance,ContextManager.getHeaderKey(),new String[]{});
36+
appendHeader.invoke(parameterInstance,ContextManager.getParentKey(),new String[]{});
37+
appendHeader.invoke(parameterInstance,ContextManager.getHeaderKey(),new String[]{traceId});
38+
appendHeader.invoke(parameterInstance,ContextManager.getParentKey(),new String[]{String.valueOf(EngineManager.getAgentId())});
39+
event.traceId = traceId;
4540

46-
addHeaderMethod.invoke(template, ContextManager.getHeaderKey(), new String[]{});
47-
addHeaderMethod.invoke(template, ContextManager.getParentKey(), new String[]{});
48-
addHeaderMethod.invoke(template, ContextManager.getHeaderKey(), new String[]{traceId});
49-
addHeaderMethod.invoke(template, ContextManager.getParentKey(),
50-
new String[]{String.valueOf(EngineManager.getAgentId())});
51-
event.traceId = traceId;
52-
}
5341
// add to method pool
5442
event.source = false;
5543
event.setCallStacks(StackUtils.createCallStack(4));
5644
int invokeId = invokeIdSequencer.getAndIncrement();
5745
event.setInvokeId(invokeId);
5846
event.setPolicyType(PolicyNodeType.PROPAGATOR.getName());
5947
EngineManager.TRACK_MAP.get().put(invokeId, event);
60-
} catch (NoSuchFieldException ignore) {
6148
} catch (NoSuchMethodException ignore) {
6249
} catch (Throwable e) {
6350
DongTaiLog.debug("solve feign invoke failed: {}, {}",
6451
e.getMessage(), e.getCause() != null ? e.getCause().getMessage() : "");
6552
}
6653
}
54+
6755
}

0 commit comments

Comments
 (0)