ARMS 系统监控
一、什么是 ARMS?
ARMS 是阿里云提供的应用实时监控服务,采用了探针技术,能够在不修改应用代码的情况下,自动收集和分析应用性能数据,快速构建实时的监控能力。
针对之前提到的 “怎么实现可观测性” 的 4 个核心问题么?ARMS 给出了这样的答案:
1)统计什么?
ARMS 能够监控 Java 应用性能(CPU、内存、线程、GC 等)、应用调用链追踪、异常分析诊断、请求数、错误数、平均耗时、连接池/线程池监控等全方位指标。
2)如何收集?
通过 Java Agent 技术,在 JVM 启动时加载监控代理,实现无侵入式的数据收集。
3)如何存储?
数据存储在阿里云的分布式存储系统中,用户无需关心存储细节。
4)如何展示?
ARMS 提供了丰富的 Web 控制台,支持多维度的数据分析和可视化展示。
二、接入 ARMS
在使用任何云产品之前,我们都需要先了解其 计费规则,保护好自己的 money。
好在 ARMS 提供的免费资源,一般足够个人测试使用:

下面来接入 ARMS,首先访问 ARMS 控制台,第一次使用需要开通服务。
进入接入中心,选择 Java 应用监控:

选择手动安装 Agent:

按照指引下载 Agent 包:

从这里下载:
下载完成后解压到合适的位置,比如我这里的解压路径是 D:/SoftWare/AliyunJavaAgent/aliyun-java-agent.jar。

复制启动命令,注意替换目录路径和应用名称。应用名称可以自定义,建议使用有意义的名称便于后续管理。
你也可以选择开启应用安全功能,它能够提供 应用层面的安全监控能力,帮你抵御一些漏洞攻击。

在 IDE 中编辑项目的启动配置,将复制的命令参数添加到 VM options 中:
-javaagent:D:/SoftWare/AliyunJavaAgent/aliyun-java-agent.jar
-Darms.licenseKey=xxx
-Darms.appName=xxl-arms⚠️ 注意,需要将参数间的换行替换为空格!

接下来启动项目。启动会比平时慢一些,这是正常的,因为引入 Agent 会拖慢启动速度。
看到下图信息就表示启动成功了,默认数据会上报到杭州区域:

最后,回到 ARMS 控制台的应用列表页面,就能看到刚刚接入的应用了:

三、指标监控
下面我们来看看 ARMS 都提供了哪些指标的监控,有个印象就好。
3.1.应用概览
点击进入应用详情页,首先看到的是应用概览 Tab。建议切换到新版视图,豁然开朗。

在这个页面可以看到应用的核心性能指标,包括请求数、响应时间、错误数等关键数据。
3.2.应用拓扑
应用拓扑页面展示了项目的依赖关系图,可以清晰地看到应用和各种中间件的连接情况:

这个视图对于理解系统架构和排查依赖问题有用。
3.3.提供服务
提供服务页面能够统一展示所有接口的调用情况,包括请求量、错误数、平均耗时等核心指标:

点击具体接口还可以深入分析该接口的详细数据(这就是所谓的 “下钻分析”):

ARMS 还提供了 SQL 调用分析功能,能够监控数据库操作的性能:

以及 NoSQL(如 Redis)的调用分析:

还提供了异常分析功能,可以帮助快速定位和解决应用中的异常问题:

3.4.调用链分析
调用链分析是 ARMS 的核心功能之一,可以深度分析单次请求的完整调用路径,快速定位瓶颈点:

点击具体的调用记录,在 Trace 详情页面可以看到请求经过的每个环节和对应的耗时,右侧还能显示当时的 JVM 状态:

在全链路聚合页面可以清晰地看到树形的调用结构:

点击分析后,会根据特定的 serviceName 和 span 进行过滤分析:

其中,错误 / 慢 Trace 分析功能特别实用,能够一秒定位到性能瓶颈:

3.5.依赖服务
依赖服务页面专门监控应用对外部服务的调用情况,比如数据库、缓存等:

可以深入到具体依赖的详情页面,比如数据库详情:

这里能够看到执行的具体 SQL 语句和慢 SQL,一目了然!

还能分析哪些请求对数据库的消耗最大:

3.6.实例监控
实例监控页面展示服务器本身的运行状态:

可以深入查看某个实例的详细信息:

JVM 监控提供了堆内存、垃圾回收等关键指标:

线程池监控帮助了解线程的使用情况:

甚至还有连接池监控,比如数据库连接池、Redis 连接池:

机器负载监控显示了系统层面的资源使用情况,比如 CPU、内存利用率,如果发现利用率较高,可能要考虑升配;较低则表示可能存在浪费。

