目录
1:写在前头
还在为线上出现的问题而头大吗?
还在为线上没有打印日志回头加日志重新发布而苦恼吗?
还在为因为某些原因而工作效率低下而脑壳疼吗?
接下来介绍一款阿里开源的线上诊断利器--Arthas。经过本人测试确实牛皮的很,爱了 ,爱了。
2:安装
目前只针对于macos或者centos环境,安装步骤
1:使用 wget https://alibaba.github.io/arthas/arthas-boot.jar 进行下载
2:使用java -jar 进行启动 jar java -jar arthas-boot.jar
3:选择前面的 1,2,3进行attach到对应的app中,像这里我的app是ArthasTestApplication,所以我选择3,然后回车
这样就很简单的进入到了arthas连接对应app的界面了.
3:常用命令详解
3.1:jvm
可以看到当前jvm里面的一些参数,包括重要的指标,GC的次数以及时间等等,不是本篇的重点
3.2:trace (耗时)
语法:trace 全限定类名 方法名字 =======> trace com.zcc.arthastest.TestController getUser
可以查看在一次接口的接口的调用栈中,哪些接口耗时比较多,目前官方式用红颜色标识出来了。
很明显在截图中,这个方法使用了3003.885282中耗时多,并且在#19行,发现代码这里出现了线程休眠,说明这里可以优化。
3.3:watch(查看参数)
对于我们线上没有打入参啊,返回参数啊,抛出的异常啊,哪里排除的啊,然后一脸懵逼啊,心里一万个草拟吗啊,这下子不用慌了,几个简单的命令帮你轻松解决。
1:查看入参
watch -b 全限定类名 方法名字 params =======> watch -b com.zcc.arthastest.TestController getUser params
在截图中很明显的可以看到拦截到了输入的参数已经类型
2:查看出参
命令:watch 全限定类名 方法名字 "{params, returnObj, throwExp}" ====== >
watch com.zcc.arthastest.TestController getUser "{params, returnObj, throwExp}"
3:查看异常值
命令和查看出参的一样,下面就直接演示,当输入参数==1的时候,会抛出异常
watch 全限定类名 方法名字 "{params, returnObj, throwExp}" ====== >
watch com.zcc.arthastest.TestController getUser "{params, returnObj, throwExp}"
3.4:stack
查看调用栈和java工具包自带的jstack的功能差不多,都是查看线程的调用栈的。
命令:stack 全限定类名 方法名 =======> stack com.zcc.arthastest.TestController getUser
3.5:tt
tt -t com.zcc.arthastest.TestController getUser
还可以加上 -n 参数
tt -t -n 3 com.zcc.arthastest.TestController getUser 三次会退出,防止调用次数过多,不好查找
传说中的时空隧道,可以查看接口调用的记录,以及重放,这个真的是太猛了。
接口回放:
1:先使用tt -l 看看列表
2:选择一个index 来进行回放
命令: tt -i 1000 -p
回放 index = 1000的
回放 index = 1010的
4:总结
到此为止Arthas的简单介绍就到这里了,补充下,现在很多的公司基本上是用docker或者是基于docker部署的,其实Arthas也就是一个jar而已,完全放在dockerFIle中去一起构建成一个容器,要不然每发布一次就要重新下载一次,这个就很尴尬了,这个jar也不大,成本也不算很高吧。只要在DockerFile中添加一行代码即可 --- 鲁迅告诉你大树好乘凉,但是没有告诉你怎么找到这棵大树。以上中有不好的地方还请指导交流。
4:附件
本章测试代码地址:https://gitee.com/htmonitor/arthas.git