前言
大家是否碰到线上环境日志打印不全,系统业务逻辑复杂方法嵌套深排查错误和定位优化耗时问题困难,那么阿里开源的 Java 诊断工具Arthus能很好的帮助我们查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
1.安装Arthas
1 | curl -O https://arthas.aliyun.com/arthas-boot.jar |
2.启动Arthas
用java -jar的方式启动,并选择自己启动的java程序:
1 | yinshuang$ java -jar arthas-boot.jar |
启动成功后,选择自己想要监听的java进程(例如这里我输入了5,选择了com.chinacscs.portal.StarterApplication这个java进程),接下来可以直接在[arthas@13272]$后输入Arthus命令,也可以通过浏览器访问本地远程端口输入命令,从arthas-client connect可以看出Arthus启动生成远程访问地址是http://127.0.0.1:3658
3.使用案例
大多数场景下,watch和trace命令可以解决大多数问题
如果对watch和trace命令用法不熟也没关系,这里推荐IDEA里的Arthas-idea 插件,
在代码里选中需要监控的方法,鼠标右键Arthus Commond选中对应的命令即可生成命令
(1) 打印日志
Java代码
1 | private void getIllegalPfcompy(Map<String, Object> dataMap) { |
watch命令打印getIllegalPfcompany方法入参、返回结果及异常
(**-n** 表示指定执行次数,**-x** 表示遍历方法深度)
1 | [arthas@17192]$ watch com.chinacscs.portal.customize.mapper.CustomizeQuarterReportMapper getIllegalPfcompany '{params,returnObj,throwExp}' -n 5 -x 3 |
根据上面打印日志发现getIllegalPfcompany方法抛出BadSqlGrammarException,排查发现sql最后一个字段多了一个逗号,修改后重新调用接口,查看日志结果:
1 | [arthas@17192]$ watch com.chinacscs.portal.customize.mapper.CustomizeQuarterReportMapper getIllegalPfcompany '{params,returnObj,throwExp}' -n 5 -x 3 |
修复sql问题后,两次调用getIllegalPfcompany方法正常返回20条数据
(2) 性能调优
Java代码
1 | private void getPfcomyRiskSituation(Map<String, Object> dataMap) { |
trace命令打印getPfcomyRiskSituation方法耗时
1 | [arthas@21436]$ trace com.chinacscs.portal.customize.service.impl.CustomizeQuarterReportServiceImpl getPfcomyRiskSituation -n 5 |
根据trace打印的日志,可以看出getIntegrityPfcompy方法为主要耗时方法,共耗时约83.9s,经排查发现发现getIntegrityPfcompy方法内存在慢sql(关联的字段的字符集不同utf8/utf8mb4),修改字符集保持一致后重新调用接口,日志如下,看出getIntegrityPfcompy方法耗时大大优化,共耗时约0.4s
1 | `---ts=2022-08-05 15:11:46;thread_name=http-nio-7050-exec-7;id=d4;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@5dc7391e |
补充说明:若想了解更高级的用法可以参考Arthus官方文档
- 本文作者: yinshuang
- 本文链接: https://yinshuang007.github.io/2023/02/12/Java应用诊断利器-Arthus/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!