Arthas是阿里开源的java诊断工具。所以有直接的中文官网可以查看,很是方便。
为了让用户理解arthas能做什么,arthas官网给出了很典型的问题场景,如下:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到JVM的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
经常定位现网问题的同学一定有过以上痛苦,当一个现网问题没有思路,或者有思路却发现缺少日志的佐证时,我们往往束手无策。
公司是明令禁止黑补丁的,我们没法去增加日志打印来定位问题,所以如果客户允许用诊断工具,arthas是个不错的选择。
Arthas
支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab
自动补全功能,进一步方便进行问题的定位和诊断。
本片文章针对第三、四点仅限一次排查:
背景:一次与第三方的联合调试中,本地利用postman使用他们提供的参数,可以成功调用接口,但是第三方调用,token校验就是不通过,多次排查无果,也别说加日志重新更新定位,因为更新一次不容易,经大佬点拨,了解到了Arthas,刚好服务器上也安装了。
安装arthas就不赘述了,官网很详细!
直接上排查过程:
1.连上服务器,找到arthas安装目录:比如我的:
arthas的目录下有个as.sh文件
执行命令:./as.sh
theme@ip:/opt/xxx/arthas> ./as.sh
Arthas script version: 3.1.5
[INFO] JAVA_HOME: /opt/xxx/release/servicesupport/jdk/1.8.0_242
lsof: status error on TCP:LISTEN: No such file or directory
lsof: status error on -i: No such file or directory
lsof: status error on TCP:3658: No such file or directory
lsof 4.80
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
usage: [-?abhlnNoOPRstUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]]
[-p s] [+|-r [t]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.
lsof: status error on TCP:LISTEN: No such file or directory
lsof: status error on -i: No such file or directory
lsof: status error on TCP:8563: No such file or directory
lsof 4.80
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
usage: [-?abhlnNoOPRstUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]]
[-p s] [+|-r [t]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.
Found existing java process, please choose one and hit RETURN.
[1]: 80497 /opt/xxx/release/servicesupport/APIGateway/20190723165055/dgw-service/bin/jetty-distribution-9.2.22.v20170606/start.jar
[2]: 15170 org.apache.flume.node.Application
* [3]: 83285 org.apache.catalina.startup.Bootstrap
[4]: 79989 com.huawei.hirasp.masteragent.main.HiRASPMasterAgent
[5]: 20664 org.apache.catalina.startup.Bootstrap
[6]: 105658 org.apache.catalina.startup.Bootstrap
[7]: 96890 org.apache.flume.tools.FlumeToolsMain
[8]: 49247 org.apache.catalina.startup.Bootstrap
最后一块会有一些进程的id号,可事先使用 ps -ef|grep java,找出自己要排查的服务的进程号;
2.出入序号 3,即监控进程号为83285的java进程
3
Arthas home: /opt/xxx/arthas
Calculating attach execution time...
Attaching to 83285 using version /opt/xxx/arthas...
real 0m0.857s
user 0m0.428s
sys 0m0.036s
Attach success.
telnet connecting to arthas server... current timestamp is 1601278527
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://alibaba.github.io/arthas
tutorials https://alibaba.github.io/arthas/arthas-tutorials
version 3.1.5
pid 83285
time 2020-09-28 15:35:27
[arthas@83285]$
3.开始监控排查
命令:watch 全类名路径 方法名 "{params,returnObj}" -x 2
然后通知第三方开始调用,就可以实时监控服务器上的数据啦~
是不是很爽!!!
[arthas@83285]$ watch com.xxx.cloud.hitop.theme.filter.xxxxFilter isTokenCorrect "{params,returnObj}" -x 2
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 195 ms.
ts=2020-09-28 15:46:24; [cost=0.296437ms] result=@ArrayList[
@Object[][
@String[1232131313],
@String[123132313213231],
@String[1233213231232132],
],
@Boolean[false],
]
ts=2020-09-28 15:46:29; [cost=0.19607ms] result=@ArrayList[
@Object[][
@String[123123123123],
@String[1231321323],
@String[12313123213],
],
@Boolean[false],
]
还有很多其他的方法,以后有机会再一一使用!