如何使用Arthas提高日常开发效率?

1. Arthas有什么功能,怎么用,请看:Arthas使用手册

2. Arthas命令比较复杂,一个帮助生成命令的IDEA插件:arthas idea plugin 使用文档

3. 基于Arthas实现的简单好用的热部署插件:ArthasHotSwap

一  引言
首先我们应该抛弃面向debug编程的思维,debug不一定是最高效的方法,遇到线上问题不能debug了怎么办。本文介绍如何使用Arthas代替debug提高日常开发效率。
开始之前,可以先浏览下上面推荐的这些文章,下面所使用到的东西在以上的文章都有详细的讲解。大家也可以先浏览下面的内容,确定所描述的确实可以提高开发效率,再去看上面的文章也是可以的。
首先我们要安装两个插件“arthas idea” 和 “ArthasHotSwap”,IDEA可以直接安装使用。“arthas idea”是为了高效率生成Arthas命令,“ArthasHotSwap”可以实现简单快捷的热部署。接下来我们通过几个场景来看如何使用Arthas提高日开发常效率。
二  5分钟解决一个问题
1  问题表象
问题的表象是预发接口返回参数为空,不知道为什么为空,关键地方又没有打日志。怎么办,debug?debug端口不好申请,而且一直占用环境引起公愤。加日志重新部署?部署时间太长,而且不一定查看日志就能发现问题。接下去我将使用Arthas排查问题。
2  如何发现问题
第一步:定位相关方法
首先定位到相关的代码,代码如下图所示,方法执行结果应该要返回一个map,也就是上面问题的extraData,返回为空,肯定是这里有问题,但不知道那行代码的问题。借助Arthas可以想到的是,我能观测这个方法的出参和入参,说不定能发现问题。于是使用Arthas的watch命令观测方法执行情况。
第二步:生成方法观测命令
安装了“arthas idea”插件之后,在方法名上面单击右键,选择watch,如下图所示。
第三步:登录应用服务器
一般应用都部署在云上或其他远程服务器,我们需要登录应用部署的服务器。
第四步:安装Arthas
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 回车 执行即可。
    curl -L https://arthas.aliyun.com/install.sh | sh
    第五步:运行Arthas
    上述命令会下载启动脚本文件 as.sh 到当前目录,直接在shell下面执行./as.sh,就会进入交互界面。
    第六步:执行观测方法命令
    第二步执行完后,观测方法的命令已经在粘贴板了,粘贴执行就行,示例命令如下:
      watch com.**.**.endpoint.BargainPlayApplyCycleEndPoint fetchPlayDetailRenderData '{params,returnObj,throwExp}' -n 5 -x 3 'params[0].getPlayToolDO().getId()==588'
      命令解释:'{params,returnObj,throwExp}' 表示观测对象,这里选择了入参、出参和异常,-n 5 表示观测到5次后停止,-x 3 表示打印观测对象的时候只打印3层嵌套结构,'params[0].getPlayToolDO().getId()==588' 为条件表达式,满足该条件的才会被观测到。
      第七步:查看观测结果
      前端重新触发执行后,得到观测结果如下所示,从入参可以看到playActivityApplyRequest中的targetId为null,实际上应该要取playActivityRecordDO中的targetId。从返回结果可以看到确实是因为商品ID不存在原因。
      3  更进一步解决问题
      截止目前已经发现了问题所在,一般的同学都是修改代码重新部署,等上10多分钟。我们要做不一般的同学,接下去就轮到ArthasHotSwap热部署插件上场了。在IDEA的插件仓库搜索并安装ArthasHotSwap。
      ArthasHotSwap 热部署
      修改代码 -> maven编译 -> 单击右键选择swap this class -> 热部署命令已经复制到粘贴板 -> 登录远程服务器粘贴并执行热部署命令 -> 热部署成功
      问题解决
      热部署成功,问题解决,前端重新请求,前端展示正常。
      虽然整个链路看上去很长,但是都是一些很简单的复制粘贴操作,这是我在联调过程中处理的实际问题,整个过程差不多就是5分钟左右,切身感受到Arthas的便利,忍不住分享一下。
      4  一些限制
      arthas redefine有一些限制导致热部署也有同样的限制。热部署时候,不能修改方法名、属性字段,只能修改方法体里面的代码。
      redefine 命令和 jad/watch/trace/monitor/tt 等命令会冲突。执行完 redefine 之后,如果再执行上面提到的命令,则会把 redefine 的字节码重置。也就是说,热部署执行完成之后,再执行 jad/watch/trace/monitor/tt 等命令,会使热部署失效,所以在适当的时候还是需要重新部署下。我们也可以采用其他方法规避,比如使用watch的时候,观测其他类的方法,而不是热部署的那个类。
      三  方法执行的时间隧道
      上面的场景讲到了使用watch命令观测方法执行参数,但是watch是观测方法执行瞬间的情况。如果我们想重现上次的调用该怎么办呢。
      在日常开发过程中,环境问题是非常影响开发效率的,特别是涉及其他团队的应用的时候,有时候希望上游再次触发一次调用都是很困难的一件事情。当你用上面的方法解决了你的问题之后,你想调试一下,发现已经夜深了,不好意思再让上游应用触发一次调用,该怎么办呢,自己根据watch观测的方法入参组装参数使用hsf控制台调用?我们要做不一般的同学,用工具解放生产力。
      1  获取tt命令
      Arthas的tt命令可以获取方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。
      安装好arthas idea插件之后,在需要记录执行的方法上面单击右键,选择TimeTunnel Tt,出现下面的选择框,第一个红框是获取记录方法执行的命令。第二个红框是记录方法执行之后需要对记录进行的操作,包括查看记录列表、查看记录执行情况、重现调用等。
      2  记录方法执行
      登录远程服务器,运行以下两条运行arthas,然后执行从idea插件复制的tt -t命令来记录方法执行,如下图所示。如果想停止记录可以输入q,查看记录使用tt -l。
        curl -L https://arthas.aliyun.com/install.sh | sh./as.sh
        3  搜索方法执行记录
        tt -l可以查看所有的方法执行记录,但是我们要和我们相关的执行记录,那么可以使用tt -s命令进行搜索。tt -s 命令后面需要携带过滤条件。条件表达式是使用OGNL编写,下面介绍几个通常的过滤表达式。首先介绍下几个对象,params表示入参,params[0]表示第一个参数,params[1]表示第二个参数,returnObj表示返回对象。
        • 根据入参过滤:tt -s 'params[2].getRecordId() == 110213603'

        • 根据返回结果过滤:tt -s 'returnObj.isSuccess() == false'

        • 根据入参和返回结果过滤:tt -s 'returnObj.isSuccess() == true && params[2].getRecordId() == 110213603'

        4  查看方法执行情况
        tt -w 相当于tt下面的watch命令,可以用来查看方法执行情况。使用idea插件获取tt -w 命令更方便。
        5  重新触发
        如果需要重新触发某条记录也是可行的,因为tt命令记录当时调用的情况,所以可以本地发起一次调用,tt -p -i 1000 命令的意思重新触发idex=1000的那条记录。不仅仅可以重新触发,还可以间隔时间内多次触发,tt -p --replay-times 5 --replay-interval 2000 -i 1000 表示重新触发5次,每次间隔2s。
        重新触发的时候我们可能还想再watch下方法执行情况,怎么办呢,另外再打开一个页面登录远程服务器,运行arthas,执行 watch 命令。
        6  一些限制
        ThreadLocal 信息丢失
        很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中,由于调用线程发生了变化,这些 ThreadLocal 线程信息无法通过 Arthas 保存,所以这些信息将会丢失。一些常见的 CASE 比如:鹰眼的 TraceId 等。
        引用的对象
        需要强调的是,tt 命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更,或者返回的对象经过了后续的处理,那么在 tt 查看的时候将无法看到当时最准确的值。这也是为什么 watch 命令存在的意义。

        (0)

        相关推荐

        • 干货分享:一文教你如何利用阿里开源工具,排查线上CPU居高问题

          前言 在我们开发过程中,无法避免的会出现所谓的垃圾代码,导致服务器的CPU一直处于100%.但我们应用已经上线,导致服务器CPU居高,但又不知道哪边出现的问题,我们应该怎么去找出哪边的代码出现问题呢? ...

        • 线上排障技巧 | 动态修改LOGGER级别

          前言 大多数情况下,我们会在打印日志时定义日志的LOGGER级别,用来控制输出的信息范围. 一方面,过多的输出会影响查看日志的效率,另一方面,过少的日志让问题定位变得困难. 但当线上出现问题时,线上容 ...

        • 极大提高国人开发效率超实用的 VS Code 插件

          Vue中文社区 今天 相信好多英语不好的同学在打代码的时候,经常会遇到不懂的单词,也相信好多时候同学写项目时候忘记框架的接口,需要网上翻阅文档,线上提问求助,参考其他项目的示例,那么如果你都过遇到这类 ...

        • 8个可以提高开发效率的JavaScript 库

          今天 现代前端开发相比以前来说幸福很多了,过去为了兼容 IE.火狐等浏览器环境焦头烂额,为了减少代码加速文件的加载尽可能的编写原生 JavaScript,能不用插件就不用(插件由于要考虑通用性,会增加 ...

        • SAP ABAP Development Tool 提高开发效率的十个小技巧

          这是 Jerry 2021 年的第 46 篇文章,也是汪子熙公众号总共第 323 篇原创文章. Jerry 已经有很长一阵子没有打开工作电脑上的 SAP ABAP Development Tool 了 ...

        • 看雷诺公司如何使用质量工具提高功能安全相关模型软件开发效率

          作为世界上最大的汽车制造商之一,雷诺同时也是电动汽车新兴技术领域的领导者.在雷诺位于巴黎郊区的LARDY和GUYANCOURT开发中心,超过14000名工程师正致力于为下一代乘用车创新技术理念.雷诺研 ...

        • 干货:行书连笔技巧,提高日常写字速度就靠这了!

          很多人会问到一个问题:"我慢慢写字的时候,字好像还可以,但是一写快,就变得很丑,那到底有没有一种方法,可以写得又快又好?" 其实,整个书法的发展史,就是伴随着"快写&qu ...

        • 提高“在家办公”效率的9种方法

          疫情当前,很多省份都延迟开工时间,大家都窝在家里不能出门,客户需求不能停,服务也不能停,在家办公是大部分人员的选择.一开始确实还不适应,发现弗格斯·科伊尔先生的建议挺好,分享给大家. 自2011年初以 ...

        • 诸葛io邱千秋:提高数据分析的效率,发挥数据的最大价值

          数字时代到来之后,通过数据采集,企业获取到多维度的数据,包括产品销售数据.用户消费数据.用户行为数据.业务运营数据等,采集数据是基础,数据的真正价值在于应用,一方面提升效率,帮助企业提升数据处理效率, ...

        • 指数级提升你开发效率的小技巧

          <HelloWorld公开课>自开播以来,为广大的学员普及了一系列的技术干货内容,受到了许多学员的喜爱.但我们也深知,系统的技术知识仅仅是一方面.在日常的开发中,如果你掌握了巧妙的开发技巧 ...

        • 提高10倍效率的96个word和Excel技巧

          96个Word和Excel使用技巧!拿走不谢 掌握了工作效率提高10倍以上! 转发存好! ​