接口异常排查:Arthas 工具实战分享
一、问题背景
在项目开发过程中,接口异常时有发生。此次问题的特殊性在于,系统进行了统一异常处理,不会返回具体的异常日志,这给问题的定位带来了极大的挑战。同时,由于系统运行在 K8S 中,客户使用频繁,定时任务较多,日志刷新速度极快,进一步增加了排查问题的难度。如果不能及时解决这个问题,将会影响正常的发版进度,给项目带来不小的损失。
二、排查过程
Arthas 是一款由阿里巴巴开源的 Java 诊断工具,能够实时监控、诊断 Java 应用程序的状态,帮助开发人员深入分析 JVM 运行时的问题。它可以在不修改代码、不重启应用的情况下,动态地查看、分析、排查和诊断生产环境中的 Java 应用问题。
(一)安装与启动 Arthas
首先,我选择了 Arthas 这款强大的诊断工具来帮助排查问题。通过以下命令下载并启动 Arthas:
// 下载 Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
// 启动 Arthas
java -jar arthas-boot.jar
(二)定位接口,查看入参与出参
连接上应用后,我使用 watch
命令对指定的接口进行监控,查看其入参和出参情况。具体命令如下:
watch com.*.*Controller s*eport '{params,returnObj,throwExp}' -n 5 -x 3
经过观察,我发现接口的入参是正常的,但返回值却不正常。这表明问题可能出在接口的处理逻辑中。
(三)查看关键方法执行栈信息
为了进一步定位问题,我结合代码,使用 trace
命令查看关键方法的执行栈信息。命令如下:
trace com.*.*ServiceImpl p**ing -n 5 --skipJDKMethod false
通过查看执行栈信息,我发现了一个类型转换异常,具体是字符串转整型时出现了异常。从前端传入的值为 0.2
,而代码中使用 Integer.parseInt(quantity)
进行转换,这显然是行不通的。
(四)结合业务逻辑修复代码
经过分析,我了解到原本该功能是支持 Float
类型的,但由于是给客户定制的需求,客户接收的是整型。因此,我将代码改为使用 Hutool 工具类的 NumberUtil.parseInt(quantity)
方法进行转换,成功解决了问题。
三、复盘总结
(一)排查思路
- 验证问题是否稳定复现 :请求测试同事协助,获取到接口 URL 以及参数,确保问题可以稳定复现,为后续排查提供可靠的基础。
- 获取运行信息 :通过 Arthas 工具,监控获取运行栈信息,了解接口在运行过程中的具体情况,为定位问题提供关键线索。
- 定位问题代码 :结合业务逻辑,仔细分析代码,判定问题所在。在这个过程中,需要对业务逻辑有深入的理解,才能准确找到问题的根源。
(二)优化思路
在确定前端传入参数无误的情况下,可以直接使用 trace
命令获取运行栈信息,无需先通过 watch
命令查看入参和出参。这样可以节省时间,提高排查问题的效率。
四、Arthas 常用命令拓展
(一)核心命令
核心命令主要用于查看 JVM 和线程的状态,包括:
jvm
:查看当前 JVM 的基本信息,如 JVM 版本、启动时间等。memory
:查看 JVM 内存使用情况,包括堆内存和非堆内存的使用情况。sysprop
:查看和修改 JVM 系统属性,方便在运行时调整系统参数。sysenv
:查看 JVM 环境变量,了解系统的运行环境。vmoption
:查看和修改 JVM 诊断相关的选项,如垃圾回收策略等。heapdump
:生成 Java 堆转储文件,类似于jmap
的功能,用于分析内存问题。thread
:查询线程信息,包括线程的状态、堆栈信息等。jad
:反编译 Java 类,方便查看类的字节码信息。
(二)诊断命令
诊断命令主要用于对方法进行观测和追踪,包括:
watch
:方便地观察指定函数的调用情况,能观察到返回值、抛出异常、入参等信息,通过编写 OGNL 表达式进行对应变量的查看。tt
:方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。trace
:主动搜索class-pattern
/method-pattern
对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
其中,watch
命令常用于观测异常方法的调用情况,打印详细的参数和异常信息;trace
命令常用于追踪关键方法的调用路径,找出性能瓶颈,进行相应优化。
(三)管理命令
管理命令主要用于执行 OGNL 表达式和查找类,包括:
ognl
:执行 OGNL 表达式,方便在运行时获取和修改对象的属性和方法。sc
:查看 JVM 已加载的类信息,包括类的加载器、类的字节码信息等。
五、arthas-idea 插件介绍
Arthas-IDEA 是一款可视化生成 Arthas 命令的插件,能通过选定代码,右键快速生成相关 Arthas 命令,极大地提高了使用 Arthas 工具的效率。【插件文档地址】。
六、用户案例集推荐
用户案例集是一个汇聚了众多用户使用 Arthas 工具解决实际问题的案例集合,对于学习和借鉴 Arthas 工具的使用方法具有很高的价值。【用户案例集地址】。
通过这次接口异常排查实战,我深刻体会到了 Arthas 工具的强大功能和实用性。在面对复杂的系统问题时,选择合适的工具并掌握其使用方法,能够大大提高问题的排查和解决效率。希望本文的分享能够对大家有所帮助,在今后的开发工作中,遇到类似问题时,能够更加从容地应对。
评论