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 请求总数 |
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 常用于将指标与标签信息丰富的向量进行关联。
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% 的网关异常检测场景。