1. PromQL 基础入门:Prometheus 数据模型与核心指标类型
在编写精准告警表达式之前,必须深刻理解 Prometheus 的数据模型。PromQL 的所有操作都围绕 Metric(指标)、Label(标签) 和 Sample(样本) 这三个核心概念展开。同时,四种核心指标类型决定了数据的行为模式,直接影响告警逻辑的设计。
1.1 数据模型三要素
Prometheus 存储的所有时间序列数据都由以下三个部分唯一标识:
| 要素 | 定义 | 示例 |
|---|---|---|
| Metric(指标名) | 描述被监控对象的一般特征,如 HTTP 请求总数、CPU 使用率。 | http_requests_total |
| Label(标签) | 键值对,用于对同一指标进行多维度的细分,如按方法、状态码、实例区分。 | method="GET", status="200" |
| Sample(样本) | 实际的时间序列数据点,包含一个 float64 值和一个毫秒精度的时间戳。 | 1289 @ 1710000000.123 |
关键理解: 一个完整的时间序列由
metric_name{label1="value1", label2="value2"} 唯一确定。改变任何一个标签值,都会产生一个新的时间序列。
1.2 四种核心指标类型
Prometheus Client 库提供了四种核心指标类型。理解它们的语义差异,是编写正确 PromQL 和告警规则的前提。
| 类型 | 行为特征 | 典型值 | 适用场景 |
|---|---|---|---|
| Counter | 只增不减(除非系统重启重置为 0) | 请求总数、任务完成数、错误发生次数 | 累积计数类监控,如 QPS、错误率、API 调用量 |
| Gauge | 可增可减,反映当前瞬时状态 | 内存使用量、CPU 温度、当前连接数 | 快照值监控,如资源利用率、队列长度 |
| Histogram | 对观测值进行分桶计数,提供 _bucket、_sum、_count |
请求延迟分布、响应大小分布 | 需要计算百分位数(如 P99)或分布统计 |
| Summary | 类似 Histogram,但由客户端预计算分位数 | 请求延迟的 P50/P90/P99 | 已知分位数需求,且无法在服务端聚合的场景 |
常见误区: 对 Counter 类型直接使用
avg() 或 max() 通常没有意义。必须使用 rate() 或 increase() 函数将其转换为每秒速率或增量,才能反映真实变化趋势。
1.3 指标类型与 PromQL 函数映射
不同的指标类型在 PromQL 中有对应的推荐操作函数,错误的函数选择会导致告警表达式失效或产生误导性结果。
- Counter → 必须使用
rate()(计算每秒平均增长率)或increase()(计算时间窗口内的增量)。 - Gauge → 直接使用原始值,常用函数包括
avg()、max()、min()、delta()(计算差值)。 - Histogram → 使用
histogram_quantile()计算分位数,或通过rate()计算各桶的请求比例。 - Summary → 直接暴露
quantile标签,无需额外计算函数,但无法在服务端进行聚合。
告警设计建议: 对于延迟类告警,优先使用 Histogram 而非 Summary。因为 Histogram 允许在告警规则中动态调整分位数阈值,而 Summary 的分位数在客户端固定,无法在服务端灵活修改。
1.4 数据模型与指标类型关系图
下图展示了 Prometheus 数据模型的核心结构,以及四种指标类型在时间序列中的定位:
1.5 指标类型选择决策流程
在实际监控和告警设计中,选择正确的指标类型可以遵循以下步骤:
- 确定数据性质: 数据是累积计数(如总请求数)还是瞬时快照(如当前内存)?累积计数选 Counter,瞬时快照选 Gauge。
- 是否需要分布统计: 如果需要计算 P50/P90/P99 等百分位数,选择 Histogram 或 Summary。
- 是否需要服务端聚合: 如果需要在告警规则中动态调整分位数阈值,或需要跨实例聚合,选择 Histogram。如果分位数固定且无需聚合,选择 Summary。
- 验证 PromQL 兼容性: 确认所选指标类型与预期的告警函数兼容。例如,Counter 必须使用
rate()或increase(),不能直接比较原始值。
实战案例: 监控 HTTP 请求延迟。使用 Histogram 类型暴露
http_request_duration_seconds,在告警规则中通过 histogram_quantile(0.99, rate(...)) 计算 P99 延迟。这样可以在不修改应用代码的情况下,随时调整告警的分位数阈值。