Java诊断工具Arthas:开篇之watch实战
Arthas是阿里开源的线上监控诊断产品,用于问题的排查和诊断。
它的出现大大提高线上排查问题的效率,这篇只讲它一个非常牛逼的功能,其它功能往后篇章会在展开详细说。
一、Arthas能为你做什么?
1、遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
2、我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?直接反编译指定的类
3、某个接口执行过慢,如何定位是哪个服务?哪个方法?
4、有什么办法可以监控到 JVM 的实时运行状态?
5、这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
6、怎么快速定位应用的热点,生成火焰图?
二、问题表象
下面有一段模拟代码,该接口的作用是:
检查某一个商品是否为合格商品,但最终判定合格商品的条件是:颜色、包装都必须合格。
/**
* 检查该商品是否是合格产品
*
* @param goodsId 商品ID
* @return ture:合格
*/
@Override
public Boolean getPassCheck(Integer goodsId) {
boolean colourCheck = this.colourCheck(goodsId);
boolean packageCheck = this.packageCheck(goodsId);
//两种检查都通过才会返回True
boolean passCheck = colourCheck && packageCheck;
return passCheck;
}
//颜色检查
private Boolean colourCheck(Integer goodsId) {
//这里模拟做了颜色检查
return Boolean.TRUE;
}
//包装检查
private Boolean packageCheck(Integer goodsId) {
//这里模拟做了包装检查
return Boolean.FALSE;
}
这个接口上线后,测试人员向你反馈一个问题?
商品ID为1234的商品,明明是合格商品,但最终返回的是false(不合格),这是什么原因?
这个时候你看着代码,说不上是什么原因,有可能是颜色检查不通过,或者是包装检查不通过,也可能是都不通过。
但因为你没有打日志,所以你也无法判定到底是哪个导致的。
那怎么办?
按照以前做法,简单,加上日志就可以了
//颜色检查
private Boolean colourCheck(Integer goodsId) {
Boolean aTrue = Boolean.TRUE;
log.info("颜色检查 商品ID={},最终返回={}", goodsId, aTrue);
return aTrue;
}
//包装检查
private Boolean packageCheck(Integer goodsId) {
Boolean aTrue = Boolean.FALSE;
log.info("包装检查 商品ID={},最终返回={}", goodsId, aTrue);
return aTrue;
}
我们在重新发起请求
http://localhost:8080/test/getPassCheck?goodsId=9999
在看下日志
颜色检查 商品ID=9999,最终返回=true
包装检查 商品ID=9999,最终返回=false
恭喜你,问题找到了,是 包装检查 不合格。
但是这种方式,必须经历以下阶段:测试、预发,然后生产。
这种方法效率低下,更糟糕的是,有些问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现。
那有没有好的解决办法。
当然有 Arthas就可以完美解决。
我们下面可以来演示下,如何在不添加日志的情况下,知道每一个方法的入参、出参是什么?
三、启动arthas
在命令行下面执行:
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择应用 java 进程:
* [1]: 8160 com.zhuangpo.event.MainApplication
[2]: 579
[3]: 8421 arthas-boot.jar
[4]: 8455 com.jincou.validation.ValidationApplication
选择你要查看的Java应用进程,上面的进程是第1个,则输入 1,再输入回车/enter。
Arthas 会 attach 到目标进程上,并输出日志:
[INFO] arthas home: /Users/xub/.arthas/lib/3.7.1/arthas
[INFO] Try to attach process 8160
Picked up JAVA_TOOL_OPTIONS:
[INFO] Attach process 8160 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.7.1
main_class com.zhuangpo.event.MainApplication
pid 8160
time 2023-10-18 11:35:21
[arthas@8160]$
四、watch命令大显身手
watch命令:便于观察指定方法的调用情况。具体地,可以观察到:方法入参、方法返回值、方法抛出异常。
我们同样以上面的示例来演示下watch命令的使用。
因为我们只要要看到方法colourCheck 和 packageCheck 的返回值,就可以找到问题所在。
我们先看 colourCheck(颜色检查) 方法
命令如下
watch com.zhuangpo.event.service.impl.ArthasTestServiceImpl colourCheck '{params,returnObj}' -n 5 -x 3
查看日志

查看packageCheck 包装检查方法
watch com.zhuangpo.event.service.impl.ArthasTestServiceImpl packageCheck '{params,returnObj}' -n 5 -x 3

从上面两张图执行结果,我们可以得出 颜色检查最终返回Ture,包装检查最终返回是False。所以问题就已经找到了。非常方便。
这里也会发现一个问题,就是arthas命令很长,很难记住有没有什么好办法?
当然有
下面介绍一个idea 插件,自动生成arthas相关命令
五、arthas idea插件
arthas idea plugin 更简单的使用 arthas 的 IDEA 插件,方便的构建各种 arthas 命令,复制到剪切板 然后到服务器上启动 arthas 执行命令
进入idea搜索 arthas idea 插件就可以。
下载成功后,当你想看哪一个方法的时候,只要在这个方法上右击:

