阿里云应用实时监控服务ARMS完全对接指南:从零接入到深度可观测
一、认识ARMS:云原生时代的应用可观测性平台
应用实时监控服务ARMS是阿里云推出的云原生可观测性平台,作为Application Performance Management解决方案,为分布式应用提供全方位的性能监控与诊断能力。ARMS应用监控能够在不改动业务代码的前提下,通过探针技术自动采集应用的各项运行指标,包括接口调用量、响应时间、错误数、JVM堆内存与GC状况、主机CPU与内存负载等核心数据。整个产品体系涵盖应用监控、前端监控、Prometheus托管服务、全链路压测以及告警管理等模块,真正实现对从浏览器到后端服务的全栈性能观测。
ARMS探针采用字节码增强技术,在Java虚拟机启动时动态织入监控逻辑,这一设计使得开发者无需修改任何业务代码即可获得完整的APM能力。探针能够自动识别和拦截常见的Web框架与RPC框架,包括Spring Boot、Tomcat、Dubbo、HSF等主流技术栈,并对发往数据库、消息队列和外部HTTP服务的调用进行自动埋点。在性能开销方面,ARMS探针经过大量生产环境验证,通过延迟加载、无损计算、调用链采样保护和内存水位控制等多项优化技术,将额外CPU与内存消耗控制在百分之五以内,确保监控体系不会对业务稳定性产生负面影响。
目前ARMS应用监控提供专业版服务,专业版在基础的可观测能力之上,进一步增加了SQL与NoSQL调用深度分析、线程剖析、Arthas在线诊断、自定义仪表盘以及更长的数据存储周期。时序指标数据可保存九十天,分布式调用链详情保留三十天,这一数据留存能力为故障回溯和性能趋势分析提供了充足的时间窗口。
需要先登录阿里云控制台,点击:阿里云控制台
二、应用接入全攻略:零代码侵入的探针部署
ARMS的接入设计充分考虑了不同部署环境和编程语言的差异性。无论是在阿里云ECS虚拟机、容器服务ACK集群、Serverless应用引擎SAE,还是非阿里云环境的本地IDC与其他公有云,只要网络可达即可完成接入。接入的核心是安装ARMS探针,探针会自动完成数据采集与上报,开发者只需关注监控数据的分析和应用。
Java应用的探针安装
Java应用是ARMS应用监控支持最成熟的语言生态。针对部署在阿里云ECS上的Java应用,ARMS控制台提供了白屏化的一键接入能力。登录ARMS控制台后,在应用监控的接入中心选择Java语言,系统会自动检测当前地域下的ECS实例及其运行的Java进程。运维人员只需填写应用名称并勾选目标实例,ARMS便会通过云助手自动下发探针并触发应用重启,整个过程无需修改任何启动脚本,探针的后续升级也由ARMS底座自动完成。对于使用Kubernetes部署的Java应用,无论是ACK容器服务还是自建K8s集群,都可以通过安装ack-onepilot组件实现探针的自动注入。在ACK集群中,应用监控组件以DaemonSet形式运行,当新的Pod启动时,组件会自动将ARMS探针挂载到Java应用的JVM参数中。
对于无法使用自动化安装的特殊场景,ARMS也支持完全手动配置Java探针。手动安装的核心是下载ARMS探针包并添加三个关键的JVM启动参数。以下是一个标准的Java应用启动脚本示例,展示如何通过bash数组优雅地管理探针参数:
#!/bin/bash
set -eo pipefail
# 设置ARMS应用名称
appName=\"${ARMS_APP_NAME:-MyJavaApplication}\"
echo \"appName: ${appName}\"
# 使用数组存储Java启动参数
java_opts=()
# 添加ARMS探针参数
if [[ -n \"${ARMS_LICENSE_KEY}\" ]]; then
echo \"ARMS_LICENSE_KEY is set, enabling ARMS agent.\"
java_opts+=(\"-javaagent:/opt/aliyun-java-agent/aliyun-java-agent.jar\")
java_opts+=(\"-Darms.licenseKey=${ARMS_LICENSE_KEY}\")
java_opts+=(\"-Darms.appName=${appName}\")
else
echo \"Warning: ARMS_LICENSE_KEY not set. ARMS agent will not be enabled.\"
fi
# 添加应用运行参数
java_opts+=(\"-Dserver.port=8080\")
# 启动应用
exec java \"${java_opts[@]}\" -jar /app/application.jar
上述脚本需要预先设置ARMS_APP_NAME和ARMS_LICENSE_KEY两个环境变量,ARMS_LICENSE_KEY是应用接入凭证,可以在ARMS控制台的接入向导中获取。对于Docker容器化部署的场景,建议将探针复制和参数配置固化到Dockerfile中,实现构建即就绪的效果。
Go应用的探针安装
Go语言由于编译为静态二进制文件的特性,其探针接入方式与Java有所不同。ARMS为Go应用提供了编译时注入的方案,开发者需要使用ARMS提供的instgo工具链替换标准的go build命令。在应用编译阶段,instgo工具会在生成的二进制文件中植入监控代码,运行时即可自动采集调用链、数据库访问和HTTP调用等指标。这种方式要求应用通过镜像方式部署,编译环境需要能够访问公网或阿里云内网以下载instgo工具。
以下是在Dockerfile中使用instgo构建Go应用的示例:
# 下载instgo编译工具
RUN wget \"http://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/instgo/instgo-linux-amd64\" -O instgo
RUN chmod +x instgo
# 使用instgo替换go build进行编译
RUN ./instgo build --licenseKey=\"your_license_key\" --cacheDir=./ -o /app/myapp
instgo工具支持多种编译选项,其中licenseKey参数为必传项,如果需要在开发环境中测试编译效果而不实际上报数据,可以添加--dev标志开启开发模式。对于已经投入生产的Go应用,采用instgo重新构建镜像后重新部署,即可完成ARMS监控能力的接入,原有业务代码无需任何改动。
Python应用的监控集成
Python应用的监控接入主要依靠ARMS自研的Python探针。探针以Python包的形式提供,通过pip安装后,在应用入口处添加几行初始化代码即可完成接入。与Java探针的完全自动埋点不同,Python探针需要开发者明确启用中间件插件,但整体接入成本依然很低。Python探针支持Flask、Django等主流Web框架,以及Redis、MySQL、PostgreSQL等常用数据存储组件的自动埋点。接入后,ARMS控制台会展示Python应用的接口调用性能、数据库访问耗时和异常分布等监控数据。
除了自研探针,ARMS还提供了托管版OpenTelemetry服务,支持Java、Go、Python、Node.js、.NET、C++等十余种语言通过OpenTelemetry、Jaeger、Zipkin或SkyWalking标准协议上报链路数据。这种方式更适合已经采用开源可观测性方案的企业,可以平滑迁移到阿里云托管环境,同时保持客户端SDK的自主可控。
三、核心监控功能与可观测性实践
完成探针接入后,ARMS控制台便会持续展示应用的各种性能指标。以下从应用总览、接口调用、数据库调用、拓扑分析和调用链查询五个维度,详细解析ARMS的核心监控能力。
应用总览仪表盘
应用总览页面是查看应用整体健康状况的入口。页面顶部展示选定时间范围内的总请求量、平均响应时间、错误数、活跃实例数等关键指标的时序曲线,并提供与上周、上一日的同比升降幅度,帮助运维人员快速感知性能变化趋势。应用相关事件区域汇总了死锁、内存溢出、应用启动等系统事件以及用户自定义的告警事件,将鼠标悬浮于柱状图上即可查看对应时间点的事件详情。系统信息部分实时呈现主机级别的CPU使用率、内存占用和系统负载,为资源层面的性能瓶颈分析提供依据。
接口调用详情分析
接口调用功能用于监控应用对外提供的每一个API接口的调用情况。ARMS能够自动发现基于Spring Boot、Dubbo、HSF等框架定义的接口,并展示每个接口的请求数、平均响应时间、最大响应时间、错误数以及HTTP状态码分布。在接口概览页签下,可以直观地看到哪些接口响应缓慢或错误率偏高。SQL和NoSQL调用分析页签进一步深入到接口内部的数据库操作层面,展示该接口执行过的每一条SQL语句的调用次数、平均耗时和最大耗时。当定位到某条SQL语句性能不佳时,可以单击调用链查询按钮,查看该SQL语句从应用层到数据库层的完整执行链路,包括调用参数、数据库连接信息和执行计划等上下文。
数据库调用性能分析
数据库调用页面集中展示应用对所有下游数据库的访问情况。页面以拓扑图形式呈现应用与数据库实例之间的调用关系,并分别列出每个数据库的请求数、响应时间和错误率。SQL分析页签是整个慢SQL优化的核心入口,以列表形式展示被监控应用执行的所有SQL语句,按照调用次数或平均耗时排序,慢查询会被自动标记并排在顶部。对于每一条SQL,都可以查看其调用量柱状图和响应时间时序曲线,分析慢查询是持续存在还是偶发性突增。调用来源页签则回答是谁调用了这条慢SQL,展示上游服务的名称和调用接口,为责任归属和优化决策提供信息。在实际生产环境中,结合数据库调用分析与接口调用分析,能够以调用链为线索完成从前端请求到数据库执行的全链路性能归因。
应用拓扑自动发现
应用拓扑图是ARMS最具可视化价值的功能之一。基于采集到的调用链数据,ARMS自动绘制出应用内部服务之间以及应用与外部依赖之间的完整调用关系图。拓扑图中每个节点代表一个应用或一个外部依赖,节点之间的连线表示调用关系,连线的粗细和颜色分别反映调用量和响应时延。通过拓扑图,架构师可以一目了然地看清微服务体系中的服务依赖链,快速识别出哪些服务处在关键路径上,哪些服务存在循环依赖或冗余调用。当某个节点变成红色或出现高延迟连线时,问题定位的范围就被迅速收敛到该节点及其相邻调用上,极大提升了故障排查效率。
调用链查询与明细诊断
调用链查询提供了深入每一次请求细节的诊断能力。对于任意一次请求,ARMS会生成一条完整的调用链,记录该请求经过的所有服务、方法、数据库操作以及每个环节的耗时。调用链列表页支持按照应用名称、接口名称、响应时间、错误状态等多个维度进行筛选。调用链详情页以瀑布图形式展示每个Span的耗时分布,颜色区分不同的调用类型。单击任意Span可以展开该节点的详细属性,包括请求参数、响应内容、异常堆栈以及关联的业务日志。对于复杂分布式系统中的偶发性故障,调用链分析往往是找到根本原因的最有力武器。ARMS的错慢Trace分析功能进一步将调用链查询与聚合分析相结合,可以快速统计出在特定时间段内错误率最高或响应最慢的接口和组件,让运维人员从海量调用数据中迅速锁定问题靶点。
四、告警体系搭建与故障快速响应
监控的生命力在于告警。ARMS应用监控支持对采集到的各种应用指标配置灵活的告警规则,并在触发条件时通过短信、邮件、钉钉群、企业微信等多种渠道发送通知。创建告警规则的过程分为三个步骤:选择监控指标、设定触发条件、配置通知策略。
指标选择涵盖了应用维度的总请求量、平均响应时间、错误率,接口维度的单接口响应时间和成功率,JVM维度的堆内存使用率和GC频率,以及主机维度的CPU和内存使用率等。对于核心业务接口,通常建议配置平均响应时间和错误率两条告警规则。例如,设置当某接口最近三分钟的平均响应时间持续高于五百毫秒时触发告警,并设置当错误率连续两分钟超过百分之十时触发告警。为了避免瞬时波动导致的告警轰炸,ARMS支持设置持续周期和静默周期,只有持续满足条件一定时长后才真正发送通知,同时相同的告警事件在静默期内不会重复推送。
以下通过一个实际示例说明告警规则的配置流程。假设有一个名为user-service的核心Java应用部署在ACK集群中,需要对其接口可用性进行监控。在ARMS控制台的告警规则页面,选择user-service作为监控应用,指标类型选择应用调用类型统计中的平均响应时间。告警条件设置为最近三分钟响应时间大于等于五百毫秒,持续周期为一分钟,严重程度设置为P1紧急。通知策略中配置联系人分组和多种通知渠道的组合,确保告警能够及时触达到响应人。保存规则后,当user-service在任意连续一分钟内的平均响应时间超过五百毫秒时,ARMS便会按照预设渠道发送告警。
告警管理模块还提供了告警事件的聚合、压缩和升级功能。当短时间内大量告警涌入时,ARMS可以按照应用、指标或告警内容进行智能合并,避免运维人员的通信工具被告警淹没。如果初级告警在一定时间内未得到确认或处理,告警可以自动升级并通知更高层级的负责人,形成完整的运维响应闭环。
五、实战案例:Spring Boot应用端到端对接
本章节以一个典型的Spring Boot应用为例,演示从零开始完成ARMS接入并验证监控效果的全过程。
首先在阿里云控制台开通ARMS服务,确认应用监控模块已激活。然后准备一个简单的Spring Boot Web应用,定义一个REST接口模拟业务逻辑和数据库查询。在Maven项目的pom.xml中引入Spring Boot Starter Web依赖,编写一个Controller类包含一个GET方法和一个POST方法,其中GET方法内部调用一个耗时模拟的Service方法。
接下来部署应用并安装ARMS探针。假设应用部署在一台阿里云ECS实例上,操作系统为CentOS 7。登录ECS后,将ARMS探针包下载到服务器的指定目录。解压探针包后,在应用启动脚本中添加JVM参数:-javaagent指定探针jar包的路径,-Darms.appName设置为spring-boot-demo,-Darms.licenseKey填写从ARMS控制台获取的接入凭证。启动脚本如下所示:
java -javaagent:/opt/aliyun-java-agent/aliyun-java-agent.jar \
-Darms.appName=spring-boot-demo \
-Darms.licenseKey=your_license_key_here \
-jar /app/spring-boot-demo.jar
应用启动后,使用压测工具或手动方式访问应用的接口,产生真实的调用流量。登录ARMS控制台,在应用列表中找到spring-boot-demo应用,单击进入应用详情。此时应用总览页面应该开始展示请求量和响应时间的实时曲线。如果数据正常上报,说明探针安装成功。在接口调用页面可以看到刚刚访问过的GET和POST接口的统计信息,包括调用次数、平均耗时和错误数。如果Service方法中包含了数据库查询操作,在数据库调用页面会展示每条SQL的执行情况。继续使用压测工具加大流量,观察应用总览页面中请求量的增长趋势和响应时间的变化,验证ARMS在高负载场景下的数据采集稳定性。
最后为这个demo应用配置一条告警规则。选择平均响应时间作为监控指标,设置当最近两分钟响应时间超过两秒时通过钉钉机器人发送告警。通过上述步骤,一个完整的Spring Boot应用就成功接入了ARMS,具备了生产级可观测能力。
六、高频问答
问1:ARMS探针对应用性能的影响有多大?
答:ARMS探针经过多年大规模生产环境打磨,通过延迟加载、采样保护和内存复用等优化技术,通常将额外CPU开销控制在百分之三以内,内存占用控制在两百兆以内。不过在应用刚启动的预热阶段或开启全量调用链采集时,开销会略有上升。对于绝大多数在线业务系统,这一性能影响完全在可接受范围内。
问2:非阿里云环境的应用能否接入ARMS?
答:可以。只要应用所在服务器能够通过公网访问阿里云ARMS的数据接入端点,无论是本地IDC还是其他公有云上的应用,都可以完成探针安装和数据上报。对于网络质量要求较高的场景,可以通过云企业网或专线方式打通阿里云VPC与本地网络,走内网上报以降低延迟并节省流量费用。
问3:ARMS是否支持Python和Node.js应用的无侵入监控?
答:ARMS对Python提供了自研探针,通过pip安装和少量初始化代码即可实现框架级别的自动埋点。Node.js目前不支持无侵入的零代码接入方式,需要通过OpenTelemetry SDK手动埋点或对接开源可观测方案后将数据上报到ARMS的OpenTelemetry托管服务。
问4:调用链数据可以保存多长时间?
答:ARMS应用监控专业版配置的时序指标数据留存期为九十天,详细的分布式调用链数据留存期为三十天。这一时长覆盖了从故障回溯、月度性能分析到季度趋势评估的绝大多数业务场景。如需更长保存周期,可以将调用链数据导出到阿里云日志服务SLS进行归档。
问5:能否将现有Jaeger或Zipkin系统的数据迁移到ARMS?
答:可以。ARMS的托管版OpenTelemetry服务完全兼容Jaeger、Zipkin和SkyWalking协议的接入方式。您只需修改客户端的上报端点地址为ARMS提供的接入点,无需改动数据模型和采集代码,即可实现平滑迁移并享受阿里云的托管运维能力。
问6:ARMS探针支持哪些Java框架和中间件版本?
答:ARMS支持的Java组件体系非常广泛,涵盖了Tomcat从7.0到10.x、Jetty 8及以上、Spring Boot 1.3至3.x、Dubbo 2.5及以上版本、HSF 2.0及以上、HttpClient 3和4版本,以及MySQL、Oracle、PostgreSQL、Redis、MongoDB等主流数据存储驱动。完整列表以ARMS官方帮助文档中的组件兼容性说明为准。



