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 ...
随机推荐
- docker 安装 jenkins
最近在做一个智能床垫的项目,为了方便测试上周客户新给了一台华为云服务器.要求在一天内把之前阿里云服务器的环境以及java应用迁到新服务器.所以,我就需要在新服务器安装redis,mysql,jenki ...
- 错误: tensorflow.python.framework.errors_impl.OutOfRangeError的解决方案
近日,在使用CascadeRCNN完成目标检测任务时,我在使用这个模型训练自己的数据集时出现了如下错误: tensorflow.python.framework.errors_impl.OutOfRa ...
- 从零开始的react入门教程(五),了解react中的表单,何为受控组件与非受控组件
壹 ❀ 引 我们在从零开始的react入门教程(四),了解常用的条件渲染.列表渲染与独一无二的key一文中介绍了react中常用的条件渲染操作,比如三元运算符,逻辑运算符等,结合react组件或者re ...
- Go 和 Colly笔记
Colly是Go下功能比较完整的一个HTTP客户端工具. 安装 Win10 下载zip包, 直接解压至c:根目录. 如果不打算直接命令行使用, 可以不配置环境变量 Ubuntu 下载tar.gz, 解 ...
- 【Android】使用AIDL实现进程间传递对象案例
1 前言 在 Android--使用AIDL实现进程间通讯简单案例 中介绍了使用 AIDL 在进程间传递字符串,对于8种基本数据类型( byte.short.int.long.float.doub ...
- Idea 本人开发常用几款插件
先说 idea装插件 首先,进入插件安装界面: 标注 1:显示 IntelliJ IDEA 的插件分类, All plugins:显示 IntelliJ IDEA 支持的所有插件: Enabled:显 ...
- 在PL/SQL中使用日期类型
在PL/SQL中使用日期类型 之前的文章介绍了在PL/SQL中使用字符串和数字了下.毫无疑问,字符串和数字很重要,但是可以确定的是没有哪个应用不依赖于日期的. 你需要记录事件的发生事件,人们的出生日期 ...
- 多线程系列(七) -ThreadLocal 用法及内存泄露分析
一.简介 在 Java web 项目中,想必很多的同学对ThreadLocal这个类并不陌生,它最常用的应用场景就是用来做对象的跨层传递,避免多次传递,打破层次之间的约束. 比如下面这个HttpSer ...
- 2021-07-20 value!==value,JavaScript中NaN
关于NaN NaN 属性代表一个"不是数字"的number类型的字面量值.这个特殊的值是因为运算不能执行而导致的,不能执行的原因要么是因为其中的运算对象之一非数字. NaN的出现场 ...
- error接口
// 实际上它是interface类型,这个类型有一个返回错误信息的单一方法: type error interface{ Error() string } 创建一个error最简单的方法就是调用er ...