文档
Prometheus 入门教程:PromQL 与告警体系
1. 监控哲学
Prometheus 的核心方法论:
- 指标(Metrics) 优于日志(Logs)和追踪(Traces)
- Pull 模型:Prometheus 主动去目标抓数据(而非被动接收)
- 多维标签:同一个指标可通过标签区分不同维度
2. 四种指标类型
| 类型 | 说明 | 示例 | 典型函数 |
|---|---|---|---|
| Counter | 只增不减 | HTTP 请求总数 | rate() increase() |
| Gauge | 可增可减 | 内存使用量 | avg_over_time() |
| Histogram | 分桶统计 | 请求延迟分布 | histogram_quantile() |
| Summary | 客户端分位数 | P99 延迟 | (自带 quantile) |
3. PromQL 核心语法
基本查询
# 即时向量
node_cpu_seconds_total{mode="idle", instance="host1:9100"}
# 范围向量
node_cpu_seconds_total{mode="idle"}[5m]
# 时间偏移
node_memory_MemAvailable_bytes offset 1h
常用函数
# rate:计算每秒增长率(适合 Counter)
rate(http_requests_total[5m])
# avg by:按标签聚合
avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m]))
# topk:取前 k 个
topk(3, sum(rate(http_requests_total[5m])) by (endpoint))
# histogram_quantile:计算百分位数
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
4. 告警三件套
Prometheus(规则评估) → Alertmanager(分组/抑制/路由) → 通知渠道
Alertmanager 路由示例
route:
receiver: 'default'
routes:
- match:
severity: critical
receiver: 'pagerduty'
- match:
severity: warning
receiver: 'slack'
continue: true
- match_re:
service: "^(db|redis)$"
receiver: 'dba-team'
5. 高可用方案
- Thanos / Cortex:长期存储 + 全局视图
- 联邦:层次化 Prometheus 实例
- Remote Write:将数据写入 InfluxDB / VictoriaMetrics
6. 思考题
- Counter 类型为什么用
rate()而非直接差值?rate()和irate()的区别? - Histogram 和 Summary 如何选择?各有什么优缺点?
- 如何设计告警抑制规则避免"告警风暴"?