阿里云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命名分析调用路径;

相关推荐
花千烬14 小时前
crictl info 连不上 containerd 怎么办?endpoint、socket 与权限一次查清
云计算
AKAMAI3 天前
每百万 Token 成本砍六成,出海 AI 团队开始重算推理这笔账
人工智能·云计算
Inhand陈工16 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Database_Cool_16 天前
什么是数据仓库物化视图?AnalyticDB MySQL 实时物化视图能力解析
人工智能·mysql·阿里云
Database_Cool_16 天前
大规模数据分析降本指南:AnalyticDB Serverless 弹性架构实战
数据仓库·阿里云·架构·数据分析·serverless
tiancaijiben16 天前
阿里云Kubernetes集群托管完全指南:从创建到生产级运维
云计算
我是小bā吖17 天前
Claude Code 模型接入阿里云 AI 网关并统计不同使用者的模型用量
网络·人工智能·阿里云
翼龙云_cloud17 天前
阿里云国际代理商:如何使用RDS MySQL 构建网站数据库?
数据库·mysql·阿里云
互联网推荐官17 天前
上海软件定制开发公司推荐:从PaaS工程化路径看D-coding的技术取舍
云原生·云计算·paas·软件开发·开发经验·上海
sbjdhjd17 天前
从零搭建企业级 CI/CD(下):Jenkins+GitLab+Harbor 全链路实战指南
git·servlet·ci/cd·云原生·云计算·gitlab·jenkins