mirror of
https://github.com/alibaba/arthas.git
synced 2024-04-21 10:21:39 +00:00
watch command support print access point (#1628)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+13
-4
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user