Arthas watch 命令使用指南
作者 | Agentd
Arthas watch 命令使用指南
Arthas 是我很喜欢的一款 Java 领域的开发调试工具。
每次测试遇到问题的时候,当别人为了加一条日志而重发代码,我都会欣慰地拿出我的 Arthas 并且告诉他们:少年,你不用再为了加日志就重发代码而烦恼了。Arthas,你值得拥有。
这次我要介绍的是我使用最多的一个功能:watch
。Arthas 功能虽多,但我最喜欢的还是这一个。使用 watch
之后,我再也不用为了观察函数调用而加日志了。
Arthas 是什么
Arthas 官网是这么介绍自己的:
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
一键安装并启动 Arthas
- 方式一:通过 Cloud Toolkit 实现 Arthas 一键远程诊断
Cloud Toolkit 是阿里云发布的免费本地 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,可以将本地应用一键部署到任意服务器,甚至云端(ECS、EDAS、ACK、ACR 和 小程序云等);并且还内置了 Arthas 诊断、Dubbo工具、Terminal 终端、文件上传、函数计算 和 MySQL 执行器等工具。不仅仅有 IntelliJ IDEA 主流版本,还有 Eclipse、Pycharm、Maven 等其他版本。
推荐使用 IDEA 插件下载 Cloud Toolkit 来使用 Arthas:http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8
- 方式二:直接下载
地址:https://github.com/alibaba/arthas。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
复制代码
稍微解释一下上面这条 shell 命令。命令分为两部分,&&
之前的部分是下载 Arthas,之后的部分是启动 Arthas。
你可能会疑惑下载文件为什么不用 wget
而是用 curl
?这是因为有些服务器是没有预装 wget
的,但是基本都预装了 curl
。如果你的服务器预装了 wget
的话完全可以把 ‘curl’ 改成 wget
。
如果使用 wget 的话命令可以改成:
# wget 版命令
wget https://alibaba.github.io/arthas/arthas-boot.jar && java -Dfile.encoding=UTF-8 -jar arthas-boot.jar
复制代码
另外一个需要解释的点是 -Dfile.encoding=UTF-8
,这个 Java 设置是为了让 Arthas 输出中文的时候不会乱码,这一点可以看一下我以前的文章 由 Arthas 中文乱码引发的 Java 默认编码思考。
Arthas watch 命令
watch
让你能方便地观察到指定方法的调用情况。能观察到的范围为:返回值
、抛出异常
、入参
(还能观察执行函数的对象本身,不知道为什么官方介绍的时候没说这个」,通过编写 OGNL 表达式进行对应变量的查看。
# watch -h
# USAGE
watch [-b] [-e] [-x <value>] [-f] [-h] [-n <value>] [-E] [-M <value>] [-s] class-pattern method-pattern express [condition-express]
复制代码
1. 观察方法返回结果 returnObj
使用方式看着复杂,其实很简单。来个最简单的示例: 假设我们要观察下面这段代码中字符串的 contains
方法。
public class App {public static void main(String[] args) throws IOException {String hello = "Hello Arthas";while (true) {boolean contains = StringUtils.contains(hello, "Arthas");System.out.println(contains);}}
}
复制代码
可以使用如下语句:
## 观察 contains 返回结果
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj -n 3
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 68 ms.
# ts=2020-05-02 16:46:04; [cost=2.424254ms] result=@Boolean[true]
# ts=2020-05-02 16:46:05; [cost=0.21033ms] result=@Boolean[true]
# ts=2020-05-02 16:46:06; [cost=0.165514ms] result=@Boolean[true]
复制代码
-n 3
表示只执行三次,这参数挺常用,不然很容易被输出刷屏。
2. 过滤不关心的调用 condition-express
显然,真实的案例肯定不会如上面的示例那么简单。 真实的服务代码中,肯定不止一个地方调用了 String 的 contains
方法。我们需要把无关的调用过滤掉。
## 观察 contains 返回结果,并且过滤掉无关调用
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains returnObj 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 29 ms.
# ts=2020-05-02 16:48:50; [cost=0.331109ms] result=@Boolean[true]
# ts=2020-05-02 16:48:51; [cost=0.175224ms] result=@Boolean[true]
# ts=2020-05-02 16:48:52; [cost=0.138984ms] result=@Boolean[true]
复制代码
入参是一个很容易把不同调用区分开的方法,通过 params[1]=="Arthas"
这个 condition-express
,我们可以只保留第二个入参是 Arthas
的函数调用。
3. 同时观察入参和结果
[arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains {params,returnObj} 'params[1]=="Arthas"'
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 33 ms.
# ts=2020-05-02 16:51:27; [cost=0.507486ms] result=@ArrayList[
# @Object[][isEmpty=false;size=2],
# @Boolean[true],
# ]
复制代码
通过 {}
把字段包起来,可以同时观察想观察的字段。可以注意到一个点,params
是一个数组,但是打印 params
的时候并没有把具体内容打印出来,这个时候可以使用 -x 2
来指定打印对象的属性遍历深度。
arthas@11939]$ watch org.apache.commons.lang3.StringUtils contains {params,returnObj} 'params[1]=="Arthas"' -x 2
# Press Q or Ctrl+C to abort.
# Affect(class-cnt:1 , method-cnt:2) cost in 35 ms.
# ts=2020-05-02 16:51:33; [cost=0.391218ms] result=@ArrayList[
# @Object[][
# @String[Hello Arthas],
# @String[Arthas],
# ],
# @Boolean[true],
# ]
复制代码
4. 给大家来几个我实际用到的例子
在陌陌做动态推荐开发的时候,测试时经常会遇到查看某个用户是否开启了相应的业务开关,经常就会需要查看某个实验开关是否开启。
## 查看陌陌用户 1234567 是否开启 ElasticSearch 开关
watch com.momo.Experiment enableElasticSearch returnObj 'target.momoId=="1234567"'
# ts=2020-05-02 20:09:46; [cost=24.443527ms] result=@Boolean[true]
复制代码
我还经常会根据入参的陌陌用户 id 进行判断,查看返回结果或者异常:
## 查看 MorecControlFlow 类的 process 方法返回结果
## process 方法第一个参数的 momoId 属性值为 “123454567” 才生效
## 类路径和陌陌号都非真实数据
watch com.momo.MorecControlFlow process returnObj 'params[0].momoId=="123454567"'
# ts=2019-03-18 21:09:46; [cost=264.434972ms] result=@Boolean[true]
## 查看 IMorecShuffler 类的 shuffle 抛的异常
## process 方法第一个参数的 momoId 属性值为 “123454567” 才生效
watch com.momo.plugins.shuffler.IMorecShuffler shuffle throwExp 'params[0].morecRequest.momoId=="123454567"'
# ts=2019-03-27 20:54:29; [cost=46.642339ms] result=java.lang.IndexOutOfBoundsException: Index: 12, Size: 11at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:665)at java.util.ArrayList.add(ArrayList.java:477)at com.momo.plugin.shuffler.RoomShuffler.shuffle(RoomShuffler:45)
复制代码
一些小提示
上面我只是列了一下常用的观察方式和参数,watch 支持的命令还有很多,你可以查看 Arthas 的 watch 命令官方文档。
还可以通过启动 arthas 命令之后使用 watch -h
查看。
使用 Arthas 的过程中很多人会觉得获取类的全限定名很费劲,其实这个可以通过 Idea 的 Copy Refrence
快捷键解决。我自己定义的快捷键是 ⌥⇧⌘C
。
还有一点就是写代码的时候最好把代码拆细,尽量把小功能也封装成单独的函数,等你需要使用 Arthas 观察函数调用的时候,你会回来感谢自己的。
Arthas 征文活动火热进行中
Arthas 官方正在举行征文活动,如果你有:
- 使用 Arthas 排查过的问题
- 对 Arthas 进行源码解读
- 对 Arthas 提出建议
- 不限,其它与 Arthas 有关的内容
欢迎参加征文活动,还有奖品拿哦~点击投稿
“阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”
Arthas watch 命令使用指南相关推荐
- 高级 Linux 命令精通指南
原文出处 http://www.oracle.com/technetwork/cn/server-storage/linux/part1-093824-zhs.html Technorati 标签: ...
- Linux文件命令精通指南(三)(转)
Linux文件命令精通指南(三)(转) 查看和查找文件 文件过滤器 用来读取文件内容和在文件内容上执行操作的命令有时被称为 1y滤器.sed 和 awk 命令是两个滤波器的例子,因为在以前的 OTN ...
- Python快速实现 CMD 命令调用指南
Python快速实现 CMD 命令调用指南 在 Python 中,我们可以很方便地通过调用 CMD 命令来执行系统操作.本文将为您介绍如何使用 Python 调用 CMD 命令,并提供相关代码和详细描 ...
- Linux之curl命令用法指南学习
Linux之curl命令用法指南学习 前言 常用参数 命令样例 其他 参考链接 前言 应用场景 工作中经常需要用到curl命令在测试或生产服务器中测试第三方接口,尤其是一些内外网接口.判断线上接口信息 ...
- Linux文件命令精通指南(二)(转)
Linux文件命令精通指南(二)(转) 文件处理命令 剖析一个文件列表 ls 命令用来查看用户有执行权限的任意目录中的文件列表,该命令有许多有趣的选项.例如: $ ls -liah * 22684 - ...
- Linux Find 命令精通指南
作者:Sheryl Calish Linux find 命令是所有 Linux 命令中最有用的一个,同时也是最混乱的一个.它很难,因为它的语法与其他 Linux 命令的标准语法不同.但是,它很强大,因 ...
- linux bash命令_Ultimate Linux命令行指南-Full Bash教程
linux bash命令 Welcome to our ultimate guide to the Linux Command Line. This tutorial will show you so ...
- 1. Arthas的命令
万恶淫为首,百善孝为先 Arthas命令 可以查看相应的文档: https://arthas.aliyun.com/doc/命令.html 如: https://arthas.aliyun.com/d ...
- mysql dos入门_【Mysql】初学命令行指南
MYSQL初学者使用指南与介绍 一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbi ...
最新文章
- java 使用Spring的JdbcTemplate以及DriverManagerDataSource实现JDBC操作
- python自动登录校园网 密码_python实现校园网自动登录的示例讲解
- 【视频课】8小时系统性地掌握深度学习视频分类与行为识别理论+实践
- java安全编码指南之:输入注入injection
- 中职计算机专业英语说课稿,高职高专英语说课稿
- 什么是 Web 应用性能评测领域的 RAIL 模型
- MAVEN安装和配置
- MVC里面写html获取不到input,asp.net-mvc – ASP.Net [HiddenInput]数据属性在Razor中用Html.EditorForModel渲染时不起作用?...
- android 7.0 解锁亮屏,Android7.0亮屏流程分析
- 深度linux安装virtualbox,【玩转deepin】如何安装VirtualBox增强功能使得deepin系统全屏显示?...
- 如何在Eclipse中生成Native类对应的JNI的.h文件
- GAN能合成2k高清图了!还能手动改细节 | 论文+代码,英伟达出品
- 比较好的浏览器_一款安卓黑科技手机浏览器 体积很小,功能很6!
- openpose环境搭建(详细教程CPU/GPU)windows 10+python 3.7+CUDA 11.6+VS2022
- java 模板模式_java设计模式之模板方法模式详解
- 测绘界超强工具箱!CADCASS实用插件合集,各种功能应有尽有!断面、高程点、等高线、三角网、拓扑检查...
- 线性光耦(PC817)工作的分析
- Frida学习之旅(一)--Google Pixel手机的ROOT
- Alfira学习篇(Python)
- Docker三剑客——Docker Compose