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 数据模型的核心结构,以及四种指标类型在时间序列中的定位:

Prometheus 数据模型与核心指标类型 Metric(指标名) Label(标签键值对) Sample(样本值+时间戳) 唯一时间序列:metric{label="value"} 四种核心指标类型 Counter 只增不减 请求总数、错误次数 Gauge 可增可减 内存、CPU、连接数 Histogram 分桶计数 延迟分布、P99 Summary 预计算分位数 客户端分位数 核心原则 Counter 必须配合 rate() 使用;Gauge 可直接告警;Histogram 支持服务端分位数计算;Summary 分位数固定不可聚合

1.5 指标类型选择决策流程

在实际监控和告警设计中,选择正确的指标类型可以遵循以下步骤:

  1. 确定数据性质: 数据是累积计数(如总请求数)还是瞬时快照(如当前内存)?累积计数选 Counter,瞬时快照选 Gauge。
  2. 是否需要分布统计: 如果需要计算 P50/P90/P99 等百分位数,选择 Histogram 或 Summary。
  3. 是否需要服务端聚合: 如果需要在告警规则中动态调整分位数阈值,或需要跨实例聚合,选择 Histogram。如果分位数固定且无需聚合,选择 Summary。
  4. 验证 PromQL 兼容性: 确认所选指标类型与预期的告警函数兼容。例如,Counter 必须使用 rate() 或 increase(),不能直接比较原始值。
实战案例: 监控 HTTP 请求延迟。使用 Histogram 类型暴露 http_request_duration_seconds,在告警规则中通过 histogram_quantile(0.99, rate(...)) 计算 P99 延迟。这样可以在不修改应用代码的情况下,随时调整告警的分位数阈值。