2. Prometheus 基础回顾:PromQL 核心语法、数据模型与指标类型

在构建网关 Pod 异常检测与自愈系统之前,必须牢固掌握 Prometheus 的三大基石:数据模型、指标类型与PromQL 查询语言。本章将系统梳理这些核心概念,为后续的告警规则编写与自动化决策打下坚实基础。

2.1 数据模型:时间序列的构成

Prometheus 将所有采集到的数据统一存储为时间序列(Time Series)。一个时间序列由以下三部分唯一标识:

  • 指标名称(Metric Name):描述被监控对象的一般含义,例如 http_requests_total、node_cpu_seconds_total。
  • 标签(Labels):一组键值对,用于对时间序列进行维度划分。例如 {method="GET", endpoint="/api/v1", status="200"}。
  • 样本值(Sample):一个 float64 类型的数值,以及一个毫秒精度的时间戳。
关键理解: 指标名称 + 标签集合 = 时间序列的唯一标识。改变任何一个标签值,都会产生一条新的时间序列。

以下表格展示了同一指标名称下,不同标签组合如何形成多条独立的时间序列:

指标名称 标签集合 当前样本值 含义
gateway_requests_total {pod="gw-1", status="200"} 1024 gw-1 Pod 的 200 请求总数
gateway_requests_total {pod="gw-1", status="500"} 15 gw-1 Pod 的 500 错误请求总数
gateway_requests_total {pod="gw-2", status="200"} 2048 gw-2 Pod 的 200 请求总数
Prometheus 时间序列数据模型 Prometheus 时间序列数据模型 指标名称 gateway_requests_total 标签集合 (Labels) {pod="gw-1", status="200"} {pod="gw-1", status="500"} 样本值 (Sample) 1024 @ 1700000000 数据模型核心公式 时间序列 = 指标名称 + 标签集合 + 样本值(数值 + 时间戳) • 指标名称:描述监控对象(如 http_requests_total) • 标签:维度划分,每个标签组合形成独立序列 • 样本:实际数值与采集时间戳

2.2 四种核心指标类型

Prometheus 客户端库提供了四种核心指标类型,每种类型服务于不同的监控场景。理解它们的差异是编写正确 PromQL 的前提。

指标类型 值特性 典型用途 PromQL 常用函数
Counter 只增不减(重启归零) 请求总数、错误总数、CPU 时间 rate(), increase()
Gauge 可增可减,反映当前状态 内存使用量、CPU 使用率、连接数 avg(), max(), min()
Histogram 分桶计数 + 总和 + 总计数 请求延迟分布、响应大小分布 histogram_quantile()
Summary 流式分位数 + 总和 + 总计数 预计算的分位数(如 p99 延迟) 直接读取 _quantile 标签
实战建议: 在网关监控中,Counter 用于统计请求量和错误量,Gauge 用于跟踪 Pod 内存/CPU 水位,Histogram 用于分析延迟分布并计算 p99/p95 分位数。

2.3 PromQL 核心语法

PromQL(Prometheus Query Language)是数据分析和告警规则的核心。以下是最常用的语法模式:

2.3.1 即时查询与范围查询

  • 即时查询(Instant Query):返回查询时间点的最新样本值。例如:gateway_requests_total{pod="gw-1"}
  • 范围查询(Range Query):返回一段时间窗口内的所有样本。例如:gateway_requests_total{pod="gw-1"}[5m]

2.3.2 常用函数与操作符

# 计算每秒请求速率(最常用)
rate(gateway_requests_total[5m])

# 计算一段时间内的增量
increase(gateway_errors_total[1h])

# 计算分位数(Histogram 专用)
histogram_quantile(0.99, rate(gateway_request_duration_seconds_bucket[5m]))

# 聚合操作:按 Pod 分组求平均 CPU 使用率
avg by(pod) (rate(container_cpu_usage_seconds_total[5m]))

# 二元运算:计算错误率
rate(gateway_errors_total[5m]) / rate(gateway_requests_total[5m]) * 100

2.3.3 向量匹配与分组

PromQL 支持 一对一、多对一 和 一对多 向量匹配,通过 on、ignoring、group_left、group_right 关键字控制。在网关异常检测中,group_left 常用于将指标与标签信息丰富的向量进行关联。

PromQL 查询执行流程 PromQL 查询执行流程 1. 数据选择 匹配指标 + 标签过滤 2. 时间窗口 即时 / 范围 [5m] 3. 函数计算 rate / increase / avg 4. 结果输出 时间序列 / 标量 / 字符串 示例:rate(gateway_errors_total{namespace="prod"}[5m]) → 先选择数据,再取 5m 窗口,最后计算速率

2.4 指标类型在网关监控中的映射

将上述概念映射到网关 Pod 监控场景,可以更直观地理解如何选择指标类型:

监控维度 推荐指标类型 PromQL 示例 异常检测用途
请求流量 Counter rate(gateway_requests_total[1m]) 流量突增/突降检测
错误率 Counter rate(gateway_errors_total[5m]) / rate(gateway_requests_total[5m]) 错误率阈值告警
内存使用 Gauge container_memory_usage_bytes{pod=~"gw-.*"} 内存泄漏 / OOM 风险
延迟分布 Histogram histogram_quantile(0.99, rate(gateway_duration_bucket[5m])) p99 延迟异常告警
连接数 Gauge gateway_active_connections 连接耗尽检测
常见误区: 不要对 Counter 类型直接使用 avg() 或 sum() 而不加 rate(),因为 Counter 是累积值,直接聚合会得到不断增长的总数,而非当前速率。始终使用 rate() 或 increase() 将 Counter 转换为每秒速率后再进行运算。

2.5 本章小结

  • 数据模型:时间序列由指标名称 + 标签 + 样本值唯一确定,标签是维度扩展的关键。
  • 指标类型:Counter 用于累积计数,Gauge 用于瞬时状态,Histogram 用于分布分析,Summary 用于预计算分位数。
  • PromQL 核心:掌握 rate()、increase()、histogram_quantile() 和聚合操作符,即可覆盖 90% 的网关异常检测场景。