一、引言
在现代分布式系统中,监控是保障系统稳定性和业务连续性的核心能力。一个完善的监控指标体系能够帮助我们实时感知系统状态、提前发现潜在风险、快速定位故障根源。本文将深入探讨监控指标的分类体系、关键指标定义、监控方法论以及生产环境最佳实践。
二、SCQA分析框架
情境(Situation)
- 分布式系统复杂度不断提升,故障排查难度加大
- 用户对服务可用性要求越来越高
- 传统监控方式难以满足现代运维需求
冲突(Complication)
- 指标种类繁多,难以确定核心监控对象
- 阈值设置不合理导致误报或漏报
- 告警风暴影响运维效率
- 缺乏统一的监控方法论指导
问题(Question)
- 应该监控哪些指标?
- 如何设置合理的告警阈值?
- 如何构建完整的监控体系?
- 生产环境中有哪些最佳实践?
答案(Answer)
- 监控指标分为系统层、应用层、业务层三大层次
- 遵循USE、RED、黄金信号等方法论
- 采用分层采集、分级告警策略
- 建立可视化仪表盘和智能分析体系
三、监控指标分类体系
3.1 指标分类架构
┌─────────────────────────────────────────────────────────────────┐
│ 监控指标分类体系 │
├───────────────┬───────────────┬───────────────┬───────────────┤
│ 系统层指标 │ 应用层指标 │ 业务层指标 │ 网络指标 │
│ CPU/内存/磁盘 │ QPS/响应时间 │ PV/UV/订单量 │ 带宽/延迟 │
│ 磁盘IO/网络 │ 错误率/成功率 │ 转化率/留存率 │ 丢包/连接数 │
└───────────────┴───────────────┴───────────────┴───────────────┘
3.2 指标层次说明
| 层次 | 关注重点 | 典型指标 | 监控目的 |
|---|---|---|---|
| 系统层 | 基础设施健康 | CPU、内存、磁盘、网络 | 资源瓶颈识别 |
| 应用层 | 服务运行状态 | QPS、响应时间、错误率 | 服务质量保障 |
| 业务层 | 业务健康度 | PV、UV、订单量、转化率 | 业务连续性 |
| 中间件层 | 组件运行状态 | 连接数、命中率、堆积量 | 依赖组件监控 |
四、系统层指标详解
4.1 CPU指标
核心指标:
# CPU使用率(按模式划分)
- user:用户态CPU使用率(应用程序占用)
- system:内核态CPU使用率(系统调用占用)
- idle:空闲CPU百分比
- iowait:等待I/O的CPU时间
# 系统负载
- load1:1分钟平均负载
- load5:5分钟平均负载
- load15:15分钟平均负载
# 其他指标
- context_switches:上下文切换次数
- interrupts:中断次数
Prometheus查询示例:
# CPU使用率
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 系统负载
node_load5 / count(node_cpu_seconds_total{mode="idle"}) by(instance)
阈值建议: | 指标 | 警告阈值 | 紧急阈值 | |:——|:——|:——| | CPU使用率 | >70%(持续5分钟) | >90%(持续2分钟) | | 系统负载 | >CPU核心数 | >2×CPU核心数 |
4.2 内存指标
核心指标:
# 内存使用
- MemTotal:总内存
- MemAvailable:可用内存
- MemUsed:已用内存
- Buffers/Cached:缓存/缓冲区
# Swap使用
- SwapTotal:Swap总量
- SwapFree:空闲Swap
- SwapUsed:已用Swap
# 内存压力
- OOM_kills:OOM杀死进程数
Prometheus查询示例:
# 内存使用率
100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)
# Swap使用率
node_memory_SwapUsed_bytes / node_memory_SwapTotal_bytes * 100
阈值建议: | 指标 | 警告阈值 | 紧急阈值 | |:——|:——|:——| | 内存使用率 | >80% | >90% | | Swap使用率 | >20% | >50% | | OOM_kills | >0(1小时内) | >5(1小时内) |
4.3 磁盘指标
核心指标:
# 磁盘空间
- Filesystem Size:文件系统总大小
- Available:可用空间
- Used:已用空间
# 磁盘IO
- rMB/s:读吞吐量
- wMB/s:写吞吐量
- rIOPS:读IOPS
- wIOPS:写IOPS
- await:平均I/O等待时间
Prometheus查询示例:
# 磁盘空间使用率
100 - (node_filesystem_avail_bytes / node_filesystem_size_bytes * 100)
# 磁盘IO等待时间
avg by(instance) (rate(node_disk_io_time_seconds_total[5m])) * 100
阈值建议: | 指标 | 警告阈值 | 紧急阈值 | |:——|:——|:——| | 磁盘空间 | >80% | >95% | | I/O等待时间 | >50ms | >200ms |
五、应用层指标详解(四大黄金信号)
5.1 延迟(Latency)
定义:请求从发出到响应的总耗时
核心指标:
- 平均响应时间:所有请求的平均耗时
- P50(中位数):50%请求的耗时小于该值
- P90:90%请求的耗时小于该值
- P95:95%请求的耗时小于该值
- P99:99%请求的耗时小于该值
- P99.9:99.9%请求的耗时小于该值
为什么需要分位数:
- 平均值容易被极端值误导
- 分位数更能反映用户真实体验
- P99/P99.9反映尾延迟情况
Prometheus查询示例:
# P95延迟
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# P99延迟
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
5.2 流量(Traffic)
定义:系统处理的请求量
核心指标:
- QPS(Queries Per Second):每秒查询数
- TPS(Transactions Per Second):每秒事务数
- 并发连接数:当前活跃连接数
- 请求峰值:最大QPS
Prometheus查询示例:
# QPS
sum(rate(http_requests_total[1m]))
# 并发连接数(Nginx)
nginx_connections_active
5.3 错误(Errors)
定义:请求失败的比例
核心指标:
- 错误率:错误请求占总请求的比例
- 5xx错误率:服务端错误比例
- 4xx错误率:客户端错误比例
- 超时次数:请求超时数量
- 异常堆栈数:应用异常数量
Prometheus查询示例:
# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
# 5xx错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
阈值建议: | 指标 | 警告阈值 | 紧急阈值 | |:——|:——|:——| | 错误率 | >1% | >5% | | 5xx错误率 | >0.5% | >2% |
5.4 饱和度(Saturation)
定义:系统资源的使用程度
核心指标:
- 线程池使用率
- 连接池使用率
- 队列长度
- 任务等待时间
- 资源利用率
Prometheus查询示例:
# 线程池使用率
jvm_threads_live / jvm_threads_daemon * 100
# 连接池使用率
hikaricp_connections_active / hikaricp_connections_max * 100
六、业务层指标详解
6.1 用户指标
核心指标:
- PV(Page Views):页面浏览量
- UV(Unique Visitors):独立访客数
- DAU(Daily Active Users):日活跃用户数
- MAU(Monthly Active Users):月活跃用户数
- 在线用户数:当前在线用户数量
6.2 转化指标
核心指标:
- 注册转化率:注册用户/访问用户
- 登录转化率:登录用户/访问用户
- 下单转化率:下单用户/访问用户
- 支付成功率:支付成功订单/总订单
- 购物车转化率:加入购物车/访问商品页
6.3 收入指标
核心指标:
- GMV(Gross Merchandise Volume):成交总额
- 订单金额:平均订单金额
- 客单价:平均用户消费金额
- ARPU(Average Revenue Per User):用户平均收入
6.4 运营指标
核心指标:
- 留存率:次日留存、7日留存、30日留存
- 复购率:重复购买用户比例
- 活跃度:用户平均访问频次
- 停留时长:用户平均停留时间
七、中间件指标详解
7.1 数据库指标
MySQL核心指标:
# 连接指标
- Threads_connected:当前连接数
- Threads_running:活跃连接数
- Max_used_connections:最大连接数
# 查询指标
- Slow_queries:慢查询数
- Queries:总查询数
- Innodb_rows_read:读取行数
# 复制指标
- Seconds_Behind_Master:主从延迟
- Slave_IO_Running:IO线程状态
- Slave_SQL_Running:SQL线程状态
Prometheus查询示例:
# 慢查询率
rate(mysql_global_status_slow_queries[5m]) / rate(mysql_global_status_queries[5m]) * 100
# 主从延迟
mysql_slave_status_seconds_behind_master
7.2 缓存指标(Redis)
核心指标:
# 命中率
- Keyspace_hits:命中次数
- Keyspace_misses:未命中次数
- Hit_rate:命中率
# 内存指标
- used_memory:已用内存
- maxmemory:最大内存
- mem_fragmentation_ratio:内存碎片率
# 连接指标
- connected_clients:连接数
- blocked_clients:阻塞连接数
Prometheus查询示例:
# Redis命中率
redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) * 100
# 内存使用率
redis_used_memory / redis_maxmemory * 100
7.3 消息队列指标(Kafka)
核心指标:
# 生产指标
- Messages_in:消息输入速率
- Bytes_in:字节输入速率
# 消费指标
- Messages_out:消息输出速率
- Bytes_out:字节输出速率
# 堆积指标
- Under_replicated_partitions:副本不足分区数
- Offline_partitions:离线分区数
- Consumer_lag:消费者滞后量
Prometheus查询示例:
# 消息堆积量(消费者滞后)
sum(kafka_consumer_group_lag) by (group, topic)
# 分区离线数
sum(kafka_controller_partition_state{state="Offline"})
八、监控方法论
8.1 USE方法(系统资源)
定义:快速定位系统资源性能瓶颈的方法论
三大指标:
1. Utilization(使用率):资源用于服务的时间百分比
- CPU使用率、内存使用率、磁盘使用率
- 范围:0%-100%
2. Saturation(饱和度):资源的繁忙程度
- 等待队列长度、任务等待时间
- 超过100%表示资源饱和
3. Errors(错误数):发生错误的事件个数
- 网络错误、磁盘错误、连接错误
适用场景:
- 服务器资源监控
- 性能瓶颈快速定位
- 容量规划
8.2 RED方法(应用服务)
定义:针对服务监控的方法论
三大指标:
1. Rate(速率):每秒请求数
- QPS、TPS
2. Errors(错误):每秒错误数
- 错误率、失败请求数
3. Duration(持续时间):请求耗时分布
- P50/P95/P99延迟
适用场景:
- API服务监控
- 微服务架构
- 服务质量评估
8.3 四大黄金信号(Google SRE)
定义:Google SRE团队提出的监控核心指标
四大信号:
1. 延迟(Latency):请求耗时
2. 流量(Traffic):请求量
3. 错误(Errors):错误率
4. 饱和度(Saturation):资源使用程度
核心思想:
- 覆盖服务的关键维度
- 快速发现和定位问题
- 建立服务水平目标(SLO)
九、生产环境最佳实践
9.1 指标采集策略
分层采集架构:
┌─────────────────────────────────────────────────────────────┐
│ 指标采集架构 │
├─────────────────────────────────────────────────────────────┤
│ 基础设施层 │ Node Exporter → Prometheus │
│ 应用层 │ 客户端SDK → Prometheus │
│ 业务层 │ 埋点系统 → 时序数据库 │
│ 中间件层 │ 专用Exporter → Prometheus │
└─────────────────────────────────────────────────────────────┘
采集频率建议: | 指标类型 | 采集频率 | 保留时间 | |:——|:——|:——| | 系统指标 | 15秒 | 30天 | | 应用指标 | 10秒 | 30天 | | 业务指标 | 1分钟 | 90天 | | 日志数据 | 实时 | 7-30天 |
9.2 阈值设置原则
基于基线的阈值设置:
# 步骤1:建立基线
- 采集7-14天的正常运行数据
- 计算平均值和标准差
# 步骤2:设置阈值
- 警告阈值 = 基线 + 1.5×标准差
- 紧急阈值 = 基线 + 2×标准差
# 步骤3:动态调整
- 根据业务变化定期更新基线
- 节假日/促销期设置特殊阈值
常见阈值模板:
# CPU阈值
cpu_warning: 70
cpu_critical: 90
# 内存阈值
memory_warning: 80
memory_critical: 90
# 响应时间阈值
p95_warning: 500ms
p95_critical: 1000ms
# 错误率阈值
error_rate_warning: 1
error_rate_critical: 5
9.3 告警分级策略
四级告警体系:
# P0(紧急)- 立即响应(5分钟内)
- 服务不可用
- 数据库宕机
- 磁盘空间耗尽
- 主从复制中断
# P1(严重)- 1小时内处理
- CPU持续>90%
- 内存持续>90%
- 错误率持续>5%
- 响应时间持续>1s
# P2(中等)- 4小时内处理
- CPU持续>70%
- 内存持续>80%
- 错误率持续>1%
- 证书即将过期(<7天)
# P3(提示)- 工作时间处理
- 备份失败
- 日志级别异常
- 配置变更通知
- 容量预警
告警抑制规则:
# 避免告警风暴
- 同一服务的P0告警触发后,5分钟内不再发送同类告警
- 当父服务告警时,抑制子服务的相关告警
- 设置告警聚合,相同告警合并发送
9.4 可视化配置
仪表盘设计原则:
# 1. 分层展示
- 概览页:核心指标汇总
- 系统页:CPU、内存、磁盘、网络
- 应用页:QPS、延迟、错误率
- 业务页:PV、UV、订单量
# 2. 颜色编码
- 绿色:正常(0-70%)
- 黄色:警告(70%-90%)
- 红色:异常(>90%)
# 3. 图表类型
- 折线图:趋势分析
- 柱状图:对比分析
- 仪表盘:实时状态
- 热力图:分布分析
Grafana仪表盘示例:
{
"title": "服务健康度概览",
"panels": [
{
"type": "gauge",
"title": "CPU使用率",
"targets": ["100 - (avg by(instance) (rate(node_cpu_seconds_total{mode='idle'}[5m])) * 100)"],
"thresholds": [70, 90]
},
{
"type": "graph",
"title": "QPS趋势",
"targets": ["sum(rate(http_requests_total[1m]))"]
},
{
"type": "stat",
"title": "错误率",
"targets": ["sum(rate(http_requests_total{status=~'5..'}[5m])) / sum(rate(http_requests_total[5m])) * 100"]
}
]
}
9.5 智能告警与预测
机器学习辅助:
# 异常检测
- 使用机器学习模型识别异常模式
- 自动发现基线变化
- 预测潜在故障
# 容量预测
- 基于历史数据预测资源需求
- 提前扩容避免性能瓶颈
- 优化资源利用率
十、监控工具链推荐
10.1 开源工具链
| 工具 | 功能 | 特点 |
|---|---|---|
| Prometheus | 时序数据采集与存储 | 多维数据模型、PromQL查询 |
| Grafana | 可视化仪表盘 | 丰富图表、灵活配置 |
| Alertmanager | 告警管理 | 分组、抑制、路由 |
| Node Exporter | 系统指标采集 | 全面的系统指标 |
| Blackbox Exporter | 外部服务监控 | HTTP/ICMP/TCP探测 |
10.2 云原生工具链
| 工具 | 功能 | 特点 |
|---|---|---|
| Thanos | 长期存储与查询 | 水平扩展、多集群支持 |
| Mimir | 可扩展监控系统 | 云原生架构、高可用 |
| Tempo | 分布式追踪 | 与Prometheus集成 |
| Loki | 日志聚合 | 轻量级、与Grafana集成 |
十一、常见问题与解决方案
问题一:告警风暴
现象:大量告警同时触发,难以处理
解决方案:
# 1. 告警抑制
- 设置父子告警关系
- 主服务告警时抑制子服务告警
# 2. 告警聚合
- 相同告警合并发送
- 设置告警间隔
# 3. 智能降噪
- 使用机器学习识别重复模式
- 只发送关键告警
问题二:指标过多
现象:监控面板杂乱,难以定位问题
解决方案:
# 1. 分层展示
- 概览页:核心指标
- 详情页:详细指标
# 2. 指标筛选
- 只展示关键指标
- 提供下钻能力
# 3. 动态展示
- 根据状态自动显示相关指标
- 隐藏正常状态的指标
问题三:误报频繁
现象:阈值设置不合理,频繁触发无效告警
解决方案:
# 1. 基于基线调整阈值
- 采集历史数据建立基线
- 根据基线动态调整
# 2. 设置持续时间
- 告警触发需要持续一段时间
- 避免瞬时波动触发告警
# 3. 多条件判断
- 结合多个指标判断
- 避免单一指标误报
问题四:指标缺失
现象:关键指标未监控,故障时无法定位
解决方案:
# 1. 完善监控覆盖
- 制定监控清单
- 定期审计
# 2. 自动化发现
- 使用服务发现自动添加监控目标
- 检测未监控的服务
# 3. 代码审查
- 新服务上线必须包含监控埋点
- 监控覆盖率作为验收标准
十二、总结
核心要点
- 监控层次:系统层、应用层、业务层、中间件层
- 方法论:USE方法(系统资源)、RED方法(应用服务)、四大黄金信号
- 指标类型:计数器(Counter)、仪表盘(Gauge)、直方图(Histogram)、摘要(Summary)
- 最佳实践:分层采集、动态阈值、分级告警、智能分析
实施建议
| 阶段 | 任务 | 时间 |
|---|---|---|
| 第一阶段 | 建立基础监控(系统指标) | 1-2周 |
| 第二阶段 | 完善应用监控(黄金信号) | 2-3周 |
| 第三阶段 | 添加业务监控(业务指标) | 2-3周 |
| 第四阶段 | 优化告警策略(智能告警) | 持续 |
本文对应的面试题:监控哪些指标?
附录:常用PromQL查询示例
# CPU使用率
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)
# 磁盘空间使用率
100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100)
# QPS
sum(rate(http_requests_total[1m]))
# P95延迟
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100
# Redis命中率
redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) * 100
# MySQL慢查询率
rate(mysql_global_status_slow_queries[5m]) / rate(mysql_global_status_queries[5m]) * 100
# Kafka消费者滞后
sum(kafka_consumer_group_lag) by (group, topic)
文档信息
- 本文作者:soveran zhong
- 本文链接:https://blog.clockwingsoar.cn/2026/06/12/monitoring-metrics-best-practices/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)