监控工具之应用性能监控(APM)
一、应用性能监控(APM)概述
1.1 APM 的核心价值
应用性能监控(Application Performance Monitoring)是通过对应用程序的实时监测和分析,实现以下核心目标:
- 性能瓶颈定位:快速识别代码级、数据库级或网络级性能问题
- 用户体验保障:跟踪真实用户访问路径和响应时间
- 故障预警与诊断:在问题影响用户前发现并解决
- 资源优化:合理分配服务器资源,提高利用率
- 业务指标关联:将技术指标与业务 KPI 建立关联分析
1.2 APM 核心监控维度

1.3 主流 APM 工具对比
| 工具 | 类型 | 优势 | 劣势 | 适用场景 |
| New Relic | 商业 SaaS | 功能全面、UI 友好、支持多语言 | 成本高、数据存储在第三方 | 中大型企业、多语言环境 |
| Datadog | 商业 SaaS | 全栈监控集成、告警强大、扩展性好 | 学习曲线陡、价格昂贵 | 云原生环境、微服务架构 |
| SkyWalking | 开源 | 免费、可私有化部署、支持多语言 | 配置复杂、社区支持有限 | 预算有限团队、需数据本地化 |
| Dynatrace | 商业 | AI 驱动、自动发现拓扑、根因分析 | 成本极高、资源消耗大 | 大型企业、复杂 IT 环境 |
| Elastic APM | 开源 + 商业 | 与 ELK 生态集成、灵活度高 | 需自行维护、功能较基础 | 已有 ELK 栈的团队 |
二、New Relic 部署与配置
2.1 New Relic 概述
New Relic 是一款成熟的商业 APM 工具,提供全栈式监控解决方案,支持几乎所有主流编程语言和框架,以直观的可视化和强大的分析能力著称。
2.2 账号注册与初始化
- 选择适合的套餐(提供免费试用版)
- 登录控制台,点击 "Add data" 选择应用类型
2.3 Java 应用监控配置
2.3.1 安装 Java 代理
# 下载New Relic Java代理
wget https://download.newrelic.com/newrelic/java-agent/newrelic-agent/current/newrelic-java.zip
# 解压代理
unzip newrelic-java.zip -d /opt/newrelic
# 配置代理(编辑配置文件)
vim /opt/newrelic/newrelic.yml
# 修改以下配置
app_name: "My Java Application" # 应用名称
license_key: "YOUR_LICENSE_KEY" # 替换为你的license key
2.3.2 集成到应用服务器
Tomcat 集成:
# 编辑Tomcat启动脚本
vim /usr/local/tomcat/bin/catalina.sh
# 在脚本开头添加
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/newrelic/newrelic.jar"
# 重启Tomcat
systemctl restart tomcat
Spring Boot 应用集成:
# 启动命令中添加代理参数
java -javaagent:/opt/newrelic/newrelic.jar -jar your-application.jar
2.4 前端应用监控配置
- 在 New Relic 控制台,选择 "Add data" → "Browser"
- 选择 "Copy/paste JavaScript code"
- 将生成的代码片段添加到 HTML 页面的<head>标签内:
<script type="text/javascript">
window.NREUM||(NREUM={});
NREUM.info={
// 自动生成的配置信息
beacon:"bam.nr-data.net",
errorBeacon:"bam.nr-data.net",
licenseKey:"YOUR_LICENSE_KEY",
applicationID:"123456",
// 其他配置...
};
</script>
<script src="https://js-agent.newrelic.com/nr-123.js"></script>
2.5 关键功能配置
2.5.1 自定义仪表板
- 在控制台点击 "Dashboards" → "Create a dashboard"
- 添加常用指标组件:
-
- 应用响应时间(Apdex 分数)
-
- 错误率
-
- 吞吐量(每秒事务数)
-
- 数据库查询时间
2.5.2 告警配置
- 点击 "Alerts" → "Policies" → "Create a policy"
- 设置告警条件:
-
- Apdex 分数低于 0.85 持续 5 分钟
-
- 错误率高于 1% 持续 3 分钟
-
- 响应时间超过 500ms 持续 10 分钟
3. 配置通知渠道(邮件、Slack、PagerDuty 等)
2.6 查看监控数据
- 应用概述:在 "APM & Services" 中查看应用整体性能
- 事务追踪:分析慢响应的具体调用路径
- 数据库监控:识别慢查询和数据库性能问题
- 错误追踪:查看应用异常和堆栈信息
- 用户体验:通过 "Browser" 查看真实用户监控数据
三、Datadog 部署与配置
3.1 Datadog 概述
Datadog 是一款云原生全栈监控平台,提供 APM、基础设施监控、日志管理和安全监控等一体化解决方案,特别适合容器和微服务环境。
3.2 Datadog Agent 安装
Datadog 通过 Agent 收集主机和容器数据:
3.2.1 Linux 主机安装
# 使用官方脚本安装Agent
DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=YOUR_API_KEY bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)"
# 启动Agent
systemctl start datadog-agent
systemctl enable datadog-agent
# 验证安装
datadog-agent status
3.2.2 Kubernetes 集群安装
# 添加Datadog Helm仓库
helm repo add datadog https://helm.datadoghq.com
helm repo update
# 安装Datadog Agent
helm install datadog-agent datadog/datadog \
--set datadog.site=datadoghq.com \
--set datadog.apiKey=YOUR_API_KEY \
--set agents.enabled=true \
--set clusterAgent.enabled=true \
--set clusterAgent.metricsProvider.enabled=true
3.3 APM 功能配置
3.3.1 Java 应用监控
- 编辑 Agent 配置文件:
vim /etc/datadog-agent/datadog.yaml
# 确保以下配置启用
apm_config:
enabled: true
- 重启 Agent:
systemctl restart datadog-agent
- 在应用启动参数中添加 APM 代理:
# Tomcat配置
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/datadog-agent/agent/bin/dd-java-agent.jar"
CATALINA_OPTS="$CATALINA_OPTS -Ddd.service=my-java-app" # 应用名称
CATALINA_OPTS="$CATALINA_OPTS -Ddd.env=production" # 环境标识
CATALINA_OPTS="$CATALINA_OPTS -Ddd.version=1.0.0" # 应用版本
3.3.2 Python 应用监控
# 安装Datadog Python代理
pip install ddtrace
# 启动应用时注入代理
ddtrace-run python your_application.py
# 或在代码中初始化
import ddtrace
ddtrace.patch_all()
ddtrace.config.service = "my-python-app"
ddtrace.config.env = "production"
3.4 分布式追踪配置
Datadog APM 自动支持分布式追踪,对于跨服务调用,需确保:
- 所有服务都安装了对应语言的 Datadog 代理
- 服务间通过 HTTP/HTTPS、gRPC 等标准协议通信
- 对于自定义协议,需手动传递追踪上下文:
// Java手动传递追踪上下文示例
import datadog.trace.api.DDTags;
import datadog.trace.api.Trace;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMap;
@Trace
public void callRemoteService(HttpClient client, String url) {
Tracer tracer = GlobalTracer.get();
Span span = tracer.activeSpan();
// 创建HTTP请求
HttpGet request = new HttpGet(url);
// 注入追踪上下文到请求头
tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS,
new TextMap() {
@Override
public void put(String key, String value) {
request.addHeader(key, value);
}
@Override
public Iterator<Map.Entry<String, String>> iterator() {
throw new UnsupportedOperationException();
}
});
// 执行请求
client.execute(request);
}
3.5 关键功能使用
3.5.1 Service Map(服务地图)
自动发现并可视化服务间依赖关系:
- 登录 Datadog 控制台,导航至 "APM" → "Service Map"
- 查看服务调用关系和延迟分布
- 点击服务节点查看详细性能数据
3.5.2 自定义指标与仪表板
- 添加自定义业务指标(Java 示例):
import com.timgroup.statsd.NonBlockingStatsDClient;
import com.timgroup.statsd.StatsDClient;
// 初始化StatsD客户端
StatsDClient statsd = new NonBlockingStatsDClient(
"myapp", // 指标前缀
"localhost", // Datadog Agent地址
8125 // Datadog Agent端口
);
// 记录订单完成指标
statsd.increment("orders.completed");
// 记录订单金额
statsd.histogram("orders.amount", order.getAmount());
2. 创建自定义仪表板:
-
- 导航至 "Dashboards" → "New Dashboard"
-
- 添加指标图表,支持组合技术指标和业务指标
-
- 设置自动刷新频率和时间范围
3.5.3 告警配置
- 导航至 "Monitors" → "New Monitor"
- 选择 "APM" 作为监控类型
- 配置监控条件:
-
- 服务响应时间 p95 > 1000ms
-
- 错误率 > 0.5%
-
- 特定端点的吞吐量下降 > 50%
4. 设置通知方式和升级策略
四、SkyWalking 部署与配置
4.1 SkyWalking 概述
SkyWalking 是一款开源 APM 工具,由中国开发者吴晟主导开发,支持分布式追踪、服务网格、度量分析和日志集成,可私有化部署,适合对数据隐私有严格要求的组织。
4.2 SkyWalking 架构

