容器部署的问题排查
问题背景
虽说有日志记录可以排查程序的运行问题,然而日志服务也有失效的时候。
当开发专注于代码,发现 UAT
环境 功能异常,第一反应是查日志。
UAT
环境和其他环境不同,日志服务起不来。负责运维的同事不熟悉,无法及时恢复服务。
于是只能直接进入容器,查看 Java 进程分析。
容器的环境是 RedHat
,无法连接外网,无法使用 yum install
。
上传并启动 Arthas
Arthas
Arthas
是 Alibaba
开源的 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
中操作
Arthas
中操作sysprop
sysprop
查看当前
JVM
的系统属性(System Property
)
watch
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