方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。
时空隧道能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。
于是乎,TimeTunnel 命令就诞生了。
对于一个最基本的使用来说,就是记录下当前方法的每次调用环境现场。
[arthas@25435]$ tt -t com.demo.system.service.LoginService setStudentInfo
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 58 ms, listenerId: 2
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
------------------------------------------------------------------------------------------------------------------------------------
1000 2021-08-25 13:45:52 0.101528 true false 0x226d408b LoginService setStudentInfo
参数包括类和具体的方法。
检索调用记录
当你用 tt
记录了一大片的时间片段之后,你希望能从中筛选出自己需要的时间片段,这个时候你就需要对现有记录进行检索。
[arthas@25435]$ tt -l
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
------------------------------------------------------------------------------------------------------------------------------------
1000 2021-08-25 13:45:52 0.101528 true false 0x226d408b LoginService setStudentInfo
Affect(row-cnt:1) cost in 1 ms.
可以看到有一次调用记录。
查看调用信息
对于具体一个时间片的信息而言,你可以通过 -i
参数后边跟着对应的 INDEX
编号查看到他的详细信息。
[arthas@25435]$ tt -i 1000
INDEX 1000
GMT-CREATE 2021-08-25 13:45:52
COST(ms) 0.101528
OBJECT 0x226d408b
CLASS com.demo.system.service.LoginService
METHOD setStudentInfo
IS-RETURN true
IS-EXCEPTION false
PARAMETERS[0] @RequestFacade[
request=@Request[org.apache.catalina.connector.Request@46d2fb98],
sm=@StringManager[org.apache.tomcat.util.res.StringManager@3fb5a803],
]
PARAMETERS[1] @StudentInfo[
userId=@Long[100],
userName=@String[xxx],
userNo=@String[14242919900721123X],
schoolNo=@String[10000114],
accountBalance=null,
currSelect=@Boolean[false],
orgNo=@String[70],
loginName=null,
]
RETURN-OBJ @Boolean[false]
Affect(row-cnt:1) cost in 4 ms.
通过-i选项,可以查看调用记录的具体信息。
重做一次调用
当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。
tt
命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 INDEX
编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 -p
参数。通过 --replay-times
指定 调用次数,通过 --replay-interval
指定多次调用间隔(单位ms, 默认1000ms)
$ tt -i 1004 -p
对调用记录进行重复调用。