From c77a4bcf05c9549bc035794f316b6ec4c8ed66f2 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Mon, 20 Jul 2020 21:01:28 +0800 Subject: [PATCH] watch/trace/monitor/tt/stack support verbose option, print ConditionExpress result. #1348 --- .../arthas/core/advisor/AdviceListenerAdapter.java | 10 ++++++++++ .../monitor200/AbstractTraceAdviceListener.java | 6 +++++- .../core/command/monitor200/EnhancerCommand.java | 8 ++++++++ .../command/monitor200/MonitorAdviceListener.java | 3 ++- .../core/command/monitor200/MonitorCommand.java | 3 ++- .../core/command/monitor200/StackAdviceListener.java | 11 ++++++++--- .../arthas/core/command/monitor200/StackCommand.java | 3 ++- .../command/monitor200/TimeTunnelAdviceListener.java | 6 +++++- .../core/command/monitor200/TimeTunnelCommand.java | 3 ++- .../core/command/monitor200/TraceAdviceListener.java | 3 ++- .../arthas/core/command/monitor200/TraceCommand.java | 3 ++- .../core/command/monitor200/WatchAdviceListener.java | 12 +++++++++--- .../arthas/core/command/monitor200/WatchCommand.java | 3 ++- 13 files changed, 59 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java index 21315bac3..724414d43 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java @@ -20,6 +20,8 @@ public abstract class AdviceListenerAdapter implements AdviceListener, ProcessAw private Process process; private long id = ID_GENERATOR.addAndGet(1); + private boolean verbose; + @Override public long id() { return id; @@ -144,4 +146,12 @@ public abstract class AdviceListenerAdapter implements AdviceListener, ProcessAw process.end(); } + public boolean isVerbose() { + return verbose; + } + + public void setVerbose(boolean verbose) { + this.verbose = verbose; + } + } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java index 069d4e0f0..553c7d0d0 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java @@ -74,7 +74,11 @@ public class AbstractTraceAdviceListener extends AdviceListenerAdapter { double cost = threadLocalWatch.costInMillis(); if (--threadBoundEntity.get().deep == 0) { try { - if (isConditionMet(command.getConditionExpress(), advice, cost)) { + boolean conditionResult = isConditionMet(command.getConditionExpress(), advice, cost); + if (this.isVerbose()) { + process.write("Condition express: " + command.getConditionExpress() + " , result: " + conditionResult + "\n"); + } + if (conditionResult) { // 满足输出条件 if (isLimitExceeded(command.getNumberOfLimit(), process.times().get())) { // TODO: concurrency issue to abort process diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java index 6fb9bace2..b92c0ccc0 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/EnhancerCommand.java @@ -40,12 +40,20 @@ public abstract class EnhancerCommand extends AnnotatedCommand { protected long listenerId; + protected boolean verbose; + @Option(longName = "listenerId") @Description("The special listenerId") public void setListenerId(long listenerId) { this.listenerId = listenerId; } + @Option(shortName = "v", longName = "verbose", flag = true) + @Description("Enables print verbose information, default value false.") + public void setVerbosee(boolean verbose) { + this.verbose = verbose; + } + /** * 类名匹配 * diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorAdviceListener.java index d19ba7e5c..7b04598f4 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorAdviceListener.java @@ -75,9 +75,10 @@ class MonitorAdviceListener extends AdviceListenerAdapter { private MonitorCommand command; private CommandProcess process; - MonitorAdviceListener(MonitorCommand command, CommandProcess process) { + MonitorAdviceListener(MonitorCommand command, CommandProcess process, boolean verbose) { this.command = command; this.process = process; + super.setVerbose(verbose); } @Override diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorCommand.java index e779c6ff5..0b4a0eed9 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/MonitorCommand.java @@ -1,6 +1,7 @@ package com.taobao.arthas.core.command.monitor200; +import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.command.CommandProcess; @@ -100,7 +101,7 @@ public class MonitorCommand extends EnhancerCommand { @Override protected AdviceListener getAdviceListener(CommandProcess process) { - final AdviceListener listener = new MonitorAdviceListener(this, process); + final AdviceListener listener = new MonitorAdviceListener(this, process, GlobalOptions.verbose || this.verbose); /* * 通过handle回调,在suspend时停止timer,resume时重启timer */ diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java index 783d8b767..64426883c 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java @@ -22,9 +22,10 @@ public class StackAdviceListener extends AdviceListenerAdapter { private StackCommand command; private CommandProcess process; - public StackAdviceListener(StackCommand command, CommandProcess process) { + public StackAdviceListener(StackCommand command, CommandProcess process, boolean verbose) { this.command = command; this.process = process; + super.setVerbose(verbose); } @Override @@ -53,7 +54,11 @@ public class StackAdviceListener extends AdviceListenerAdapter { // 本次调用的耗时 try { double cost = threadLocalWatch.costInMillis(); - if (isConditionMet(command.getConditionExpress(), advice, cost)) { + boolean conditionResult = isConditionMet(command.getConditionExpress(), advice, cost); + if (this.isVerbose()) { + process.write("Condition express: " + command.getConditionExpress() + " , result: " + conditionResult + "\n"); + } + if (conditionResult) { // TODO: concurrency issues for process.write process.write("ts=" + DateUtils.getCurrentDate() + ";" + stackThreadLocal.get() + "\n"); process.times().incrementAndGet(); @@ -61,7 +66,7 @@ public class StackAdviceListener extends AdviceListenerAdapter { abortProcess(process, command.getNumberOfLimit()); } } - } catch (Exception e) { + } catch (Throwable e) { logger.warn("stack failed.", e); process.write("stack failed, condition is: " + command.getConditionExpress() + ", " + e.getMessage() + ", visit " + LogUtil.loggingFile() + " for more details.\n"); diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java index 263c69b3c..d5a721860 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackCommand.java @@ -1,5 +1,6 @@ package com.taobao.arthas.core.command.monitor200; +import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.command.CommandProcess; @@ -102,7 +103,7 @@ public class StackCommand extends EnhancerCommand { @Override protected AdviceListener getAdviceListener(CommandProcess process) { - return new StackAdviceListener(this, process); + return new StackAdviceListener(this, process, GlobalOptions.verbose || this.verbose); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java index fcaaa040b..24b9e24fb 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java @@ -40,9 +40,10 @@ public class TimeTunnelAdviceListener extends AdviceListenerAdapter { // 方法执行时间戳 private final ThreadLocalWatch threadLocalWatch = new ThreadLocalWatch(); - public TimeTunnelAdviceListener(TimeTunnelCommand command, CommandProcess process) { + public TimeTunnelAdviceListener(TimeTunnelCommand command, CommandProcess process, boolean verbose) { this.command = command; this.process = process; + super.setVerbose(verbose); } @Override @@ -75,6 +76,9 @@ public class TimeTunnelAdviceListener extends AdviceListenerAdapter { boolean match = false; try { match = isConditionMet(command.getConditionExpress(), advice, cost); + if (this.isVerbose()) { + process.write("Condition express: " + command.getConditionExpress() + " , result: " + match + "\n"); + } } catch (ExpressException e) { logger.warn("tt failed.", e); process.write("tt failed, condition is: " + command.getConditionExpress() + ", " + e.getMessage() diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java index 707d44114..cb9bf2ded 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelCommand.java @@ -2,6 +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.Advice; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.advisor.ArthasMethod; @@ -313,7 +314,7 @@ public class TimeTunnelCommand extends EnhancerCommand { @Override protected AdviceListener getAdviceListener(CommandProcess process) { - return new TimeTunnelAdviceListener(this, process); + return new TimeTunnelAdviceListener(this, process, GlobalOptions.verbose || this.verbose); } // 展示指定记录 diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceAdviceListener.java index 4e50c5bf2..df29e8a4d 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceAdviceListener.java @@ -12,8 +12,9 @@ public class TraceAdviceListener extends AbstractTraceAdviceListener implements /** * Constructor */ - public TraceAdviceListener(TraceCommand command, CommandProcess process) { + public TraceAdviceListener(TraceCommand command, CommandProcess process, boolean verbose) { super(command, process); + super.setVerbose(verbose); } /** diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceCommand.java index e18b76fe7..849b7682f 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TraceCommand.java @@ -1,5 +1,6 @@ package com.taobao.arthas.core.command.monitor200; +import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.command.CommandProcess; @@ -147,7 +148,7 @@ public class TraceCommand extends EnhancerCommand { @Override protected AdviceListener getAdviceListener(CommandProcess process) { if (pathPatterns == null || pathPatterns.isEmpty()) { - return new TraceAdviceListener(this, process); + return new TraceAdviceListener(this, process, GlobalOptions.verbose || this.verbose); } else { return new PathTraceAdviceListener(this, process); } 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 fe1c48ec3..fa2db6982 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,6 +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.Advice; import com.taobao.arthas.core.advisor.ArthasMethod; import com.taobao.arthas.core.advisor.AdviceListenerAdapter; @@ -22,9 +23,10 @@ class WatchAdviceListener extends AdviceListenerAdapter { private WatchCommand command; private CommandProcess process; - public WatchAdviceListener(WatchCommand command, CommandProcess process) { + public WatchAdviceListener(WatchCommand command, CommandProcess process, boolean verbose) { this.command = command; this.process = process; + super.setVerbose(verbose); } private boolean isFinish() { @@ -78,7 +80,11 @@ class WatchAdviceListener extends AdviceListenerAdapter { try { // 本次调用的耗时 double cost = threadLocalWatch.costInMillis(); - if (isConditionMet(command.getConditionExpress(), advice, cost)) { + boolean conditionResult = isConditionMet(command.getConditionExpress(), advice, cost); + if (this.isVerbose()) { + process.write("Condition express: " + command.getConditionExpress() + " , result: " + conditionResult + "\n"); + } + if (conditionResult) { // TODO: concurrency issues for process.write Object value = getExpressionResult(command.getExpress(), advice, cost); String result = StringUtils.objectToString( @@ -89,7 +95,7 @@ class WatchAdviceListener extends AdviceListenerAdapter { abortProcess(process, command.getNumberOfLimit()); } } - } catch (Exception e) { + } catch (Throwable e) { logger.warn("watch failed.", e); process.write("watch failed, condition is: " + command.getConditionExpress() + ", express is: " + command.getExpress() + ", " + e.getMessage() + ", visit " + LogUtil.loggingFile() diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchCommand.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchCommand.java index 7126f1181..7dd04e678 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchCommand.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchCommand.java @@ -2,6 +2,7 @@ package com.taobao.arthas.core.command.monitor200; import java.util.Arrays; +import com.taobao.arthas.core.GlobalOptions; import com.taobao.arthas.core.advisor.AdviceListener; import com.taobao.arthas.core.command.Constants; import com.taobao.arthas.core.shell.cli.Completion; @@ -182,7 +183,7 @@ public class WatchCommand extends EnhancerCommand { @Override protected AdviceListener getAdviceListener(CommandProcess process) { - return new WatchAdviceListener(this, process); + return new WatchAdviceListener(this, process, GlobalOptions.verbose || this.verbose); } @Override