2. Prometheus 基础回顾:架构、数据模型与 PromQL 基础
在深入告警规则与状态一致性故障排查之前,必须牢固掌握 Prometheus 的核心基础。本节将系统回顾 Prometheus 的拉取架构、核心数据模型以及 PromQL 查询语言的基本用法,为后续章节的故障分析建立共同语言。
2.1 Prometheus 整体架构
Prometheus 采用 拉取(Pull) 模式采集指标,区别于传统的推送(Push)模式。这种设计使得监控系统对目标状态具有主动控制权,是保障数据一致性的关键前提。
架构要点:
- Pull 模式:Prometheus Server 主动从目标
/metrics端点拉取数据,避免因目标端推送失败导致数据丢失。 - 服务发现:动态获取监控目标列表,支持 Kubernetes、Consul、文件等多种发现机制。
- 告警规则评估:在 Server 内部周期性执行 PromQL 表达式,当条件持续满足时生成告警并推送至 Alertmanager。
2.2 数据模型:Metric、Label、Sample
Prometheus 存储的所有时间序列数据由三个核心元素唯一标识:指标名(Metric)、标签(Label) 和 样本(Sample)。理解这三者的关系是编写正确告警规则的基础。
| 元素 | 说明 | 示例 |
|---|---|---|
| Metric | 指标名称,描述被监控量的含义,遵循 namespace_metricname 命名规范。 |
http_requests_total |
| Label | 键值对标签,用于对同一指标进行多维细分。每个时间序列由指标名 + 标签集合唯一确定。 | {method="GET", endpoint="/api", status="200"} |
| Sample | 时间戳 + 浮点数值,构成时间序列中的一个数据点。 | @1620000000 1024.5 |
关键概念: 标签是 Prometheus 实现多维监控的核心。例如
http_requests_total{method="POST", status="500"} 与 http_requests_total{method="GET", status="200"} 是两个完全不同的时间序列。在告警规则中,必须精确控制标签匹配,避免因标签爆炸导致规则评估错误。
2.3 PromQL 基础
PromQL(Prometheus Query Language)是 Prometheus 内置的数据查询和聚合语言。告警规则本质上就是一段 PromQL 表达式,因此掌握 PromQL 是编写可靠告警规则的前提。
2.3.1 数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| Instant Vector | 一组时间序列,每个序列包含一个最新样本。 | node_cpu_seconds_total |
| Range Vector | 一组时间序列,每个序列包含一段时间范围内的多个样本。 | node_cpu_seconds_total[5m] |
| Scalar | 单一的浮点数值。 | 1024 |
| String | 字符串值,使用较少。 | "warning" |
2.3.2 常用选择器与操作符
# 标签精确匹配
http_requests_total{method="GET", status="200"}
# 标签正则匹配(=~ 匹配正则,!~ 排除正则)
http_requests_total{method=~"GET|POST", status!~"5.."}
# 范围查询:过去5分钟的数据
http_requests_total[5m]
# 偏移查询:1小时前的数据
http_requests_total offset 1h
# 聚合操作:按 method 分组求和
sum by (method) (http_requests_total)
# 速率计算:计算每秒增长率
rate(http_requests_total[5m])
# 比较操作符:触发条件判断
rate(http_requests_total[5m]) > 100
2.3.3 告警规则中的 PromQL 模式
在告警规则中,PromQL 表达式必须返回一个 Instant Vector,且每个返回的样本值代表告警的严重程度或触发阈值。以下是一个典型的告警规则结构:
groups:
- name: example_alerts
rules:
- alert: HighRequestLatency
expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 1.0
for: 5m
labels:
severity: critical
annotations:
summary: "High request latency detected"
常见陷阱:
- 标签不一致:PromQL 表达式中的标签必须与告警规则中的
labels和annotations模板变量一致,否则告警信息可能为空或错误。 - 范围向量误用:告警规则
expr中不能直接使用范围向量(如[5m]),必须通过rate、increase等函数转换为 Instant Vector。 - 聚合粒度:使用
by或without聚合时,确保保留必要的标签维度,避免丢失故障定位所需的关键信息。
核心流程:
- PromQL 引擎从 TSDB 中读取原始时间序列数据。
- 根据告警规则中的
expr执行选择、聚合和计算,生成 Instant Vector 结果。 - 将结果与阈值进行比较,结合
for持续时间判断是否触发告警。 - 满足条件后生成告警实例,状态从 Pending 转为 Firing。