使用ARMS探针自动采集Crash日志

应用在日常运行过程中,可能会因为各种内外部的原因出现Crash,在K8s场景下,由于健康检查机制,应用在Crash后可能会重启,导致Crash现场丢失。ARMS设计了一种覆盖K8sECS场景的自动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重启而丢失相关信息。

image.png

查看Crash日志

  1. 登录ARMS控制台,在左侧导航栏选择应用监控 > 应用列表

  2. 在页面顶部选择目标地域,然后确认所使用的ARMS控制台为新版本后,在应用列表单击目标应用。

  3. 单击事件分析,在搜索框中将事件名称条件设置为Application Crash,筛选出该应用所有的Crash记录信息。每次Crash对应一条事件,在事件右侧操作列可以下载对应Crash日志。

    image.png

  4. 除了查看Crash事件和日志外,您还可以参考通知策略配置告警通知,以便及时感知应用Crash情况。