2. Prometheus基础回顾:架构、数据模型与PromQL核心概念
在深入Runbook与CI/CD联动之前,必须牢固掌握Prometheus的核心基础。本章将系统梳理Prometheus的组件架构、数据模型设计以及PromQL查询语言的核心概念,为后续的告警规则编写、自动化响应和监控数据集成打下坚实的技术地基。
2.1 Prometheus整体架构
Prometheus采用拉取(Pull)模式采集指标,整体架构由多个松耦合组件构成,各组件职责清晰,便于水平扩展和故障隔离。
架构要点:
- 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]))
2.5 本章小结
- Prometheus 采用 Pull 架构,核心组件包括 Server、TSDB、Alertmanager 和各类 Exporter。
- 数据模型以 指标名称 + 标签集合 唯一标识一个时间序列,样本由时间戳和浮点值组成。
- 四种指标类型(Counter、Gauge、Histogram、Summary)各有适用场景,选择错误会导致查询结果失真。
- PromQL 的核心在于区分 即时向量 和 范围向量,并熟练使用
rate()、increase()、histogram_quantile()等关键函数。 - 向量匹配规则决定了多指标联合查询的正确性,
on()、ignoring()和group_left()是高级查询的必备工具。