Prometheus 监控告警实战 2026:PromQL、Alertmanager 与 SLO 驱动的可观测性
为什么 Prometheus 仍是云原生监控的事实标准
在 OpenTelemetry 蓬勃发展的 2026 年,Prometheus 依然主导指标(Metrics)领域。它以拉取模型(Pull) + 多维数据模型 + 强大 PromQL 著称,配合 Alertmanager 形成闭环告警。理解它的设计取舍,是搭建可靠可观测性的第一步。
| 维度 | Prometheus | 推模型(Push)方案 |
|---|---|---|
| 采集 | 主动拉取 /metrics | 客户端主动推送 |
| 查询 | PromQL 多维灵活 | 依赖外部存储查询 |
| 服务发现 | 原生支持 K8s/Consul | 需自行实现 |
| 适用 | 机器/服务指标 | 短生命周期任务(配 Pushgateway) |
架构与核心组件
- Prometheus Server:抓取、存储(本地 TSDB)、执行 PromQL。
- Exporter:把第三方系统指标暴露为
/metrics(node_exporter、blackbox_exporter 等)。 - Alertmanager:去重、分组、路由、静默告警。
- Pushgateway:承接批处理/短任务的推送指标。
# prometheus.yml 最小配置
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["node-1:9100", "node-2:9100"]
- job_name: "api"
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_name]
regex: "order-api"
action: keep
排障抓取失败时,可用 HTTP 状态码 工具对照 Exporter 返回的响应码(如 200/503),快速定位是采集端还是暴露端问题。
PromQL 核心函数
rate / irate:计算速率
# 每秒 HTTP 请求数(5m 窗口,自动去毛刺)
rate(http_requests_total[5m])
# 瞬时速率(最近两个样本),更灵敏但更易抖
irate(http_requests_total[5m])
histogram_quantile:分位延迟
http_request_duration_seconds_bucket 是直方图指标,用分位函数看 P99 延迟:
# P99 请求延迟
histogram_quantile(0.99,
sum by (le) (rate(http_request_duration_seconds_bucket[5m]))
)
标签聚合
# 按服务与状态码汇总 QPS
sum by (service, code) (rate(http_requests_total[5m]))
记录规则(Recording Rules):预计算降本
把高频、昂贵的查询预计算为新时间序列,仪表盘直接读结果。
# rules/recording.yml
groups:
- name: http_slo
rules:
- record: job:http_requests:rate5m
expr: sum by (job) (rate(http_requests_total[5m]))
- record: job:request_latency:p99
expr: |
histogram_quantile(0.99,
sum by (job, le) (rate(http_request_duration_seconds_bucket[5m])))
告警规则与 Alertmanager
告警规则
# rules/alerts.yml
groups:
- name: availability
rules:
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{code=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])) > 0.05
for: 10m # 持续 10 分钟才触发,避免抖动
labels:
severity: critical
annotations:
summary: "错误率超过 5%"
description: "服务 {{ $labels.job }} 5xx 错误率 {{ $value | humanizePercentage }}"
Alertmanager 路由与分组
# alertmanager.yml
route:
receiver: "slack-default"
group_by: ["alertname", "job"]
group_wait: 30s # 同组首次等待,聚合多条
group_interval: 5m
repeat_interval: 4h
routes:
- matchers: ["severity=critical"]
receiver: "pagerduty"
continue: true
- matchers: ["job=~"batch.*"]
receiver: "slack-batch"
receivers:
- name: "slack-default"
slack_configs:
- api_url: ${SLACK_URL}
channel: "#alerts"
抑制(Inhibition)与静默(Silence)
- 抑制:当「主机宕机」告警存在时,抑制该机上「服务不可用」告警,避免噪音。
- 静默:维护窗口(如发版)临时屏蔽特定告警,可用 Cron 说明 工具规划维护时段。
SLO 与错误预算燃烧率
用 SLO(服务等级目标)替代「拍脑袋阈值」,是现代告警的核心。以 99.9% 可用性为例:
# 30 天窗口内的合规比(good / total)
(
sum(rate(http_requests_total{code!~"5.."}[30d]))
/
sum(rate(http_requests_total[30d]))
) > 0.999
燃烧率(Burn Rate)告警在错误预算快速消耗时提前报警:
- alert: ErrorBudgetBurnFast
expr: |
(
sum(rate(http_requests_total{code=~"5.."}[1h]))
/ sum(rate(http_requests_total[1h]))
) > (14.4 * (1 - 0.999)) # 1h 内烧光 30d 预算的 14.4 倍速率
for: 5m
labels: { severity: critical }
应用埋点:别只靠 Exporter
业务指标需要主动埋点。以 Python 为例:
from prometheus_client import Counter, Histogram, start_http_server
REQUESTS = Counter("http_requests_total", "总请求数", ["method", "code"])
LATENCY = Histogram("http_request_duration_seconds", "请求耗时")
start_http_server(8000) # 暴露 /metrics
@LATENCY.time()
def handle(req):
REQUESTS.labels(req.method, "200").inc()
return "ok"
前端或网关侧,可把结构化指标先经 JSON 格式化 工具校验,再写入监控管线,避免脏数据污染查询。
生产最佳实践清单
- 合理设
for:避免瞬时抖动产生告警风暴。 - Cardinality 控制:高基数列(如 user_id)不要做标签,会撑爆 TSDB。
- 分层告警:Warning 进群,Critical 进值班(Pager)。
- 记录规则前置:仪表盘查询走预计算。
- 长期存储:本地 TSDB 配 Thanos / Mimir 做远程写,突破单机保留上限。
常见问题 FAQ
Q1:rate 和 irate 怎么选?
看趋势用 rate(平滑稳);看瞬时尖刺用 irate(灵敏)。仪表盘一般用 rate。
Q2:直方图还是摘要(Summary)?
需要跨实例聚合分位(如全局 P99)用直方图;单实例且无法预知分位用 Summary。直方图更灵活,推荐默认。
Q3:告警一直抖动怎么办?
给告警规则加 for: 10m,或对指标做更长的 rate 窗口,吸收短时波动。
Q4:label 太多会怎样?
每个唯一 label 组合都是一条时间序列。滥用高基数列会导致内存与写入爆炸,是 Prometheus 最常见的性能坑。
Q5:Prometheus 能替代日志和链路吗?
不能。Metrics 看「总量与趋势」,Logs 看「单条细节」,Traces 看「调用路径」。三者互补,构成完整可观测性。
工具推荐
在 Prometheus 运维中,以下 工具库 能帮上忙:
Prometheus 的威力不在「能画图」,而在「用 PromQL 把业务健康翻译成可量化的 SLO,再用 Alertmanager 把噪音过滤成可行动的告警」。把指标、告警、SLO 三层串起来,监控才真正有价值。
本站提供浏览器本地工具,免注册即可试用 →