接口异常排查: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) 方法进行转换,成功解决了问题。

三、复盘总结

(一)排查思路

  1. 验证问题是否稳定复现 :请求测试同事协助,获取到接口 URL 以及参数,确保问题可以稳定复现,为后续排查提供可靠的基础。
  2. 获取运行信息 :通过 Arthas 工具,监控获取运行栈信息,了解接口在运行过程中的具体情况,为定位问题提供关键线索。
  3. 定位问题代码 :结合业务逻辑,仔细分析代码,判定问题所在。在这个过程中,需要对业务逻辑有深入的理解,才能准确找到问题的根源。

(二)优化思路

在确定前端传入参数无误的情况下,可以直接使用 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-patternmethod-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

其中,watch 命令常用于观测异常方法的调用情况,打印详细的参数和异常信息;trace 命令常用于追踪关键方法的调用路径,找出性能瓶颈,进行相应优化。

(三)管理命令

管理命令主要用于执行 OGNL 表达式和查找类,包括:

  • ognl :执行 OGNL 表达式,方便在运行时获取和修改对象的属性和方法。
  • sc :查看 JVM 已加载的类信息,包括类的加载器、类的字节码信息等。

五、arthas-idea 插件介绍

Arthas-IDEA 是一款可视化生成 Arthas 命令的插件,能通过选定代码,右键快速生成相关 Arthas 命令,极大地提高了使用 Arthas 工具的效率。【插件文档地址】。

六、用户案例集推荐

用户案例集是一个汇聚了众多用户使用 Arthas 工具解决实际问题的案例集合,对于学习和借鉴 Arthas 工具的使用方法具有很高的价值。【用户案例集地址】。

通过这次接口异常排查实战,我深刻体会到了 Arthas 工具的强大功能和实用性。在面对复杂的系统问题时,选择合适的工具并掌握其使用方法,能够大大提高问题的排查和解决效率。希望本文的分享能够对大家有所帮助,在今后的开发工作中,遇到类似问题时,能够更加从容地应对。