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

在深入Runbook与CI/CD联动之前,必须牢固掌握Prometheus的核心基础。本章将系统梳理Prometheus的组件架构、数据模型设计以及PromQL查询语言的核心概念,为后续的告警规则编写、自动化响应和监控数据集成打下坚实的技术地基。

2.1 Prometheus整体架构

Prometheus采用拉取(Pull)模式采集指标,整体架构由多个松耦合组件构成,各组件职责清晰,便于水平扩展和故障隔离。

Prometheus 核心架构图 Prometheus 核心架构 被监控目标 (Jobs / Targets) /metrics 端点 服务发现 (K8s / Consul / DNS) Prometheus Server 检索器 (Retrieval) TSDB 存储引擎 HTTP API / 查询引擎 告警规则评估 记录规则 Alertmanager 去重 / 分组 / 抑制 通知 (Email / Slack / PagerDuty) 可视化 & 客户端 Grafana / API 调用 PromQL 查询 远程存储 (Thanos / Cortex) Pull /metrics 目标列表 告警推送 查询响应 远程写入
架构要点:
  • Pull 模式:Prometheus Server 主动从被监控目标的 /metrics 端点拉取指标,避免被监控端主动推送带来的网络和配置复杂性。
  • 服务发现:动态发现目标(如 Kubernetes Pod、Consul 服务),无需手动维护目标列表。
  • 告警分离:告警规则在 Server 端评估,但告警通知由独立的 Alertmanager 组件处理,支持去重、分组和静默。
  • 本地存储 + 远程扩展:默认使用本地 TSDB,可通过远程写入接口对接 Thanos、Cortex 等长期存储方案。

2.2 数据模型:指标、标签与样本

Prometheus 的数据模型是理解查询和告警的基础。所有时间序列数据由三个核心要素构成:指标名称、标签集合和样本值。

要素 说明 示例
指标名称 (Metric Name) 描述被监控指标的含义,遵循 [a-zA-Z_:][a-zA-Z0-9_:]* 格式 http_requests_total
标签 (Labels) 键值对,用于标识时间序列的维度,实现多维度数据模型 {method="GET", endpoint="/api", status="200"}
样本 (Sample) 时间戳 + 浮点数值,构成时间序列中的一个数据点 @1620000000 1024

一个完整的时间序列标识符格式为:

<metric_name>{<label_name1>="<label_value1>", <label_name2>="<label_value2>", ...}

例如:

http_requests_total{method="POST", handler="/api/v1/order", instance="10.0.0.1:8080", job="order-service"}
设计建议:标签是 Prometheus 多维度查询的核心。合理设计标签(如 method、status、endpoint)可以灵活聚合和过滤数据,但避免使用高基数标签(如 user_id、request_id),否则会导致 TSDB 性能急剧下降。

2.3 指标类型

Prometheus 客户端库提供四种核心指标类型,每种类型对应不同的使用场景和 PromQL 聚合方式。

类型 行为特征 典型用途 PromQL 常用函数
Counter 只增不减(重启时归零) 请求总数、错误计数、任务完成数 rate(), increase()
Gauge 可增可减,反映当前状态 CPU 使用率、内存占用、连接数 avg(), max(), min()
Histogram 对观测值进行分桶计数,提供 _bucket、_sum、_count 请求延迟分布、响应大小分布 histogram_quantile()
Summary 类似 Histogram,但由客户端计算分位数 预定义分位数(如 p50、p99)的延迟监控 直接读取 quantile 标签
常见误区:不要对 Counter 类型直接使用 avg() 或 sum() 查看原始值,而应使用 rate() 计算每秒增长率。Counter 的原始值只有在重启时才会归零,直接聚合会得到误导性结果。

2.4 PromQL 核心概念

PromQL(Prometheus Query Language)是 Prometheus 内置的函数式查询语言,用于实时聚合和分析时间序列数据。掌握以下核心概念是编写告警规则和自动化脚本的前提。

2.4.1 即时向量与范围向量

概念 语法 返回结果 使用场景
即时向量 (Instant Vector) http_requests_total{status="500"} 每个时间序列的最新一个样本 告警规则、Grafana 瞬时面板
范围向量 (Range Vector) http_requests_total{status="500"}[5m] 每个时间序列在最近 5 分钟内的所有样本 rate(), avg_over_time() 等聚合函数

2.4.2 常用 PromQL 函数速查

函数 适用类型 作用 示例
rate() Counter 计算时间序列在指定时间范围内的每秒平均增长率 rate(http_requests_total[5m])
increase() Counter 计算时间序列在指定时间范围内的增量 increase(http_requests_total[1h])
avg_over_time() Gauge 计算指定时间范围内所有样本的平均值 avg_over_time(node_cpu_seconds_total[10m])
histogram_quantile() Histogram 从 Histogram 的 _bucket 序列计算分位数 histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
label_replace() 任意 对标签值进行正则替换,用于标签重映射 label_replace(up, "new_instance", "$1", "instance", "(.*):.*")

2.4.3 向量匹配与操作符

PromQL 支持在即时向量之间进行算术运算和集合运算,但要求参与运算的向量具有匹配的标签集。

  • 一对一匹配 (One-to-One):默认匹配方式,要求两侧向量具有完全相同的标签集合。
  • 多对一 / 一对多匹配 (Many-to-One / One-to-Many):使用 on() 或 ignoring() 指定匹配标签,结合 group_left() / group_right() 实现。
# 一对一:计算每个实例的 CPU 使用率
rate(node_cpu_seconds_total{mode="idle"}[5m])

# 多对一:将不同 mode 的 CPU 时间相加,按 instance 分组
sum by (instance) (rate(node_cpu_seconds_total[5m]))
PromQL 查询处理流程 PromQL 查询处理流程 1. 查询解析 词法/语法分析 2. 数据检索 TSDB 读取样本 3. 函数计算 rate / sum / avg 4. 结果返回 即时/范围向量 关键说明 范围向量必须配合 rate()、avg_over_time() 等函数使用 即时向量可直接用于告警规则表达式(如 http_requests_total > 100)

2.5 本章小结

  • Prometheus 采用 Pull 架构,核心组件包括 Server、TSDB、Alertmanager 和各类 Exporter。
  • 数据模型以 指标名称 + 标签集合 唯一标识一个时间序列,样本由时间戳和浮点值组成。
  • 四种指标类型(Counter、Gauge、Histogram、Summary)各有适用场景,选择错误会导致查询结果失真。
  • PromQL 的核心在于区分 即时向量 和 范围向量,并熟练使用 rate()、increase()、histogram_quantile() 等关键函数。
  • 向量匹配规则决定了多指标联合查询的正确性,on()、ignoring() 和 group_left() 是高级查询的必备工具。