容器部署的问题排查

问题背景

虽说有日志记录可以排查程序的运行问题,然而日志服务也有失效的时候。

当开发专注于代码,发现 UAT 环境 功能异常,第一反应是查日志。

UAT 环境和其他环境不同,日志服务起不来。负责运维的同事不熟悉,无法及时恢复服务。

于是只能直接进入容器,查看 Java 进程分析。

容器的环境是 RedHat,无法连接外网,无法使用 yum install

上传并启动 Arthas

ArthasAlibaba 开源的 Java 诊断工具。

Arthas 的特性如下:

  • Dashboard:实时查看系统的运行状况

  • 查看入参/返回值/异常:查看函数调用的参数,返回值和异常

  • 在线热更新:jad/sc/redefine 一条龙热更新代码

  • 类冲突:秒解类冲突问题,定位类加载路径

  • 性能热点:快速定位应用的热点,生成火焰图

  • WebConsole:在线诊断,点开网页诊断线上应用

在自己的主机下载 arthas-bin.zip ,文件是 zip 格式的。解压然后压缩为 tar 格式的压缩包。

在 web 界面上传 tar 包到指定目录,比如 /arthas

cd /arthas && tar -xvf arthas-packaging-3.5.2-bin.tar 解压缩

容器环境没有配置 java 的环境变量。

/jdk/bin/jps 查看当前有哪些 Java 进程。可以看到显示 1 JettyServer 进程号为1

执行 /jdk/bin/java -jar /arthas/arthas-boot.jar 1 ,进入 arthas

Arthas 中操作

sysprop

查看当前 JVM 的系统属性(System Property)

watch

方法执行数据观测

watch kd.bos.service.web.filter.KDCommonFilter build "{params,returnObj}" -x 2 -b

watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象

参数名称

参数说明

class-pattern

类名表达式匹配

method-pattern

方法名表达式匹配

express

观察表达式

condition-express

条件表达式

[b]

方法调用之前观察

[e]

方法异常之后观察

[s]

方法返回之后观察

[f]

方法结束之后(正常返回和异常返回)观察

[E]

开启正则表达式匹配,默认为通配符匹配

[x:]

指定输出结果的属性遍历深度,默认为 1

这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。

下图是执行数据观测的效果,用户访问的网址 uri 可以被监测。

Last updated