学习arthas(十四)方法执行时的时空隧道

Arthas
placeholder image
admin 发布于:2023-10-02 17:47:01
阅读:loading

很多时候有很多的问题由于不同的运行环境所在操作系统的不同,数据的不同,用户的不同等多种多样的因素存在,导致某些程序代码运行的有一些潜在问题,但这样的问题往往很难在线下开发测试环境去复现,导致一些问题的分析解决变得困难重重。

arthas的tt命令是方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。于是乎,TimeTunnel 命令就诞生了————“对于一个最基本的使用来说,就是记录下当前方法的每次调用环境及请求与响应现场。”

(1)监控某个类的某些方法,在监控的时间段内,输出存在的方法调用列表,相关的数据列有:索引、执行时间、耗时、正常返回、异常返回、对象HashCode、类、方法,参考如下列表如下:

image.png

(2)查看某个索引数据的当前实例对象,也可以查看DruidDataSource的参数信息,如username、password等关键信息,参考如下图所示:

image.png

(3)查看某个索引数据的当前实例对象

image.png

(4)查看某个索引数据的调用执行明细,可以看到本次请求的时间、请求的类和方法、请求参数、返回数据等

image.png

(5)按方法名称筛选,比grep二次筛选的要科学

image.png

(按方法名称筛选)

(6)***重新调用某个索引,将按照之前该索引被执行时传递的参数重新触发,tt 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 -p 参数。通过 --replay-times 指定 调用次数,通过 --replay-interval 指定多次调用间隔(单位 ms, 默认 1000ms)

(7)观察表达式“-w, --watch-express”使用表达式核心变量中所有变量作为已知条件编写表达式。也可以用于获取类的静态字段、调用类的静态方法。

(8)条件表达式、解决方法重载(方法参数个数、方法参数类型、解决指定参数)

需要强调的点

  • ThreadLocal 信息丢失

很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中,由于调用线程发生了变化,这些 ThreadLocal 线程信息无法通过 Arthas 保存,所以这些信息将会丢失。

  • 引用的对象

需要强调的是,tt 命令是将当前环境的对象引用保存起来,但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更,或者返回的对象经过了后续的处理,那么在 tt 查看的时候将无法看到当时最准确的值。这也是为什么 watch 命令存在的意义。

  • Session失效

若存在Session中获取数据的逻辑,会存在session数据无法获取的情况。

  • 缓存过期

若存在从缓存中获取数据的逻辑,若缓存已过期也可能会出现无法获取的情况。

 点赞


 发表评论

当前回复:作者

 评论列表


留言区