2. Prometheus 基础回顾:架构、数据模型与 PromQL 基础

在深入告警规则与状态一致性故障排查之前,必须牢固掌握 Prometheus 的核心基础。本节将系统回顾 Prometheus 的拉取架构、核心数据模型以及 PromQL 查询语言的基本用法,为后续章节的故障分析建立共同语言。

2.1 Prometheus 整体架构

Prometheus 采用 拉取(Pull) 模式采集指标,区别于传统的推送(Push)模式。这种设计使得监控系统对目标状态具有主动控制权,是保障数据一致性的关键前提。

Prometheus 核心架构(Pull 模式) 被监控目标 /metrics 端点 (Exporter / App) 服务发现 k8s / consul / file Prometheus Server 检索器 (Retrieval) TSDB 存储 HTTP API / PromQL 告警规则评估 Alertmanager 去重 / 分组 / 路由 Grafana / API Pull /metrics 目标列表 告警推送 查询
架构要点:
  • 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 存储 时间序列数据 PromQL 引擎 解析 / 选择 / 聚合 / 计算 告警规则 条件判断 expr + for 告警实例 Pending / Firing
核心流程:
  1. PromQL 引擎从 TSDB 中读取原始时间序列数据。
  2. 根据告警规则中的 expr 执行选择、聚合和计算,生成 Instant Vector 结果。
  3. 将结果与阈值进行比较,结合 for 持续时间判断是否触发告警。
  4. 满足条件后生成告警实例,状态从 Pending 转为 Firing。