这个时候只要把这个命令粘贴到指定位置就可以了。
相关文档
Arthas官方文档地址: https://arthas.aliyun.com/doc/
arthas idea插件GitHub地址:https://github.com/WangJi92/arthas-idea-plugin
声明: 公众号如需转载该篇文章,发表文章的头部一定要 告知是转至公众号: 后端元宇宙。同时也可以问本人要markdown原稿和原图片。其它情况一律禁止转载!
Java诊断工具Arthas:开篇之watch实战的更多相关文章
- java 诊断工具——Arthas
该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql! 接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 ja ...
- Alibaba Java诊断工具Arthas之快速安装和简单使用
Alibaba Java诊断工具Arthas简单介绍 : 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception ...
- Java诊断工具Arthas
Java诊断工具Arthas 1. Arthas简介 Arthas是阿里开源的一个线上java诊断工具,发现阿里还是挺喜欢开源一些技术的,造福人类.昨天试用了一下,发现真是强大,解决了我工作两年的很多 ...
- 【Java】15分钟快速体验阿里Java诊断工具Arthas
[墙裂推荐]15分钟快速体验阿里Java诊断工具Arthas : https://alibaba.github.io/arthas/arthas-tutorials?language=cn&i ...
- Java 诊断工具 Arthas 教程学习笔记
Java 诊断利器 Arthas,是阿里的一款开源工具.Github-alibaba/arthas 上可以看到它的介绍.了解它,主要是最近对分析 Java 错误堆栈比较感兴趣,机缘巧合看到了它. 本文 ...
- 阿里JAVA诊断工具Arthas的初步使用
Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...
- Alibaba Java诊断工具Arthas查看Dubbo动态代理类
原创/朱季谦 阅读Dubbo源码过程中,会发现,Dubbo消费端在做远程调用时,默认通过 Javassist 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...
- 干货分享!JAVA诊断工具Arthas在Rainbond上实践~
别再担心线上 Java 业务出问题怎么办了,Arthas 帮助你解决以下常见问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 ...
- 款阿里开源的 Java 诊断工具Arthas
Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...
- 阿里巴巴开源框架java诊断工具--Arthas
下载:arthas wget https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar --target-i ...
随机推荐
- tp使用workerman消息推送
安装 首先通过 composer 安装 composer require topthink/think-worker SocketServer 在命令行启动服务端 php think worker:s ...
- Hive中Lateral view用法
1. lateral view 简介 hive函数 lateral view 主要功能是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表.配合UDTF函数 ...
- Linux(Centos7)升级MySQL 5.7到8.0.31
一.下载MySQL安装包 下载地址:https://downloads.mysql.com/archives/community/ 二.备份 mkdir /home/mysqlback mysqldu ...
- NC14698 模拟战役
题目链接 题目 题目描述 齐齐和司机在玩单机游戏<红色警戒IV>,现在他们的游戏地图被划分成一个n*m的方格地图.齐齐的基地在最上方的4行格内,司机的基地在最下方的4行格内.他们只有一种攻 ...
- NC50493 石子合并
题目链接 题目 题目描述 将n堆石子绕圆形操场排放,现要将石子有序地合并成一堆.规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分. 请编写一个程序,读入堆数n及每堆的石子 ...
- 多层PCB线路板制作流程
PCB制作第一步是整理并检查pcb多层线路板布局(Layout).电路板制作工厂收到PCB设计公司的CAD文件,由于每个CAD软件都有自己独特的文件格式,所以深圳PCB板厂会转化为一个统一的格式Ger ...
- idea 灵异事件之maven 缓存
方法一 mvn clean install 方法二 强制刷新maven 1 idea 右侧的maven 窗口: 方法三 强制刷新maven 2 右键项目: 上面虽然是重新导入Maven依赖,按理说,I ...
- Centos8 安装 Redis6.0.16
下载,解压,编译,安装 安装至 /opt/redis/redis-6.0.16 目录 tar xvf redis-6.0.16.tar.gz gcc --version cd redis-6.0.16 ...
- Js实现链表操作
Js实现链表操作 JavaScript实现链表主要操作,包括创建链表.遍历链表.获取链表长度.获取第i个元素值.获取倒数第i个元素值.插入节点.删除节点.有序链表合并.有序链表交集. 创建链表 cla ...
- macOS使用CodeRunner快速配置fortran环境
个人网站:xzajyjs.cn 由于一些项目的缘故,需要有fortran的需求,但由于是M1 mac的缘故,不能像windows那样直接使用vs+ivf这种经典配置.搜了一下网上主流的跨平台方案,主要 ...