4.3 服务器端部署(Docker 方式)
4.3.1 部署 Elasticsearch(存储后端)
# 启动Elasticsearch
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:7.14.0
4.3.2 部署 SkyWalking OAP Server
# 启动OAP Server
docker run -d \
--name skywalking-oap \
--link elasticsearch:elasticsearch \
-p 12800:12800 \
-p 11800:11800 \
-e SW_STORAGE=elasticsearch \
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
apache/skywalking-oap-server:8.9.1
4.3.3 部署 SkyWalking Web UI
# 启动Web UI
docker run -d \
--name skywalking-ui \
--link skywalking-oap:skywalking-oap \
-p 8080:8080 \
-e SW_OAP_ADDRESS=skywalking-oap:12800 \
apache/skywalking-ui:8.9.1
访问 Web UI:http:// 服务器 IP:8080,默认用户名 / 密码为 admin/admin。
4.4 应用代理配置
4.4.1 Java 应用配置
# 下载SkyWalking Java Agent
wget https://archive.apache.org/dist/skywalking/8.9.1/apache-skywalking-java-agent-8.9.1.tgz
tar zxvf apache-skywalking-java-agent-8.9.1.tgz -C /opt/
# 启动应用时添加代理
java -javaagent:/opt/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=my-java-app \
-Dskywalking.collector.backend_service=localhost:11800 \
-jar your-application.jar
4.4.2 容器化应用配置(Docker)
FROM openjdk:11-jre-slim
COPY your-application.jar /app.jar
COPY skywalking-agent /opt/skywalking-agent
ENTRYPOINT ["java", \
"-javaagent:/opt/skywalking-agent/skywalking-agent.jar", \
"-Dskywalking.agent.service_name=my-java-app", \
"-Dskywalking.collector.backend_service=skywalking-oap:11800", \
"-jar", "/app.jar"]
4.4.3 Kubernetes 部署
# 在Deployment中添加环境变量和挂载
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-java-app
spec:
replicas: 2
template:
spec:
containers:
- name: my-java-app
image: your-app-image:latest
env:
- name: SW_AGENT_NAME
value: "my-java-app"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "skywalking-oap:11800"
volumeMounts:
- name: skywalking-agent
mountPath: /opt/skywalking-agent
volumes:
- name: skywalking-agent
hostPath:
path: /opt/skywalking-agent # 提前在节点上放置agent
4.5 高级配置
4.5.1 告警配置
编辑 OAP Server 的告警规则配置文件:
# 示例:配置响应时间告警
rules:
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: "Service {name} response time is more than 1000ms in 3 minutes of last 10 minutes"
tags:
level: critical
通过 Web UI 配置告警通知渠道(邮件、Slack 等)。
4.5.2 日志集成
与 Logback 集成,实现日志与追踪数据关联:
- 添加依赖(Maven):
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.9.1</version>
</dependency>
2. 配置 logback.xml:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
3. 配置 SkyWalking 收集日志:
# 修改 OAP Server 配置,启用日志收集
receiver-log:
selector: ${SW_RECEIVER_LOG:default}
default:
bufferPath: ${SW_RECEIVER_LOG_BUFFER_PATH:../buffer/log}
bufferOffsetMaxFileSize: ${SW_RECEIVER_LOG_BUFFER_OFFSET_MAX_FILE_SIZE:100mb}
bufferDataMaxFileSize: ${SW_RECEIVER_LOG_BUFFER_DATA_MAX_FILE_SIZE:500mb}
bufferFileCleanWhenRestart: ${SW_RECEIVER_LOG_BUFFER_FILE_CLEAN_WHEN_RESTART:false}
4.6 SkyWalking 功能使用
- 服务拓扑图:
-
- 导航至 "Dashboard" → "Service Topology"
-
- 查看服务间调用关系和依赖强度
-
- 点击连接线查看调用延迟和成功率
2. 追踪分析:
-
- 导航至 "Trace" → "Trace Search"
-
- 根据服务名、时间范围、响应时间等筛选追踪数据
-
- 点击追踪 ID 查看完整调用链和各节点耗时
3.性能剖析:
-
- 导航至 "Profiling" → "Thread Profiling"
-
- 创建剖析任务,设置目标服务和触发条件
-
- 分析线程状态和方法执行时间,定位性能瓶颈
五、APM 工具最佳实践
5.1 监控策略设计
- 关键业务流程监控:
-
- 识别核心业务链路(如电商下单流程:商品查询→购物车→结算→支付)
-
- 为每个关键流程设置端到端监控
-
- 建立业务指标与技术指标的关联关系
2. 分层监控体系:

