阿里云Arthas使用——在日志没有输出异常情况下,如何进行线上bug定位 & stack命令 和 trace命令

前言

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

本篇博客介绍如何在日志没有输出异常情况下,如何进行线上bug定位,使用到了stack命令 和 trace命令。

其他的Arthas博客文章如下:

目录

引出


1.JVM调优的工具阿里云的Arthas的使用,安装和使用;

2.watch命令查看调用方法的输出参数;

3.stack定位方法调用堆栈;

4.trace命名分析调用路径;

使用arthas进行线上bug定位

前端访问链接报错

定位到调用的controller

java 复制代码
com.wattsonic.iot.gateway.controller.TestController#getLatestReportData

stack命令

输出当前方法被调用的调用路径,很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。

java 复制代码
stack com.wattsonic.iot.gateway.controller.TestController getLatestReportData 

trace命令

trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

未报异常

java 复制代码
trace org.springframework.web.method.support.InvocableHandlerMethod doInvoke

定位到异常

java 复制代码
trace org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter handle
java 复制代码
`---ts=2023-12-05 10:16:26;thread_name=http-nio-8082-exec-4;id=4e;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@5f45bc8e
    `---[1.108864ms] org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter:handle() [throws Exception]
        +---[80.80% 0.895941ms ] org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter:handleInternal() #87 [throws Exception]
        `---throw:org.springframework.http.converter.HttpMessageConversionException #462 [Type definition error: [simple type, class com.google.protobuf.UnknownFieldSet$Parser]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.google.protobuf.UnknownFieldSet$Parser and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.concurrent.ConcurrentHashMap["S231027J0043"]->com.wattsonic.iot.gateway.bolt.protocol.beta.Level2["unknownFields"]->com.google.protobuf.UnknownFieldSet["parserForType"])]

进一步分析

这里定位trace哪个类的时候,本质是用到了SpringMVC 的运行流程:从客户端发送请求request到springMvc框架返回响应response的全流程,理解其流程。

SpringMVC 的运行流程

相关博客文章如下:

SpringMvc框架------【深入】SpringMVC 的运行流程:从客户端发送请求request到springMvc框架返回响应response的全流程分析 & DispatcherServlet

(1)整个过程开始于客户端发出的一个HTTP请求,Web应用服务器接收到这个请求。如果匹配DispatcherServlet的请求映射路径,则Web容器将该请求转交给DispatcherServlet处理;

(2)DispatcherServlet的作用是将请求分发到不同的处理器:DispatcherServlet接收到这个请求后,根据请求的信息(包括URL、HTTP方法、请求报文头、请求参数、Cookies等)及HandlerMapping的配置找到处理该请求的处理器(Handler);

(3)可将HandlerMapping看做路由控制器,将Handler看做目标主机;值得注意的是,在Spring MVC中并没有定义一个Handler接口,实际上任何一个Object都可以成为请求处理器(任何一个对象都可以作为请求的Handler);

(4)当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter对Handleri进行封装,再以统一的适配器接口调用Handler;HandlerAdapter是Spring MVC框架级接口,顾名思义,HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用;

(5)处理器Handler完成业务逻辑的处理后,将返回一个ModelAndView给DispatcherServlet,其中ModelAndView包含了视图逻辑名和模型数据信息,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息;

(6)ModelAndView中包含的是"逻辑视图名"而非真正的视图对象,DispatcherServlet借由视图解析器ViewResolver完成逻辑视图名到真实视图对象的解析工作;

(7)当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染;

(8)客户端得到响应,可能是一个普通的HTML页面,也可以是XML或JSON字符串,还可以是一张图片或者一个PDF文件;


总结

1.JVM调优的工具阿里云的Arthas的使用,安装和使用;

2.watch命令查看调用方法的输出参数;

3.stack定位方法调用堆栈;

4.trace命名分析调用路径;

相关推荐
正在走向自律7 小时前
Agent 案例分析:金融场景中的智能体-蚂蚁金服案例(10/30)
阿里云·金融·ai agent·金融场景中的智能体
团儿.8 小时前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul
马剑威(威哥爱编程)13 小时前
分布式Python计算服务MaxFrame使用心得
开发语言·分布式·python·阿里云
DashVector18 小时前
如何通过HTTP API检索Doc
数据库·人工智能·http·阿里云·数据库开发·向量检索
@泽栖18 小时前
阿里云-将旧服务器数据与配置完全迁移至新服务器
服务器·阿里云
m0_7482398318 小时前
前端bug调试
前端·bug
xcLeigh19 小时前
网络安全 | 云计算中的数据加密与访问控制
安全·web安全·云计算
QQ_77813297419 小时前
基于云计算的资源管理系统
人工智能·云计算
云计算DevOps-韩老师19 小时前
【网络云计算】2024第52周-每日【2024/12/25】小测-理论&实操-自己构造场景,写5个系统管理的脚本-解析
开发语言·网络·云计算·bash·perl
阿隆ALong1 天前
云手机+YouTube:改变通信世界的划时代技术
智能手机·矩阵·云计算·arm