使用Profile神器Arthas排查线上问题

Posted by 拜占庭 on 2020-04-21

1、Arthas 利用 spring applicationContext获取任何Bean

RequestMappingHandlerAdapter父接口ApplicationObjectSupport存在获取spring上下文方法getApplicationContext()

在这里插入图片描述

  • 执行任何一次请求, tt -t记录RequestMappingHandlerAdapter请求
    排查问题时经常需要测试同学的配合重新发起请求,arthas为减少这种麻烦,提供了tt命令支持重放请求
1
tt -t  org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod

在这里插入图片描述

  • 执行tt命令获取Spring Application Context
    执行tt命令的-i参数来指定index,并且用-w参数来执行ognl表达式来获取spring context

    1
    tt -i 1000 -w 'target.getApplicationContext()

    在这里插入图片描述

  • 从Spring context中获取任何Bean对象

    1
    tt -i 1000 -w 'target.getApplicationContext().getBean("authConfigServiceImpl").listByLocationCode("510000")'

    在这里插入图片描述

应用场景:

  • 生产环境的任务是定时触发的,发生了异常,比如1天触发一次,又没有界面重新实时触发任务,这时就可以通过arthas Spring context获取业务的Bean对象重新触发一次任务方法。

2、Arthas 利用 trace记录方法的调用链路,并输出方法路径上的每个节点上耗时

trace 能方便的帮助你定位和发现因 RT 高而导致的性能问题缺陷,trace 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销

1
2
3
4
trace com.alibaba.dubbo.rpc.Filter * '#cost > 1000' -n 1

-n 参数指定捕捉结果的次数
'#cost>100'表示当执行时间超过100ms的时候,才会输出trace的结果

3、Arthas 排查404问题

Java web中Servlet、Filter、Listener的优先级listener>filter>servlet
Listener是用于监听事件,Filter就是用来拦截进行一些日志类似aop的功能,而Servlet就是转发到别的页面。

1
trace javax.servlet.Filter * -n 1
  • 通过trace Servlet/Filter,可以快速定位Java Web问题
  • trace是了解应用执行流程的利器,只要trace到关键的接口或者类上
  • 仔细观察trace的结果,可以学习到Spring MVC是处理Web请求细节

4、如何在内部类对象中访问外部类对象的成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ServerImpl implements TimeSource {

private Set<HttpConnection> allConnections;

class ServerTimerTask extends TimerTask {
ServerTimerTask() {
}

public void run() {

// do something
}
}
}

想在内部类的run方法里面,访问allConnections这个变量的大小,应该如何写ognl表达式?

1
watch sun.net.httpserver.ServerImpl$ServerTimerTask1 run -f "target.this$0.allConnections.size()

微信公众号

愿你也能走出你的信息茧房
代码之外的骚技能

Blog

个人博客:http://www.geek-make.com