Arthas 是一款开源的 Java 诊断工具,由阿里巴巴开源,主要面向在线上应用的实时监控和故障定位。它提供了一系列强大的功能,可以帮助开发者在不重启应用的情况下诊断应用中的问题
文档位置
https://arthas.aliyun.com/doc/
Arthas 主要应用于生产环境中的 Java 应用诊断,具体场景包括:
Arthas 可以从其GitHub仓库下载,提供了一个安装脚本,可以很容易地在目标机器上安装。
https://github.com/alibaba/arthas
使用命令行工具,可以启动 Arthas 并附加到目标Java进程。
java -jar arthas-boot.jar
在 Arthas 控制台中,可以输入各种命令来执行诊断和监控操作。
因为文件是绿色版本,直接删除安装目录既可
rm -rf ./arthas # 隐藏目录
rm -rf logs/ # 日志目录
监控指定类中方法的执行情况
用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息
方法拥有一个命名参数 [c:],意思是统计周期(cycle of output),拥有一个整型的参数值
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[c:] | 统计周期,默认值为120秒 |
监控demo.MathGame类中primeFactors方法
,并且每5S更新一次状态
monitor demo.MathGame primeFactors -c 5
监控的维度说明
监控项 | 说明 |
---|---|
timestamp | 时间戳 |
class | Java类 |
method | 方法(构造方法、普通方法) |
total | 调用次数 |
success | 成功次数 |
fail | 失败次数 |
rt | 平均耗时 |
fail-rate | 失败率 |
方法执行数据观测,让你能方便的观察到指定方法的调用情况。
能观察到的范围为:返回值、抛出异常、入参,通过编写OGNL 表达式进行对应变量的查看。
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
express | 观察表达式 |
condition-express | 条件表达式 |
-b | 在方法调用之前观察before |
-e | 在方法异常之后观察 exception |
-s | 在方法返回之后观察 success |
-f | 在方法结束之后(正常返回和异常返回)观察 finish |
-E | 开启正则表达式匹配,默认为通配符匹配 |
-x:1\-x 1 | 指定输出结果的属性遍历深度,默认为 1 |
这里重点要说明的是观察表达式,观察表达式的构成主要由ognl 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。
案例:
# 查看方法执行的返回值
watch demo.MathGame primeFactors returnObj
# 观察demo.MathGame类中primeFactors方法出参和返回值,结果属性遍历深度为2。
# params:表示所有参数数组(因为不确定是几个参数)。
# returnObject:表示返回值
watch demo.MathGame primeFactors "{params,returnObj}" -x 2
# -b 方法执行前的参数
watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
# 查看方法中的属性
watch demo.MathGame primeFactors "{target}" -x 2 -b
watch demo.MathGame primeFactors "{target.illegalArgumentCount}" -x 2 -b
watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
对方法内部调用路径进行追踪,并输出方法路径上的每个节点上耗时。
trace 命令能主动搜索 class-pattern/method-pattern
对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
观察表达式的构成主要由ognl 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。
很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如trace *StringUtils isBlank '#cost>100’表示当执行时间超过100ms的时候,才会输出trace的结果。
watch/stack/trace这个三个命令都支持#cost耗时条件过滤。
参数说明:
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达匹配 |
method-pattern | 方法名表达式匹配 |
condition-express | 条件表达式,使用OGNL表达式 |
[E] | 开启正则表达式匹配,默认是通配符匹配 |
[n:] | 设置命令执行次数 |
#cost | 方法执行耗时,单位是毫秒 |
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
condition-express | 条件表达式 |
#cost | 过滤条件,只追踪满足的耗时方法 |
# trace函数指定类的指定方法
trace demo.MathGame run
# 在浏览器上进行登录操作,检查最耗时的方法
trace *.DispatcherServlet *
# 可以分步trace,请求最终是被DispatcherServlet#doDispatch()处理了
trace *.FrameworkServlet doService