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. 教你用JavaScript获取大转盘

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个大转盘.当你难以抉择的时候不妨用这个案例来帮你做选择.通过编程实战我们可以学到按钮的 ...

  2. DELPHI IDE 代码智能提示

  3. 使用 Etcd 快照文件恢复 Etcd 数据:应对单节点及高可用集群情况

    1.概述 在 Kubernetes 集群中,所有操作的资源数据都存储在 Etcd 数据库上.为了确保在节点故障.集群迁移或其他异常情况下能够尽快恢复集群数据,我们需要定期对 Etcd 数据进行容灾备份 ...

  4. 你应该知道的提升Visual Studio开发能力的5个技巧

    如果你像我一样,或许你也沉迷于开发者工具.这就是我喜欢 Visual Studio 的原因之一--它有无数的生产力技巧. 这篇文章将展示五个这样的技巧,这些技巧对我每天的工作都有帮助.请注意,这些仅适 ...

  5. java 注解结合 spring aop 实现自动输出日志

    auto-log auto-log 是一款为 java 设计的自动日志监控框架. 创作目的 经常会写一些工具,有时候手动加一些日志很麻烦,引入 spring 又过于大材小用. 所以希望从从简到繁实现一 ...

  6. Goland 使用[临时]

    环境变量 因为module模式的引入, 多个项目可以共用同一套External Libraries, 在File->Settings->Go中, 设置GOROOT为go安装目录, 例如 / ...

  7. 【Unity3D】人机交互Input

    1 前言 ​ Input 是 Unity3D 中用于人机交互的工具类,用户可以调用其 GetKey.GetMousePosition.GetMouseButton.GetAxis.GetButton ...

  8. Springboot实现remember-me记住我功能

    1.什么是remeber-me? remeber-me即记住我功能,是我们在登录web系统时的常见勾选项.当我们登录一个web系统时除了输入常规的用户名.密码后还可以勾选记住我选项(假设该系统提供了该 ...

  9. ORACLE查询优化及gather_plan_statistics hint

    查询优化手段和gather_plan_statistics hint: 在10g以后我们可以通过利用gather_plan_statistics提示来了解更多的SQL执行统计信息,具体使用方法如下: ...

  10. Java I/O 教程(四) FileInputStream 类

    Java FileInputStream class 从一个文件读取字节数据. 用于从图像,音频,视频等文件中读取字节类型数据. 类定义 public class FileInputStream ex ...