3.7.场景化分析
ARMS 还提供了 5 大场景化分析功能:
- 异常分析
- 日志分析
- 数据库分析
- 调用链分布
- 上下游分析
异常分析比较实用,能够按照异常名称进行分类展示,可以快速查看某类异常的出现情况,以及查看异常堆栈信息,从而快速定位错误:

3.8.事件分析
事件分析页面用于管理各种告警事件:

3.9.应用配置
在应用配置页面可以设置数据采样率、自定义探针收集的指标:

还可以开启一些高级功能,比如 Arthas 监控、持续性能剖析等:

不过需要注意的是,收集的数据越多,费用也会相应增加,请按需开启。
3.10.应用诊断
开启相关配置后,可以使用应用诊断功能。
持续性能分析能够深入分析应用的性能瓶颈:

智能洞察功能提供自动化的问题发现能力:

线程分析帮助了解线程的执行状态:

Arthas 诊断功能集成了阿里巴巴开源的 Java 应用诊断工具 Arthas,能够在不修改代码、不重启应用的情况下,对运行中的 Java 应用进行实时诊断,包括查看类加载信息、方法执行情况、线程状态等。

可以分析线程耗时和查看实时堆栈:

通过查看实时堆栈,可以精确定位线程正在执行的任务。如果某个线程出现阻塞,也能清楚地看到阻塞发生的位置,在排查死锁时特别有用。
还可以直接连接到应用进行在线诊断:

💡 友情提示:测试完成后记得关闭不必要的监控功能,避免产生不必要的费用。
四、告警能力
监控和告警天生一对,通常是配套使用的,告警机制能够在问题发生时及时通知相关人员。
创建告警规则的流程很简单:

ARMS 支持阈值检测和区间检测两种模式。以监控慢 SQL 次数为例:

可以配置告警通知方式、时间段、重复策略等:

创建完成后,可以在告警规则列表中看到,并且支持测试功能:

还有一些常见的告警配置,比如应用响应时间超过阈值、错误率超过阈值、数据库连接数过高、JVM 内存使用率过高等。
💡 不过要注意合理配置告警,而且要配置分级告警,否则可能就会出现大家对告警已经麻了,有告警也不处理的情况。
五、扩展知识 - 探针技术
为什么 ARMS 只是在启动命令中加了几个参数,就能实现这么全面的监控功能?而且能够支持那么灵活的筛选?这背后的技术原理是什么?
答案就是探针技术
首先,数据是通过探针技术 Java Agent 收集的。Java Agent 是 JVM 提供的机制,允许在 Java 应用启动时或运行时动态修改字节码,从而实现无侵入式的监控。
利用探针进行监控的原理如下:
- 字节码增强:Java Agent 通过 Java Instrumentation API 在类加载时拦截字节码,动态插入监控代码。
- 方法织入:在关键方法(如 HTTP 请求处理、数据库调用等)的入口和出口处织入监控逻辑,记录执行时间、参数、返回值等信息。
- 数据收集:织入的监控代码会收集各种性能数据,并通过网络传输到监控平台。
- 链路追踪:通过在请求上下文中传递唯一标识,将分布式调用链串联起来,形成完整的 Trace。
这种方式的优势在于完全不需要修改业务代码,只需要在 JVM 启动时指定 Agent,就能获得全面的监控能力。

💡 学过后端架构的朋友应该会发现,探针技术和服务网格的 Sidecar 模式在核心理念上非常相似,都体现了 无侵入式增强 的设计思想。能够在不修改原有业务代码(或服务)的前提下,为应用添加监控、治理等横切关注点功能。

它们都采用了代理拦截的工作模式,探针通过字节码增强拦截方法调用、Sidecar 通过网络代理拦截服务通信,本质上都是在应用的执行路径上插入额外的处理逻辑。将业务逻辑和运维监控解耦,让开发者专注于业务开发。
六、扩展知识 - 数据的维度划分
监控平台之所以能提供如此灵活的筛选和分析能力,关键在于合理的数据维度设计。
以一个 HTTP 请求为例,监控系统会记录 最细粒度 的维度信息:
| 维度 | 示例值 | 说明 |
|---|---|---|
| 时间戳 | 2025-08-14 19:30:10 | 请求发生的精确时间 |
| 应用名 | xxl-arms | 应用标识 |
| 接口路径 | /api/arms-log | 具体的接口 |
| HTTP 方法 | POST | 请求方法 |
| 响应状态码 | 200 | 请求结果 |
| 响应时间 | 150ms | 接口耗时 |
| 客户端 IP | 127.0.0.1 | 请求来源 |
| 用户 ID | 12345 | 业务维度 |
基于这些最细粒度的数据,监控平台就可以进行各种维度的聚合分析,比如:
- 按时间聚合:统计每分钟/小时/天的请求量
- 按接口聚合:分析各接口的性能表现
- 按状态码聚合:计算成功率和错误率
- 按用户聚合:分析用户行为模式
