首页 > 编程语言 >Java诊断工具Arthas:开篇之watch实战

Java诊断工具Arthas:开篇之watch实战

时间:2024-03-11 14:35:58浏览次数:26  
标签:Java 检查 -- Arthas watch goodsId Boolean arthas com

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,goodsId,Boolean,arthas,com
From: https://www.cnblogs.com/qdhxhz/p/17788589.html

相关文章

  • Java基础输入输出
    好久不写普通Java,一上手发现简单的部分都忘记怎么写了……趁着这次练习,赶紧记一下packageorg.example;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){//System.out.println("Helloworld!");Scannerscanner=ne......
  • ubuntu20.04-通过docker安装jenkins并自动化发布java
    前言jenkins需要git、maven和node,其中maven和node手动添加,git和git环境是jenkins镜像自带了的。如果删除了docker对应的jenkins容器后(删除前一定备份jenkins_home整个文件夹,否则怕前功尽弃:tar-czvfjenkins_home.tar.gz/var/jenkins_home)如果删除了容器,需要重新安装并配置m......
  • java: 程序包com.sun.org.slf4j.internal不存在
    java:程序包com.sun.org.slf4j.internal不存在事件之由来问题之分析处理之方案收工事件之由来拉完别人的项目后,启动不了了,报错提示:java:程序包com.sun.org.slf4j.internal不存在1问题之分析就是别人用lombok了同时使用slf4j和lombok的时候会出现这个问题原因是slf4j和lombok自......
  • Java Http Get Post 请求工具类
    importcom.alibaba.fastjson.JSONObject;importorg.apache.http.NameValuePair;importorg.apache.http.client.config.RequestConfig;importorg.apache.http.client.entity.UrlEncodedFormEntity;importorg.apache.http.client.methods.CloseableHttpResponse;importorg......
  • default在java中的用法 java里default
    介绍default是在java8中引入的关键字,也可称为Virtualextensionmethods——虚拟扩展方法。是指,在接口内部包含了一些默认的方法实现(也就是接口中可以包含方法体,这打破了Java之前版本对接口的语法限制),从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。为什么需要这......
  • Java 对接Zabbix获取主机监控+告警数据
    1.Java对接ZabbixAPI前提准备  zabbix对接文档地址: https://www.zabbix.com/documentation/6.4/zh/manual/api对接ZabbixAPI接口需要针对对接的用户授予对应的API权限,如下图所示 使用超管账户登录zabbix 用户--->用户,查看用户列表      点击对接......
  • 狂神说Java——Mybatis学习笔记
    前言:配合狂神老师的教学视频使用效果更佳:https://www.bilibili.com/video/BV1NE411Q7Nx/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=4c3c519d33c113799489c7417a0a4c0e1、简介环境说明:jdk8+MySQL5.7.19maven-3.6.......
  • 深入浅出Java多线程(十):CAS
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十篇内容:CAS。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在多线程编程中,对共享资源的安全访问和同步控制是至关重要的。传统的锁机制,如synchronized关键字和ReentrantLock等,能够有效防止多个线程......
  • Java.CompletableFuture使用
    使用CompletableFuture替代Thread+Runnable解决Thread+Runnable没有返回值、串行化和组合任务问题1、CompletableFuture.runAsync异步没有返回值需要传入一个线程池publicstaticExecutorServiceexecutor=Executors.newFixedThreadPool(10);CompletableFuture.runAsync((......
  • java时间操作
    publicstaticvoidmain(String[]args){LocalDateTimetime=LocalDateTime.of(2022,11,30,6,6,6);DateTimeFormatterof=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");StringdateTime=time.format(of);Syste......