Skip to content

Commit fbab9fa

Browse files
author
fanzhongwei
committed
bugfix: 处理方法异常时无法记录方法执行日志
1 parent c2b0951 commit fbab9fa

File tree

3 files changed

+48
-9
lines changed

3 files changed

+48
-9
lines changed

agent/src/main/java/com/wenshuo/agent/log/ExecuteLogUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ private static void logExecuteCounter(String className, String methodName, long
165165
int compression = 150;
166166
int factor = 5;
167167
md = new MergingDigest(compression, (factor + 1) * compression, compression);
168+
md.add(executeTime);
168169
}
169170
methodCounterMap.put(methodName, new Object[] {1L, executeTime, md});
170171
} else {

agent/src/main/java/com/wenshuo/agent/transformer/AgentLogClassFileTransformer.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ private byte[] aopLog(ClassLoader loader, String className, byte[] byteCode) {
5959
}
6060
byteCode = aopLog(cc, className, byteCode);
6161
} catch (Exception ex) {
62+
ex.printStackTrace();
6263
log.error(ex.getMessage(), ex);
6364
}
6465
return byteCode;
@@ -100,10 +101,10 @@ private void aopLog(String className, CtMethod m) throws CannotCompileException
100101

101102
// 避免变量名重复
102103
m.addLocalVariable("dingjsh_javaagent_elapsedTime", CtClass.longType);
104+
m.insertAfter("dingjsh_javaagent_elapsedTime = " + timeMethodStr + " - dingjsh_javaagent_elapsedTime;"
105+
+ LOG_UTILS + ".log(" + aopClassName + ",\"" + m.getName()
106+
+ "\",(long)dingjsh_javaagent_elapsedTime" + ");", true);
103107
m.insertBefore("dingjsh_javaagent_elapsedTime = " + timeMethodStr + ";");
104-
m.insertAfter("dingjsh_javaagent_elapsedTime = " + timeMethodStr + " - dingjsh_javaagent_elapsedTime;");
105-
m.insertAfter(LOG_UTILS + ".log(" + aopClassName + ",\"" + m.getName()
106-
+ "\",(long)dingjsh_javaagent_elapsedTime" + ");");
107108
}
108109

109110
/**

agent/src/test/java/com/wenshuo/agent/test/TestCtMethod.java

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,12 @@
1010
import com.tdunning.math.stats.Dist;
1111
import com.tdunning.math.stats.MergingDigest;
1212
import com.tdunning.math.stats.ScaleFunction;
13+
import com.wenshuo.agent.ConfigUtils;
14+
import com.wenshuo.agent.javassist.*;
1315
import org.junit.Assert;
1416
import org.junit.Ignore;
1517
import org.junit.Test;
1618

17-
import com.wenshuo.agent.javassist.ClassPool;
18-
import com.wenshuo.agent.javassist.CtClass;
19-
import com.wenshuo.agent.javassist.CtMethod;
20-
import com.wenshuo.agent.javassist.Modifier;
21-
import com.wenshuo.agent.javassist.NotFoundException;
22-
2319
public class TestCtMethod {
2420

2521
private static List<String> staticMethodNames = Arrays.asList("privateStatic","protectedStatic","publicStatic","defaultStatic");
@@ -53,6 +49,47 @@ static void defaultStatic(){
5349
System.out.println("I'm default and static");
5450
}
5551

52+
public static Object publicStaticWithResult(){
53+
String result = null;
54+
System.out.println("I'm public and static");
55+
Random random = new Random();
56+
if(random.nextInt(100) < 50){
57+
result = new String("hello world:random.nextInt(100) < 50");
58+
return result;
59+
}
60+
result = new String("hello world:random.nextInt(100) >= 50");
61+
return result;
62+
}
63+
64+
@Test
65+
@Ignore
66+
public void asFinallyTest() throws Exception {
67+
String className = "com.wenshuo.agent.test.TestCtMethod";
68+
ClassPool pool = ClassPool.getDefault();
69+
CtClass ctClass = pool.get(className);
70+
71+
transformerMethod(className, ctClass.getDeclaredMethod("publicStatic"));
72+
transformerMethod(className, ctClass.getDeclaredMethod("publicStaticWithResult"));
73+
74+
ctClass.writeFile("/home/code/github/javaagent/agent/target");
75+
}
76+
77+
private static void transformerMethod(String className, CtMethod m) throws CannotCompileException {
78+
boolean isMethodStatic = Modifier.isStatic(m.getModifiers());
79+
String aopClassName = isMethodStatic ? "\"" + className + "\"" : "this.getClass().getName()";
80+
final String timeMethodStr
81+
= ConfigUtils.isUsingNanoTime() ? "java.lang.System.nanoTime()" : "java.lang.System.currentTimeMillis"
82+
+ "()";
83+
String LOG_UTILS = "com.wenshuo.agent.log.ExecuteLogUtils";
84+
85+
// 避免变量名重复
86+
m.addLocalVariable("dingjsh_javaagent_elapsedTime", CtClass.longType);
87+
m.insertAfter("dingjsh_javaagent_elapsedTime = " + timeMethodStr + " - dingjsh_javaagent_elapsedTime;"
88+
+ LOG_UTILS + ".log(" + aopClassName + ",\"" + m.getName()
89+
+ "\",(long)dingjsh_javaagent_elapsedTime" + ");", true);
90+
m.insertBefore("dingjsh_javaagent_elapsedTime = " + timeMethodStr + ";");
91+
}
92+
5693

5794
/**
5895
* 100个线程并发测试,每个线程往100个不同的Digest中添加5000000个随机数据[0, 100],并计算耗时<br/>

0 commit comments

Comments
 (0)