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

在深入设计容器资源瓶颈预警规则之前,必须牢固掌握 Prometheus 的核心基础。本章将系统回顾 Prometheus 的整体架构、数据模型(Metric 与 Label)以及 PromQL 基础语法,为后续的预警规则编写打下坚实的技术地基。

2.1 Prometheus 整体架构

Prometheus 采用经典的拉取(Pull)模式采集指标数据,其核心组件包括 Prometheus Server、Exporter、Pushgateway、Alertmanager 以及客户端 SDK。下图展示了各组件之间的协作关系:

Prometheus 整体架构图 Prometheus 整体架构 被监控目标 容器 / 节点 / 应用 Exporter / SDK (暴露 /metrics) Pushgateway 短期任务 / 批处理 Pull /metrics Push 指标 Prometheus Server 检索器 (Retrieval) TSDB 存储引擎 HTTP API / PromQL 规则评估 (Recording/Alerting) 告警推送 告警推送 Alertmanager 去重 / 分组 / 静默 发送通知 API 查询 Grafana / UI 可视化 & 仪表盘 核心拉取模式 Prometheus Server 定期从 Exporter 或 Pushgateway 拉取指标,避免被监控端主动推送带来的稳定性风险。
架构要点:在容器环境中,Prometheus 通常通过 Kubernetes 服务发现自动找到 Pod 的 /metrics 端点,无需手动配置每个目标。这是实现大规模容器监控自动化的关键。

2.2 数据模型:Metric 与 Label

Prometheus 的所有指标数据都遵循统一的数据模型,由 Metric Name 和一组 Label 唯一标识。理解这一模型是编写精确 PromQL 查询的前提。

2.2.1 核心概念

概念 说明 示例
Metric Name 指标名称,描述被监控的语义,如 CPU 使用率、内存占用 container_cpu_usage_seconds_total
Label 键值对标签,用于区分同一指标的不同维度(如容器名、命名空间) container="nginx", namespace="prod"
Sample 时间序列中的一个数据点,包含时间戳和值 t=1700000000, v=0.85
Time Series 同一 Metric + 同一 Label 组合的样本序列 container_cpu_usage_seconds_total{container="nginx", namespace="prod"}

2.2.2 Metric 类型

Prometheus 客户端库支持四种核心指标类型,在容器资源监控中各有典型应用场景:

类型 语义 容器场景示例
Counter 只增不减的累计值,适合计数类指标 container_cpu_usage_seconds_total(CPU 累计使用时间)
Gauge 可增可减的瞬时值,适合当前状态 container_memory_working_set_bytes(当前内存使用量)
Histogram 对观测值进行分桶统计,适合延迟、大小分布 container_network_receive_bytes_total(网络接收字节分布)
Summary 类似 Histogram,但直接计算分位数 应用自定义延迟分位数(较少用于容器基础资源)
预警规则设计提示:容器 CPU 和内存瓶颈预警主要使用 Gauge 类型指标(如 container_memory_working_set_bytes),而 CPU 使用率通常通过对 Counter 类型指标(如 container_cpu_usage_seconds_total)进行 rate() 计算得到。

2.3 PromQL 基础语法

PromQL(Prometheus Query Language)是 Prometheus 内置的函数式查询语言,用于实时聚合和分析时间序列数据。以下是与容器资源预警最相关的核心语法。

2.3.1 即时向量与范围向量

  • 即时向量(Instant Vector):查询某个时间点的最新样本值。例如:container_memory_working_set_bytes{container="nginx"} 返回当前时刻所有 nginx 容器的内存使用量。
  • 范围向量(Range Vector):查询一段时间范围内的样本序列。例如:container_memory_working_set_bytes{container="nginx"}[5m] 返回过去 5 分钟内的所有样本点。

2.3.2 常用选择器与匹配符

语法 含义 示例
= 精确匹配标签值 container="nginx"
!= 排除匹配标签值 container!="nginx"
=~ 正则匹配标签值 container=~"nginx|redis"
!~ 正则排除匹配标签值 container!~"kube-.*"

2.3.3 核心聚合与运算函数

以下函数在容器资源预警规则中频繁使用:

  • rate():计算 Counter 类型指标在指定时间窗口内的每秒平均增长率。例如:rate(container_cpu_usage_seconds_total[1m]) 计算过去 1 分钟的平均 CPU 使用率(单位:核/秒)。
  • sum():对时间序列按指定维度求和。例如:sum(rate(container_cpu_usage_seconds_total[1m])) by (namespace) 按命名空间聚合 CPU 使用率。
  • avg():计算平均值,常用于求平均资源使用率。
  • topk():返回值最大的前 K 个时间序列,适合定位资源消耗最高的容器。
  • quantile():计算分位数,用于评估资源使用的分布情况。
PromQL 查询流程示例 PromQL 查询流程示例:计算容器 CPU 使用率 1. 原始 Counter container_cpu_usage_ seconds_total (累计值,只增不减) rate()[1m] 2. 速率计算 rate(...[1m]) 每秒平均 CPU 核数 (Gauge 类型结果) sum by(container) 3. 聚合结果 sum by (container) 每个容器的总 CPU (用于预警判断) 完整 PromQL 示例 sum(rate(container_cpu_usage_seconds_total{namespace="prod"}[1m])) by (container) → 返回生产命名空间中每个容器的当前 CPU 使用率(核数)

2.3.4 预警规则中的典型 PromQL 模式

在容器资源瓶颈预警中,PromQL 通常遵循以下模式:

# 模式:计算资源使用率并与阈值比较
# CPU 使用率超过 80%(假设容器限制为 1 核)
sum(rate(container_cpu_usage_seconds_total{container!=""}[1m])) by (container)
  / on(container) kube_pod_container_resource_limits_cpu_cores
  > 0.8

# 内存使用率超过 90%
container_memory_working_set_bytes{container!=""}
  / on(container) kube_pod_container_resource_limits_memory_bytes
  > 0.9
常见陷阱:在 PromQL 中,container="" 的空标签通常代表 Pod 级别的 cgroup 统计,而非具体容器。在预警规则中应使用 container!="" 过滤掉这些聚合数据,避免重复计数或误报。

2.4 本章小结

本章回顾了 Prometheus 的三大基础支柱:

  • 架构:Pull 模式、TSDB 存储、Alertmanager 告警链路,以及容器环境中的服务发现机制。
  • 数据模型:Metric + Label 唯一标识时间序列,Counter/Gauge/Histogram/Summary 四种类型各有适用场景。
  • PromQL 基础:即时向量与范围向量的区别,选择器语法,以及 rate()、sum()、topk() 等核心函数在资源预警中的典型用法。