Loading... ## monitor/watch/trace相关 ### monitor <div class="tip inlineBlock info"> - 方法执行监控对匹配 class-pattern / method-pattern 的类、方法的调用进行监控。 - monitor 命令是一个非实时返回命令,实时返回命令是输入之后立即返回,而非实时返回的命 令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ctrl+C 为止。 </div> <table border="1"> <tr> <td bgcolor=#D9F9D5>参数名称</td> <td bgcolor=#D9F9D5>参数说明</td> </tr> <tr> <td>class-pattern</td> <td>类名表达式匹配</td> </tr> <tr> <td>method-pattern</td> <td>方法名表达式匹配</td> </tr> <tr> <td>[E]</td> <td>开启正则表达式匹配,默认为通配符匹配</td> </tr> <tr> <td>[c:]</td> <td>统计周期,默认值为120秒</td> </tr> </table> ```shell # 过2秒统计一次,统计类club.ganbloy.controller.TianApiController中getEverydayEnglish方法 monitor -c 2 club.ganbloy.controller.TianApiController getEverydayEnglish ``` ![monitor示例][1] **监控维度说明** <table border="1"> <tr> <td bgcolor=#D9F9D5>参数名称</td> <td bgcolor=#D9F9D5>参数说明</td> </tr> <tr> <td>timestamp</td> <td>时间戳</td> </tr> <tr> <td>class</td> <td>Java类</td> </tr> <tr> <td>method</td> <td>方法(构造方法、普通方法)</td> </tr> <tr> <td>total</td> <td>调用次数</td> </tr> <tr> <td>success</td> <td>成功次数</td> </tr> <tr> <td>fail</td> <td>失败次数</td> </tr> <tr> <td>rt</td> <td>平均耗时</td> </tr> <tr> <td>fail-rate</td> <td>失败率</td> </tr> </table> ### watch <div class="tip inlineBlock info"> 方法执行数据观测,让你能方便的观察到指定方法的调用情况。能观察到的范围为: 返回值 、 抛出异常 、 入参 ,通过编写OGNL 表达式进行对应变量的查看。 </div> <table border="1"> <tr> <td bgcolor=#D9F9D5>参数名称</td> <td bgcolor=#D9F9D5>参数说明</td> </tr> <tr> <td>class-pattern</td> <td>类名表达式匹配</td> </tr> <tr> <td>method-pattern</td> <td>方法名表达式匹配</td> </tr> <tr> <td>express</td> <td>观察表达式</td> </tr> <tr> <td>condition-express</td> <td>条件表达式</td> </tr> <tr> <td>[b]</td> <td>在方法调用之前观察</td> </tr> <tr> <td>[e]</td> <td>在方法异常之后观察</td> </tr> <tr> <td>[s]</td> <td>在方法返回之后观察</td> </tr> <tr> <td>[f]</td> <td>在方法结束之后(之后返回和异常返回)观察</td> </tr> <tr> <td>[E]</td> <td>开启正则表达式匹配,默认为通配符匹配</td> </tr> <tr> <td>[x:]</td> <td>指定输出结果的属性遍历深度,默认为 1</td> </tr> </table> **特别说明** - watch命令定义了4个观察事件点,即 -b 方法调用前, -e 方法异常后, -s 方法返回后, -f 方 法结束后 - 4个观察事件点-b、-e、-s默认关闭,-f默认打开,当指定观察点被打开后,在相应事件点会 对观察表达式进行求值并输出 - 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在 ```shell # 观察club.ganboy.Demo类中getName方法出参合返回值,结果属性遍历深度为2。params表示所有参数数组,returnObject表示返回值 watch club.ganboy.Demo getName "{params,returnObj}" -x 2 # 条件表达式的例子,输出第1参数小于的情况 watch club.ganboy.Demo getName "{params[0],target}" "params[0]<0" ``` ### trace <div class="tip inlineBlock info"> - 方法内部调用路径,并输出方法路径上的每个节点上耗时 - trace 命令能主动搜索 class-pattern / method-pattern 对应的方法调用路径,渲染和统计整 个调用链路上的所有性能开销和追踪调用链路。 - 很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执 行的耗时来进行过滤了,例如 trace *StringUtils isBlank '#cost>100' 表示当执行时间超过 100ms的时候,才会输出trace的结果 </div> **参数说明** <table border="1"> <tr> <td bgcolor=#D9F9D5>参数名称</td> <td bgcolor=#D9F9D5>参数说明</td> </tr> <tr> <td>class-pattern</td> <td>类名表达式匹配</td> </tr> <tr> <td>method-pattern</td> <td>方法名表达式匹配</td> </tr> <tr> <td>condition-express</td> <td>条件表达式</td> </tr> <tr> <td>[E]</td> <td>开启正则表达式匹配,默认为通配符匹配</td> </tr> <tr> <td>[n:]</td> <td>命令执行次数</td> </tr> <tr> <td>#cost</td> <td>方法执行耗时</td> </tr> </table> ```shell # trace函数指定类的指定方法 tasce club.ganboy.Demo getName # 如果方法调用的次数很多,那么可以用-n参数指定捕捉结果的次数。比如下面的例子里,捕捉到一次调用 就退出命令。 trace club.ganboy.Demo getName -n 1 # 默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数,需要显式设置-- skipJDKMethod false。 trace --skipJDKMethod false club.ganboy.Demo getName # 据调用耗时过滤,trace大于0.5ms的调用路径 trace club.ganboy.Demo getName '#cost > .5' ``` ### stack (很少使用)### <div class="tip inlineBlock info"> - 输出当前方法被调用的调用路径 - 很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这 个方法是从那里被执行了,此时你需要的是 stack 命令。 </div> ```shell # 获取resolveDependency的调用路径 stack club.ganboy.Demo resolveDependency ``` [1]: https://cdn.ganhua.work/blog_static/images/2021/01/monitor.png 最后修改:2021 年 10 月 18 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 社会很单纯~复杂滴是人呐~谁能在乎我呀