Skip to content

Commit c0b7f6e

Browse files
authored
Merge pull request #594 from 15911075183ma/fix-feign-bug
Fix feign bug
2 parents 15581b7 + ffa021b commit c0b7f6e

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

dongtai-agent/src/main/java/io/dongtai/iast/agent/manager/EngineManager.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package io.dongtai.iast.agent.manager;
22

3-
import io.dongtai.iast.agent.*;
3+
import io.dongtai.iast.agent.IastClassLoader;
4+
import io.dongtai.iast.agent.IastProperties;
5+
import io.dongtai.iast.agent.LogCollector;
46
import io.dongtai.iast.agent.fallback.FallbackManager;
57
import io.dongtai.iast.agent.report.AgentRegisterReport;
6-
import io.dongtai.iast.agent.util.*;
8+
import io.dongtai.iast.agent.util.FileUtils;
9+
import io.dongtai.iast.agent.util.HttpClientUtils;
10+
import io.dongtai.iast.agent.util.ThreadUtils;
711
import io.dongtai.iast.common.state.AgentState;
812
import io.dongtai.log.DongTaiLog;
913
import io.dongtai.log.ErrorCode;
@@ -13,6 +17,8 @@
1317
import java.lang.instrument.Instrumentation;
1418
import java.lang.management.ManagementFactory;
1519
import java.util.jar.JarFile;
20+
import java.util.regex.Matcher;
21+
import java.util.regex.Pattern;
1622

1723
/**
1824
* 引擎管理类,负责engine模块的完整生命周期,包括:下载、安装、启动、停止、重启、卸载
@@ -248,11 +254,32 @@ public synchronized boolean uninstall() {
248254

249255
public static String getPID() {
250256
if (PID == null) {
251-
PID = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
257+
String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
258+
PID = extractPID(runtimeName);
252259
}
253260
return PID;
254261
}
255262

263+
/**
264+
* 通过正则提取runtimeName的PID
265+
* 从开头开始匹配,遇到非数字字符串停止匹配
266+
* @param runtimeName 运行名称通常为PID@HostName
267+
* @return PID
268+
*/
269+
public static String extractPID(String runtimeName){
270+
Pattern pattern = Pattern.compile("^\\d+");
271+
Matcher matcher = pattern.matcher(runtimeName);
272+
273+
//防止极端情况未获取到PID ,设置默认值为0,防止服务端出现问题
274+
String extractedNumber = "0";
275+
if (matcher.find()) {
276+
extractedNumber = matcher.group(); // 提取匹配到的数字
277+
}else {
278+
DongTaiLog.warn("Get PID parsing exception, PID raw data is {}",runtimeName);
279+
}
280+
return extractedNumber;
281+
}
282+
256283
public AgentState getAgentState() {
257284
return this.agentState;
258285
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.dongtai.iast.agent.manager;
2+
3+
import io.dongtai.iast.agent.IastProperties;
4+
import org.junit.Assert;
5+
import org.junit.Test;
6+
7+
import java.lang.management.ManagementFactory;
8+
9+
public class EngineManagerTest {
10+
11+
@Test
12+
public void extractPIDTest(){
13+
//初始化临时文件
14+
IastProperties.initTmpDir();
15+
//获取PID
16+
String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
17+
18+
//Java获取的runtimeName格式为 PID@虚拟机唯一标识 提取PID
19+
String pid = EngineManager.extractPID(runtimeName);
20+
Assert.assertTrue(pid.matches("\\d+"));
21+
}
22+
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,23 @@ public static void solveSyncInvoke(MethodEvent event, AtomicInteger invokeIdSequ
3535

3636
Method addHeaderMethod = template.getClass().getDeclaredMethod("header", String.class, String[].class);
3737
addHeaderMethod.setAccessible(true);
38-
String traceId = ContextManager.nextTraceId();
3938
// clear old traceId header
4039
/*
4140
防止高并发下的treeMap修改问题,暂时可解决
4241
*/
4342
synchronized (template){
43+
//将生成traceId下放到锁内
44+
String traceId = ContextManager.nextTraceId();
45+
4446
addHeaderMethod.invoke(template, ContextManager.getHeaderKey(), new String[]{});
4547
addHeaderMethod.invoke(template, ContextManager.getParentKey(), new String[]{});
4648
addHeaderMethod.invoke(template, ContextManager.getHeaderKey(), new String[]{traceId});
4749
addHeaderMethod.invoke(template, ContextManager.getParentKey(),
4850
new String[]{String.valueOf(EngineManager.getAgentId())});
51+
event.traceId = traceId;
4952
}
5053
// add to method pool
5154
event.source = false;
52-
event.traceId = traceId;
5355
event.setCallStacks(StackUtils.createCallStack(4));
5456
int invokeId = invokeIdSequencer.getAndIncrement();
5557
event.setInvokeId(invokeId);

0 commit comments

Comments
 (0)