diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/AccessPoint.java b/core/src/main/java/com/taobao/arthas/core/advisor/AccessPoint.java new file mode 100644 index 000000000..1d361c4ed --- /dev/null +++ b/core/src/main/java/com/taobao/arthas/core/advisor/AccessPoint.java @@ -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; + } +} \ No newline at end of file diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/Advice.java b/core/src/main/java/com/taobao/arthas/core/advisor/Advice.java index 55cca86c3..685454cad 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/Advice.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/Advice.java @@ -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() ); + } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/model/WatchModel.java b/core/src/main/java/com/taobao/arthas/core/command/model/WatchModel.java index d1e8d28b5..200518b3f 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/model/WatchModel.java +++ b/core/src/main/java/com/taobao/arthas/core/command/model/WatchModel.java @@ -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; + } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java index 6318c7fd3..f95c74632 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java @@ -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."); } } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/view/WatchView.java b/core/src/main/java/com/taobao/arthas/core/command/view/WatchView.java index efacab63f..2350f6b88 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/view/WatchView.java +++ b/core/src/main/java/com/taobao/arthas/core/command/view/WatchView.java @@ -18,7 +18,7 @@ public class WatchView extends ResultView { 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"); }