Prometheus 核心回顾:架构、数据模型与 PromQL 基础
在构建 SLO 监控体系之前,必须牢固掌握 Prometheus 的核心概念。本节将系统回顾 Prometheus 的拉取架构、核心数据模型以及 SLO 计算中最高频使用的 PromQL 函数,为后续的 SLO 计算与告警规则编写打下坚实基础。
1. Prometheus 架构:拉取模型与核心组件
Prometheus 采用主动拉取(Pull)的监控架构,区别于传统的推送模型。这种设计使得监控系统对目标实例的可用性感知更加直接,且易于在内部网络进行控制。
架构要点: Prometheus Server 通过服务发现或静态配置,定期从 Exporter 或应用自身暴露的 HTTP 端点(/metrics)拉取指标数据。Alertmanager 负责处理告警,Grafana 等工具负责可视化。
2. 数据模型:Metric、Label 与 Sample
Prometheus 存储的所有数据都是时间序列。理解数据模型是编写 PromQL 和设计 SLO 指标的基础。
| 概念 | 说明 | SLO 场景示例 |
|---|---|---|
| Metric(指标名) | 描述被监控对象的一般特征,如 http_requests_total |
slo:error_budget_burn_rate |
| Label(标签) | 键值对,用于区分同一指标的不同维度,如 method="GET" |
sloth_service="api"、sloth_window="1h" |
| Sample(样本) | 实际数据点,包含时间戳(int64)和值(float64) | 0.05(表示 5% 的错误预算消耗率) |
关键记忆: 一个时间序列由
metric_name{label1="value1", label2="value2"} 唯一标识。SLO 计算中,我们经常通过标签来筛选特定服务或维度的数据。
3. PromQL 基础:为 SLO 计算打基础
PromQL 是 Prometheus 的查询语言。在 SLO 作业模板中,以下四个函数是核心。
3.1 rate():计算每秒增长率
rate() 专门用于处理 Counter 类型指标(如请求总数、错误总数)。它计算时间序列在指定时间窗口内的每秒平均增长率,是计算请求速率和错误速率的基石。
# 计算过去 5 分钟内,每秒的 HTTP 请求数
rate(http_requests_total[5m])
# 计算过去 5 分钟内,每秒的 HTTP 500 错误数
rate(http_requests_total{status=~"5.."}[5m])
3.2 histogram_quantile():从直方图计算分位数
Histogram(直方图) 是 SLO 中衡量延迟的关键指标类型。histogram_quantile() 函数可以从直方图的累积桶(Bucket)数据中,估算出指定分位数的值(如 p99 延迟)。
SLO 黄金用法: 通常与
rate() 结合,先计算每个桶的增长率,再计算分位数,以得到一段时间内的延迟分布。
# 计算过去 5 分钟内,p99 延迟(单位:秒)
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
3.3 其他关键函数
| 函数 | 用途 | SLO 场景 |
|---|---|---|
sum() |
聚合,对时间序列求和 | 计算总请求数、总错误数 |
increase() |
计算时间窗口内的增量(Counter 类型) | 计算窗口内的错误数,用于错误预算消耗 |
4. 核心回顾清单
- 架构: Prometheus Server 主动拉取 → 存储到 TSDB → Alertmanager 处理告警 → Grafana 展示。
- 数据模型: 时间序列由
metric{label="value"}唯一标识,SLO 计算依赖标签进行维度筛选。 - PromQL 核心:
rate():Counter 类型指标的每秒增长率,用于计算请求/错误速率。histogram_quantile():从 Histogram 估算分位数,用于计算延迟 SLO。sum()/increase():聚合与增量计算,用于错误预算消耗统计。
常见误区: 不要对 Gauge 类型指标使用
rate();计算分位数时,务必先对 _bucket 指标使用 rate() 或 increase(),再传入 histogram_quantile(),否则结果会随时间窗口累积而失真。