3. 采样策略:
-
- 正常流量:采用低采样率(如 1%)减少开销
-
- 异常流量:对慢响应、错误请求采用 100% 采样
-
- 自定义采样:对关键业务流程提高采样率
5.2 性能问题诊断流程
- 问题发现:通过告警或用户反馈发现性能问题
- 范围定位:确定受影响的服务和用户群体
- 数据收集:获取相关追踪数据、日志和指标
- 瓶颈分析:
-
- 查看调用链耗时分布
-
- 分析数据库慢查询
-
- 检查资源使用情况(CPU、内存、IO)
5. 根因定位:确定具体代码块、配置或依赖问题
6. 优化验证:实施修复后验证性能改善
5.3 性能优化案例
案例:电商平台支付接口响应慢
- 问题现象:支付接口平均响应时间 > 3 秒,远超正常的 500ms
- 数据收集:
-
- APM 追踪显示第三方支付网关调用耗时占比 80%
-
- 数据库查询耗时占比 15%
3. 根因分析:
-
- 第三方支付网关偶尔响应延迟
-
- 数据库未对订单表创建合适索引
4. 优化措施:
-
- 实现支付结果异步通知机制,避免同步等待
-
- 为订单表添加联合索引
-
- 增加本地缓存减少重复查询
5. 优化效果:
-
- 平均响应时间降至 300ms
-
- 95 分位响应时间从 5 秒降至 800ms
-
- 接口吞吐量提升 3 倍
六、APM 工具选型与集成建议
6.1 选型决策因素
- 技术栈匹配度:
-
- 多语言环境优先考虑 New Relic、Datadog
-
- Java 为主的环境可考虑 SkyWalking
-
- 云原生环境优先选择 Datadog
2. 成本预算:
-
- 预算充足且追求省心:商业工具(New Relic、Datadog)
-
- 预算有限且有技术能力:开源工具(SkyWalking、Elastic APM)
3. 团队技术能力:
-
- 运维团队强大:可选择需自行维护的开源方案
-
- 希望专注业务:选择托管型商业方案
4. 合规要求:
-
- 数据不能出境:选择支持私有化部署的工具(SkyWalking、Dynatrace)
-
- 无严格数据本地化要求:可选择 SaaS 方案
6.2 工具集成策略
- APM 与基础设施监控集成:
-
- 将 APM 工具与 Zabbix、Prometheus 等集成
-
- 实现应用性能与服务器资源使用的关联分析
-
- 示例:Datadog + Prometheus 集成,统一展示全栈数据
2. APM 与日志系统集成:
-
- 实现追踪 ID 与日志的关联,快速定位问题
-
- 推荐组合:
-
-
- SkyWalking + ELK
-
-
-
- Datadog APM + Datadog Logs
-
-
-
- New Relic APM + New Relic Logs
-
3. APM 与 CI/CD 集成:
-
- 在持续集成流程中添加性能测试
-
- 性能指标不达标时阻断部署
-
- 跟踪每次发布后的性能变化
七、总结与未来趋势
应用性能监控(APM)已成为现代软件系统不可或缺的组成部分,尤其在微服务和云原生架构下,APM 工具能够帮助团队快速定位问题、优化性能并提升用户体验。
主流工具对比总结:
- New Relic:功能最全面,易用性强,适合追求高效运维的团队
- Datadog:云原生领域领先,全栈监控能力突出,适合容器化环境
- SkyWalking:开源免费,可私有化部署,适合预算有限或有数据隐私要求的团队
未来发展趋势:
- AI 驱动的性能监控:通过机器学习自动识别异常和预测性能问题
- 全栈可观测性:APM、基础设施监控、日志管理、安全监控的深度融合
- 实时性能优化:从监控到自动优化的闭环(如自动扩缩容、动态调整配置)
- 业务驱动的监控:更紧密地将技术指标与业务成果关联
- 边缘计算监控:针对边缘设备和分布式系统的轻量级 APM 方案
选择适合自身需求的 APM 工具并制定合理的监控策略,能够显著提升系统可靠性和用户满意度,最终为业务发展提供有力支撑。随着技术的不断演进,APM 工具将在保障系统性能和驱动业务增长方面发挥越来越重要的作用。

浙公网安备 33010602011771号