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命令的使用。

因为我们只要要看到方法colourCheckpackageCheck 的返回值,就可以找到问题所在。

我们先看 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实战的更多相关文章

  1. java 诊断工具——Arthas

    该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql! 接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 ja ...

  2. Alibaba Java诊断工具Arthas之快速安装和简单使用

    Alibaba Java诊断工具Arthas简单介绍 : 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 1.这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception ...

  3. Java诊断工具Arthas

    Java诊断工具Arthas 1. Arthas简介 Arthas是阿里开源的一个线上java诊断工具,发现阿里还是挺喜欢开源一些技术的,造福人类.昨天试用了一下,发现真是强大,解决了我工作两年的很多 ...

  4. 【Java】15分钟快速体验阿里Java诊断工具Arthas

    [墙裂推荐]15分钟快速体验阿里Java诊断工具Arthas : https://alibaba.github.io/arthas/arthas-tutorials?language=cn&i ...

  5. Java 诊断工具 Arthas 教程学习笔记

    Java 诊断利器 Arthas,是阿里的一款开源工具.Github-alibaba/arthas 上可以看到它的介绍.了解它,主要是最近对分析 Java 错误堆栈比较感兴趣,机缘巧合看到了它. 本文 ...

  6. 阿里JAVA诊断工具Arthas的初步使用

    Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...

  7. Alibaba Java诊断工具Arthas查看Dubbo动态代理类

    原创/朱季谦 阅读Dubbo源码过程中,会发现,Dubbo消费端在做远程调用时,默认通过 Javassist 框架为服务接口生成动态代理类,接着再去调用代理类实现远程接口调用.在阅读这部分源码时,最后 ...

  8. 干货分享!JAVA诊断工具Arthas在Rainbond上实践~

    别再担心线上 Java 业务出问题怎么办了,Arthas 帮助你解决以下常见问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 ...

  9. 款阿里开源的 Java 诊断工具Arthas

    Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...

  10. 阿里巴巴开源框架java诊断工具--Arthas

    下载:arthas wget https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar --target-i ...

随机推荐

  1. 如果在循环中不改变vector的大小,C++编译器是否会将.size()优化为常数?

      在C++中,可以使用以下代码计算vector<int>中所有元素的和: vector<int> v = {1, 3, 7, 9}; sums = 0; for (int i ...

  2. Java并发(七)----线程sleep、yield、线程优先级

    1.sleep 与 yield sleep 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞) 其它线程可以使用 interrupt 方法打断正在睡眠的线 ...

  3. 探索C语言的数据类型:解密编程世界的核心秘密

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 常量与变量 1.1 常量 (1) 常量的概念 常量顾名思义就是无法改变的量,比如一周 ...

  4. 内存泄漏定位工具之 mtrace(一)

    1 前言 mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题.它的实现源码在glibc源码的malloc目录下,其基本设计原理为设 ...

  5. IntelliJ IDEA 查看一个接口的实现类。

  6. Linux-特殊权限设置(SUID、SGID、SBIT)

    一.SUID权限 1.概念 当s这个标志出现在文件所有者的x权限上时,例如文件权限状态"-rwsr-xr-x",此时就被称为Set UID,简称SUID. 如果该属主权限位上有执行 ...

  7. UVA12467 Secret Word 题解

    题目传送门 前置知识 前缀函数与 KMP 算法 解法 考虑将 \(S\) 翻转后得到 \(S'\),然后就转化为求 \(S'\) 的一个最长子串使得其是 \(S\) 的前缀.使用 KMP 求解即可. ...

  8. Linux中$home和波浪号~

    在Linux中当前用户的主目录可以有三种表示方法,都是等效的[正常不改配置情况下]例如用户名为sy,进入当前用户的主目录/home/sy 输入cd ~ 或输入cd $HOME 或输入cd /home/ ...

  9. 计算机算法设计与分析(第5版)PDF

    <计算机算法设计与分析(第5版)>是2018年电子工业出版社出版的图书,作者是王晓东. 整本书的结构是:先介绍算法设计策略思想,然后从解决经典算法问题来学习,通过实践的方式去学习算法. 网 ...

  10. 【Unity3D】UI Toolkit元素

    1 前言 ​ UI Toolkit简介 中介绍了 UI Builder.样式属性.UQuery.Debugger,UI Toolkit容器 中介绍了 VisualElement.ScrollView. ...