arthas watch 使用
所属分类 arthas
浏览量 3105
https://alibaba.github.io/arthas/watch
watch -h
USAGE:
watch [-b] [-e] [-x $value] [-f] [-h] [-n $value] [-E] [-M $value] [-s] class-pattern method-pattern express [condition-expre
ss]
SUMMARY:
Display the input/output parameter, return object, and thrown exception of specified method invocation
The express may be one of the following expression (evaluated dynamically):
target : the object
clazz : the object's class
method : the constructor or method
params : the parameters array of method
params[0..n] : the element of parameters array
returnObj : the returned object of method
throwExp : the throw exception of method
isReturn : the method ended by return
isThrow : the method ended by throwing exception
#cost : the execution time in ms of method invocation
Examples:
watch -b org.apache.commons.lang.StringUtils isBlank params
watch -f org.apache.commons.lang.StringUtils isBlank returnObj
watch org.apache.commons.lang.StringUtils isBlank '{params, target, returnObj}' -x 2
watch -bf *StringUtils isBlank params
watch *StringUtils isBlank params[0]
watch *StringUtils isBlank params[0] params[0].length==1
watch *StringUtils isBlank params '#cost>100'
watch -E -b org\.apache\.commons\.lang\.StringUtils isBlank params[0]
WIKI:
https://alibaba.github.io/arthas/watch
OPTIONS:
-b, --before Watch before invocation
-e, --exception Watch after throw exception
-x, --expand Expand level of object (1 by default)
-f, --finish Watch after invocation, enable by default
-h, --help this help
-n, --limits Threshold of execution times 最大执行次数
-E, --regex Enable regular expression to match (wildcard matching by default)
-M, --sizeLimit Upper size limit in bytes for the result (10 * 1024 * 1024 by default)
-s, --success Watch after successful invocation
class-pattern The full qualified class name you want to watch
method-pattern The method name you want to watch
express the content you want to watch, written by ognl.
Examples:
params
params[0]
'params[0]+params[1]'
'{params[0], target, returnObj}'
returnObj
throwExp
target
clazz
method
condition-express Conditional expression in ognl style, for example:
TRUE : 1==1
TRUE : true
FALSE : false
TRUE : 'params.length>=0'
FALSE : 1==2
OGNL Object Graph Navigation Language
方法执行数据观测
观察指定方法的调用情况。 返回值、抛出异常、入参,通过编写 OGNL 表达式进行相应变量的查看。
watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后
4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
-e 抛出异常时才触发
watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
#cost>200(单位ms) 耗时大于200ms时才会输出
条件表达式
'params[0]>10'
watch a.b.c hello '{params[0],params[0].getDimKey(params[1],false), returnObj}' 'params[2]!=null && params[2].toString().equals("-1")' -x 3
watch dyyx.util.WebUtil run '{params[1],throwExp}' 'throwExp.getMessage().equals("tiger")' -e -x 7
http://127.0.0.1:8080/api.jsp?error=tiger&msg=hello
watch demo.MathGame primeFactors 'target'
target 当前对象 查看当前对象中的属性
watch demo.MathGame primeFactors 'target.illegalArgumentCount'
-x 参数说明
-x, --expand Expand level of object (1 by default)
public static void run(HttpServletRequest request, Map< String, Object> context) throws Exception {
http://127.0.0.1:8080/api.jsp?error=&msg=hello
watch dyyx.util.WebUtil run '{params[1],throwExp}'
ts=2020-01-03 12:05:08; [cost=1.150441ms] result=@ArrayList[
@TreeMap[isEmpty=false;size=2],
null,
]
-x 2 可看到map里具体的值
watch dyyx.util.WebUtil run '{params[1],throwExp}' -x 2
ts=2020-01-03 12:05:16; [cost=0.66692ms] result=@ArrayList[
@TreeMap[
@String[result]:@String[hello],
@String[type]:@String[echo],
],
null,
]
异常观察
http://127.0.0.1:8080/api.jsp?error=error&msg=hello
watch dyyx.util.WebUtil run '{params[1],throwExp}' -x 2
ts=2020-01-03 12:06:31; [cost=0.201315ms] result=@ArrayList[
@TreeMap[
@String[type]:@String[echo],
],
java.lang.RuntimeException: error
at dyyx.util.WebUtil.run_echo(WebUtil.java:343)
at dyyx.util.WebUtil.run(WebUtil.java:297)
at org.apache.jsp.api_jsp._jspService(api_jsp.java:51)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:501)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
,
]
watch dyyx.HelloBean sayHello '{target,params,throwExp}' -e
watch dyyx.HelloBean sayHello '{target,target.toString(),params,throwExp}' -e -x 2
watch dyyx.HelloBean sayHello '{target,target.toString(),params,throwExp}' -e -x 2 -n 9
http://127.0.0.1:8080/api.jsp?type=hello2&name=tiger
watch dyyx.HelloBean sayHello2 '{target,params,throwExp}' -x 3
ts=2020-06-23 09:16:11; [cost=2.185813ms] result=@ArrayList[
@HelloBean[
name=@String[tiger],
seq=@AtomicLong[
serialVersionUID=@Long[1927816293512124184],
unsafe=@Unsafe[sun.misc.Unsafe@13929bda],
valueOffset=@Long[16],
VM_SUPPORTS_LONG_CAS=@Boolean[true],
value=@Long[8],
],
VERSION=@String[20200623 0909],
now=@Date[2020-06-23 09:16:11,714],
nowtimestr=@String[2020-06-23T09:16:11.714],
nowtime=@Long[1592874971715],
list=@ArrayList[
@String[a],
@String[b],
],
map=@HashMap[
@String[a]:@String[1],
@String[b]:@Long[2],
@String[c]:@Double[3.3],
@String[d]:@Date[2020-06-23 09:16:11,715],
],
],
@Object[][
@HashMap[
@String[nowstr]:@String[2020-06-23T09:16:11.714],
@String[now]:@Date[2020-06-23 09:16:11,714],
@String[nowtime]:@Long[1592874971714],
],
],
null,
]
私有的 静态的变量 都会输出
public class HelloBean {
private final String name;
private static final AtomicLong seq = new AtomicLong(0);
private static final String VERSION = "20200623 0909";
private Date now = new Date();
private String nowtimestr = LocalDateTime.now().toString();
private long nowtime = System.currentTimeMillis();
private List list = new ArrayList();
private Map map = new HashMap();
now=@Date[2020-06-23 09:16:11,714],
变量名=@类型[变量值]
watch dyyx.HelloBean sayHello2 '{target.VERSION,target.now,params,throwExp}' -x 3
watch failed, condition is: null, express is: {target.VERSION,target.now,params,throwExp}, ognl.OgnlException: VERSION [java.lang.NoSuchFieldException: VERSION], visit /Users/dugang/logs/arthas/arthas.log for more details.
watch dyyx.HelloBean sayHello2 '{target.now,params,throwExp}' -x 3
target.VERSION 会报错 静态变量
target.now 可以
Arthas的一些特殊用法文档说明
https://github.com/alibaba/arthas/issues/71
params[0].size()
params[0].{ #this.name } 只获取列表对象里的name字段
按条件过滤
params[0].{? #this.name == null }
过滤后统计
params[0].{? #this.age > 10 }.size()
上一篇
下一篇
zookeeper使用场景
arthas使用
编程心法
arthas tt 使用
arthas OGNL 使用
zookeeper内部原理