watch command support print access point (#1628)

This commit is contained in:
superheizai
2021-01-07 22:58:10 +08:00
committed by GitHub
parent dd997c267a
commit 8c441f13cf
5 changed files with 91 additions and 37 deletions
@@ -0,0 +1,22 @@
package com.taobao.arthas.core.advisor;
public enum AccessPoint {
ACCESS_BEFORE(1, "AtEnter"), ACCESS_AFTER_RETUNING(1 << 1, "AtExit"), ACCESS_AFTER_THROWING(1 << 2, "AtExceptionExit");
private int value;
private String key;
public int getValue() {
return value;
}
public String getKey() {
return key;
}
AccessPoint(int value, String key) {
this.value = value;
this.key = key;
}
}
@@ -12,11 +12,6 @@ public class Advice {
private final Object[] params;
private final Object returnObj;
private final Throwable throwExp;
private final static int ACCESS_BEFORE = 1;
private final static int ACCESS_AFTER_RETUNING = 1 << 1;
private final static int ACCESS_AFTER_THROWING = 1 << 2;
private final boolean isBefore;
private final boolean isThrow;
private final boolean isReturn;
@@ -64,14 +59,14 @@ public class Advice {
/**
* for finish
*
* @param loader 类加载器
* @param clazz 类
* @param method 方法
* @param target 目标类
* @param params 调用参数
* @param loader 类加载器
* @param clazz
* @param method 方法
* @param target 目标类
* @param params 调用参数
* @param returnObj 返回值
* @param throwExp 抛出异常
* @param access 进入场景
* @param throwExp 抛出异常
* @param access 进入场景
*/
private Advice(
ClassLoader loader,
@@ -89,16 +84,16 @@ public class Advice {
this.params = params;
this.returnObj = returnObj;
this.throwExp = throwExp;
isBefore = (access & ACCESS_BEFORE) == ACCESS_BEFORE;
isThrow = (access & ACCESS_AFTER_THROWING) == ACCESS_AFTER_THROWING;
isReturn = (access & ACCESS_AFTER_RETUNING) == ACCESS_AFTER_RETUNING;
isBefore = (access & AccessPoint.ACCESS_BEFORE.getValue()) == AccessPoint.ACCESS_BEFORE.getValue();
isThrow = (access & AccessPoint.ACCESS_AFTER_THROWING.getValue()) == AccessPoint.ACCESS_AFTER_THROWING.getValue();
isReturn = (access & AccessPoint.ACCESS_AFTER_RETUNING.getValue()) == AccessPoint.ACCESS_AFTER_RETUNING.getValue();
}
public static Advice newForBefore(ClassLoader loader,
Class<?> clazz,
ArthasMethod method,
Object target,
Object[] params) {
Class<?> clazz,
ArthasMethod method,
Object target,
Object[] params) {
return new Advice(
loader,
clazz,
@@ -107,16 +102,16 @@ public class Advice {
params,
null, //returnObj
null, //throwExp
ACCESS_BEFORE
AccessPoint.ACCESS_BEFORE.getValue()
);
}
public static Advice newForAfterRetuning(ClassLoader loader,
Class<?> clazz,
ArthasMethod method,
Object target,
Object[] params,
Object returnObj) {
Class<?> clazz,
ArthasMethod method,
Object target,
Object[] params,
Object returnObj) {
return new Advice(
loader,
clazz,
@@ -125,16 +120,16 @@ public class Advice {
params,
returnObj,
null, //throwExp
ACCESS_AFTER_RETUNING
AccessPoint.ACCESS_AFTER_RETUNING.getValue()
);
}
public static Advice newForAfterThrowing(ClassLoader loader,
Class<?> clazz,
ArthasMethod method,
Object target,
Object[] params,
Throwable throwExp) {
Class<?> clazz,
ArthasMethod method,
Object target,
Object[] params,
Throwable throwExp) {
return new Advice(
loader,
clazz,
@@ -143,8 +138,9 @@ public class Advice {
params,
null, //returnObj
throwExp,
ACCESS_AFTER_THROWING
AccessPoint.ACCESS_AFTER_THROWING.getValue()
);
}
}
@@ -15,6 +15,9 @@ public class WatchModel extends ResultModel {
private Integer expand;
private Integer sizeLimit;
private String className;
private String methodName;
private String accessPoint;
public WatchModel() {
}
@@ -63,4 +66,28 @@ public class WatchModel extends ResultModel {
public Integer getSizeLimit() {
return sizeLimit;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getAccessPoint() {
return accessPoint;
}
public void setAccessPoint(String accessPoint) {
this.accessPoint = accessPoint;
}
}
@@ -2,7 +2,7 @@ package com.taobao.arthas.core.command.monitor200;
import com.alibaba.arthas.deps.org.slf4j.Logger;
import com.alibaba.arthas.deps.org.slf4j.LoggerFactory;
import com.taobao.arthas.core.GlobalOptions;
import com.taobao.arthas.core.advisor.AccessPoint;
import com.taobao.arthas.core.advisor.Advice;
import com.taobao.arthas.core.advisor.ArthasMethod;
import com.taobao.arthas.core.advisor.AdviceListenerAdapter;
@@ -72,7 +72,6 @@ class WatchAdviceListener extends AdviceListenerAdapter {
}
private void watching(Advice advice) {
try {
// 本次调用的耗时
@@ -83,6 +82,7 @@ class WatchAdviceListener extends AdviceListenerAdapter {
}
if (conditionResult) {
// TODO: concurrency issues for process.write
Object value = getExpressionResult(command.getExpress(), advice, cost);
WatchModel model = new WatchModel();
@@ -91,6 +91,15 @@ class WatchAdviceListener extends AdviceListenerAdapter {
model.setValue(value);
model.setExpand(command.getExpand());
model.setSizeLimit(command.getSizeLimit());
model.setClassName(advice.getClazz().getName());
model.setMethodName(advice.getMethod().getName());
if (advice.isBefore()) {
model.setAccessPoint(AccessPoint.ACCESS_BEFORE.getKey());
} else if (advice.isAfterReturning()) {
model.setAccessPoint(AccessPoint.ACCESS_AFTER_RETUNING.getKey());
} else if (advice.isAfterThrowing()) {
model.setAccessPoint(AccessPoint.ACCESS_AFTER_THROWING.getKey());
}
process.appendResult(model);
process.times().incrementAndGet();
@@ -101,8 +110,8 @@ class WatchAdviceListener extends AdviceListenerAdapter {
} catch (Throwable e) {
logger.warn("watch failed.", e);
process.end(-1, "watch failed, condition is: " + command.getConditionExpress() + ", express is: "
+ command.getExpress() + ", " + e.getMessage() + ", visit " + LogUtil.loggingFile()
+ " for more details.");
+ command.getExpress() + ", " + e.getMessage() + ", visit " + LogUtil.loggingFile()
+ " for more details.");
}
}
}
@@ -18,7 +18,7 @@ public class WatchView extends ResultView<WatchModel> {
Object value = model.getValue();
String result = StringUtils.objectToString(
isNeedExpand(model) ? new ObjectView(value, model.getExpand(), model.getSizeLimit()).draw() : value);
process.write("[" + model.getAccessPoint() + "]method=" + model.getClassName() + "." + model.getMethodName() + "\n");
process.write("ts=" + DateUtils.formatDate(model.getTs()) + "; [cost=" + model.getCost() + "ms] result=" + result + "\n");
}