arthas获取spring中的bean

现在大部分应用都是通过Spring来管理对象, 在使用arthas分析线上问题时, 如何获取Spring中已经注入到容器中的Bean, 主要是使用tt命令。

首先执行如下命令,等待输出

1
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod -n 3

假设要搜索的类名为com.example.DemoService, 注意此处需要使用类的全限定名。

1
tt -i 1000 -w 'target.getApplicationContext().getBean("com.example.DemoService").getTargetSource().target'

arthas获取http请求的入参和出参

有时我们需要线上跟踪某个请求的入参和出参, 此时可以使用arthas的watch命令。

基于spring的工程,所有请求都会走RequestMappingHandlerAdapter的invokeHandlerMethod方法, 所以跟踪此方法。

有两点说明一下:

  • 此处只打印了request,所以是params[0]
  • 使用uri来过滤请求地址

当然能看到的信息还有很多, 具体可以参考watch命令。

1
watch org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod 'params[0]' 'params[0].getRequestURI().contains("/ai/img")' -x 2