2. Prometheus 基础回顾:架构、数据模型与 PromQL 语法
在深入设计容器资源瓶颈预警规则之前,必须牢固掌握 Prometheus 的核心基础。本章将系统回顾 Prometheus 的整体架构、数据模型(Metric 与 Label)以及 PromQL 基础语法,为后续的预警规则编写打下坚实的技术地基。
2.1 Prometheus 整体架构
Prometheus 采用经典的拉取(Pull)模式采集指标数据,其核心组件包括 Prometheus Server、Exporter、Pushgateway、Alertmanager 以及客户端 SDK。下图展示了各组件之间的协作关系:
架构要点:在容器环境中,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():计算分位数,用于评估资源使用的分布情况。
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()等核心函数在资源预警中的典型用法。