深色模式
中间件监控指标
摘要:中间件指标成百上千,真正需要告警的不超过二十个。本文按组件提炼关键 SLI(延迟、流量、错误、饱和度),给出 PromQL 示例与阈值建议,帮你搭一套不吵但有用的中间件监控。
适用环境
bash
# 确认各组件 exporter 已就绪
curl -sfS http://127.0.0.1:9113/metrics | head -2 # nginx exporter
curl -sfS http://127.0.0.1:9404/metrics | head -2 # kafka jmx exporter
curl -sfS http://127.0.0.1:15692/metrics | head -2 # rabbitmq prometheus
curl -sfS http://127.0.0.1:9114/metrics | head -2 # elasticsearch exporter1
2
3
4
5
2
3
4
5
操作步骤
1. 按 RED/USE 梳理四类 SLI
四大黄金信号适用于所有中间件:Rate(吞吐)、Errors(错误率)、Duration(延迟)、Saturation(饱和度,连接/队列/磁盘)。
2. Nginx 关键指标
promql
# QPS
sum(rate(nginx_http_requests_total[1m]))
# 5xx 错误率(>1% 告警)
sum(rate(nginx_http_requests_total{status=~"5.."}[5m]))
/ sum(rate(nginx_http_requests_total[5m]))
# 活跃连接数占上限比例(>80% 告警)
nginx_connections_active / nginx_connections_max1
2
3
4
5
6
7
2
3
4
5
6
7
3. Kafka 关键指标
promql
# 消费滞后(核心 SLI)
sum(kafka_consumergroup_lag) by (consumergroup, topic)
# 分区副本不同步数(>0 立即告警)
sum(kafka_cluster_partition_under_replicated) by (topic)
# 无 leader 的分区数(>0 紧急)
sum(kafka_cluster_partition_offline) by (topic)
# 生产请求 P99 延迟
histogram_quantile(0.99, sum(rate(kafka_network_request_metrics_request_time_ms_bucket[5m])) by (le))1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
4. RabbitMQ 关键指标
promql
# 队列堆积(核心 SLI)
rabbitmq_queue_messages_ready
# 无消费者但有消息(紧急)
rabbitmq_queue_consumers == 0 and rabbitmq_queue_messages_ready > 0
# 已投递未确认(消费端卡住)
rabbitmq_queue_messages_unacknowledged
# 磁盘水位告警
rabbitmq_disk_space_available_bytes / rabbitmq_disk_space_available_limit_bytes1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
5. Elasticsearch 关键指标
promql
# 集群状态(green=0, yellow=1, red=2)
elasticsearch_cluster_health_status
# 未分配分片数
elasticsearch_cluster_health_unassigned_shards
# JVM 堆使用率(>75% 告警,>85% 紧急)
elasticsearch_jvm_memory_used_bytes{area="heap"} / elasticsearch_jvm_memory_max_bytes{area="heap"}1
2
3
4
5
6
2
3
4
5
6
6. ZooKeeper 关键指标
bash
# 用四字命令采集(mntr 输出可被 exporter 转换)
echo mntr | nc 127.0.0.1 2181 | grep -E 'zk_avg_latency|zk_outstanding_requests|zk_followers'1
2
2
关注:zk_avg_latency(平均延迟)、zk_outstanding_requests(排队请求数)、zk_followers(follower 数量,应等于节点数-1)。
7. 统一告警示例
yaml
groups:
- name: middleware-sli
rules:
- alert: NginxErrorRateHigh
expr: |
sum(rate(nginx_http_requests_total{status=~"5.."}[5m]))
/ sum(rate(nginx_http_requests_total[5m])) > 0.01
for: 5m
labels: {severity: critical}
- alert: KafkaUnderReplicatedPartitions
expr: sum(kafka_cluster_partition_under_replicated) > 0
for: 5m
labels: {severity: warning}
- alert: ESClusterRed
expr: elasticsearch_cluster_health_status{color="red"} == 1
for: 1m
labels: {severity: critical}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
验证
bash
# 1) 所有 exporter 都能抓到样本
for p in 9113 9404 15692 9114; do
curl -sfS http://127.0.0.1:$p/metrics >/dev/null && echo "port $p OK" || echo "port $p FAIL"
done
# 2) 在 Prometheus 里确认 target 全 UP
curl -s http://127.0.0.1:9090/api/v1/targets | grep -o '"health":"[a-z]*"' | sort | uniq -c
# 3) 验证告警规则可被加载
promtool check rules /etc/prometheus/rules/middleware.yml1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
常见坑
WARNING
指标名前缀随 exporter 版本变化(如 kafka 的 lag 指标在旧版是 kafka_consumer_lag,新版可能是 kafka_consumergroup_lag)。写规则前先 curl | grep 确认真实指标名,不要照抄网上规则。
WARNING
把"瞬时抖动"直接当告警,会引发告警风暴。务必加 for: 5m 之类的持续时间,并优先用比率类指标而非绝对量。
DANGER
只监控中间件自身指标、不监控业务侧感知(如接口成功率),会出现"所有组件都绿但用户投诉"的盲区。中间件监控应与业务 SLO 联动。