应用在日常运行过程中,可能会因为各种内外部的原因出现Crash,在K8s场景下,由于健康检查机制,应用在Crash后可能会重启,导致Crash现场丢失。ARMS设计了一种覆盖K8s和ECS场景的自动Crash日志采集功能,可以帮助应用在Crash后自动采集Crash日志,避免因为现场丢失导致问题难以排查和定位。
使用限制
K8s环境接入的Java应用,需确保所安装的ack-onepilot版本大于等于3.2.3版本,版本升级操作请参见升级ARMS探针。
ECS环境接入的Java应用,需要在应用的JVM参数中新增如下参数。
请将
{user.workspace}
换成环境实际的路径。-XX:ErrorFile=/{user.workspace}/AliyunJavaAgent/hs_err_pid%p.log -XX:OnError=/{user.workspace}/AliyunJavaAgent/crash_log_collector.sh
需确保所使用的ARMS Java Agent大于等于4.2.1版本,且业务进程有AliyunJavaAgent目录写权限,版本升级操作请参见升级ARMS探针。
需确保接入ARMS所需的相关网络端口开放状态和域名解析都满足条件,具体细节请参见Java应用监控网络配置。
自动采集Crash日志
示例:模拟一个快速消耗Java堆内存,应用OOM触发Crash的场景。
@RestController
class DemoController {
@GetMapping("/simulateCrash")
public void simulateCrash() {
List<String> list = new ArrayList();
while (true) {
list.add("Simulate a crash!");
}
}
}
确认在满足Crash日志自动采集所需使用限制的基础上,为应用配置如下JVM参数,以便应用OOM触发Crash:
-Xms512m
-Xmx512m
-XX:+CrashOnOutOfMemoryError
一切就绪后,请求应用接口,应用出现Crash并产生如下图所示提示信息,表示自动完成Crash日志采集。
以下为ECS场景演示截图,K8s环境可能会因为应用Pod重启而丢失相关信息。
查看Crash日志
该文章对您有帮助吗?