Prometheus 核心回顾:架构、数据模型与 PromQL 基础

在构建 SLO 监控体系之前,必须牢固掌握 Prometheus 的核心概念。本节将系统回顾 Prometheus 的拉取架构、核心数据模型以及 SLO 计算中最高频使用的 PromQL 函数,为后续的 SLO 计算与告警规则编写打下坚实基础。

1. Prometheus 架构:拉取模型与核心组件

Prometheus 采用主动拉取(Pull)的监控架构,区别于传统的推送模型。这种设计使得监控系统对目标实例的可用性感知更加直接,且易于在内部网络进行控制。

架构要点: Prometheus Server 通过服务发现或静态配置,定期从 Exporter 或应用自身暴露的 HTTP 端点(/metrics)拉取指标数据。Alertmanager 负责处理告警,Grafana 等工具负责可视化。
Prometheus 核心架构(拉取模型) 被监控目标 Exporter / 应用 /metrics 端点 服务发现 / 静态配置 Prometheus Server 拉取指标 存储(TSDB) PromQL 查询引擎 拉取 /metrics Alertmanager 告警路由 / 抑制 / 静默 Grafana / API 可视化 / 查询

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 类型) 计算窗口内的错误数,用于错误预算消耗
PromQL 在 SLO 计算中的数据流 原始指标 http_requests_total http_request_duration_seconds_bucket PromQL 处理 rate() histogram_quantile() sum() / increase() SLO 计算指标 slo:requests_total slo:errors_total slo:latency_p99 输出指标通常带有 slo: 前缀 用于后续错误预算计算

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(),否则结果会随时间窗口累积而失真。