2. Prometheus 基础回顾:架构、数据模型与 Metric 类型
在深入设计容器运行时容量预警规则之前,必须牢固掌握 Prometheus 的核心基础。本章将系统回顾 Prometheus 的架构组件、数据模型以及四种核心 Metric 类型(Counter、Gauge、Histogram、Summary),为后续的规则编写和容量分析奠定坚实的理论基础。
2.1 Prometheus 整体架构
Prometheus 采用经典的拉取(Pull)模式采集指标,整体架构由以下核心组件构成:
核心架构要点: Prometheus Server 主动从 Targets(如容器运行时、Node Exporter)拉取指标数据,存储于本地时序数据库(TSDB),并通过 PromQL 查询对外暴露数据。Alertmanager 负责处理告警,Grafana 等工具负责可视化。
2.2 数据模型
Prometheus 的所有数据都遵循统一的时序数据模型,由 Metric Name 和 Labels 唯一标识。
| 组件 | 说明 | 示例 |
|---|---|---|
| Metric Name | 指标名称,描述被监控量的含义 | container_memory_usage_bytes |
| Labels | 键值对标签,用于维度区分和过滤 | container="nginx", pod="web-1" |
| Sample | 实际数据点,包含时间戳和值 | t=1700000000, v=104857600 |
| Time Series | 同一 Metric + Labels 组合的样本序列 | 所有 container_memory_usage_bytes{container="nginx"} 的样本 |
设计预警时的关键点: 在编写 PromQL 规则时,必须精确利用 Labels 来限定目标容器或 Pod。例如,
container_memory_usage_bytes{container!="POD", namespace="production"} 可以排除 Pause 容器并限定生产命名空间。
2.3 Metric 类型详解
Prometheus 客户端库提供四种核心 Metric 类型,理解它们的语义是编写正确预警规则的前提。
2.3.1 Counter(计数器)
Counter 只增不减(除非系统重启),适用于累计型指标,如请求总数、错误总数、CPU 时间片总数。
- 典型场景: HTTP 请求总数、容器重启次数、磁盘写入字节数。
- 预警用法: 使用
rate()或increase()函数计算速率或增量。 - 示例:
rate(container_cpu_usage_seconds_total[5m])计算 5 分钟内 CPU 使用率。
2.3.2 Gauge(仪表盘)
Gauge 可增可减,反映当前状态值,适用于瞬时量指标,如内存使用量、队列深度、温度。
- 典型场景: 容器内存使用量、当前活跃连接数、磁盘使用率。
- 预警用法: 直接与阈值比较,或使用
avg_over_time()等聚合函数平滑波动。 - 示例:
container_memory_usage_bytes{container="app"} > 1e9触发内存超限告警。
2.3.3 Histogram(直方图)
Histogram 对观测值进行分桶(Bucket)计数,同时记录总和与总数,适用于分布分析,如请求延迟、响应大小。
- 典型场景: 容器运行时请求延迟分布、HTTP 响应时间。
- 预警用法: 使用
histogram_quantile()计算分位数(如 P99 延迟)。 - 示例:
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))计算 P99 延迟。
2.3.4 Summary(摘要)
Summary 在客户端直接计算分位数,并暴露分位数、总和与总数,适用于预计算分位数的场景。
- 典型场景: 需要精确分位数且无法在服务端计算时,如某些业务延迟指标。
- 预警用法: 直接使用暴露的分位数指标,无需
histogram_quantile()函数。 - 示例:
rpc_duration_seconds{quantile="0.99"}直接获取 P99 延迟。
2.4 关键概念总结表
| 概念 | 核心特征 | 容量预警中的典型应用 |
|---|---|---|
| Pull 模式 | Server 主动拉取,配置即服务发现 | 无需容器主动推送,降低入侵性 |
| Labels 维度 | 多标签组合唯一标识时间序列 | 按 namespace、container、pod 分组预警 |
| Counter + rate() | 计算每秒增长率 | CPU 使用率、网络 I/O 速率 |
| Gauge + 阈值 | 直接比较当前值 | 内存使用量、磁盘使用率、OOM 状态 |
| Histogram + 分位数 | 服务端计算延迟分布 | 容器运行时 P99 延迟告警 |
常见误区: 不要对 Counter 类型直接使用
> 比较,因为 Counter 值会持续增长,直接比较没有意义。必须使用 rate() 或 increase() 转换为速率后再设置阈值。同样,对 Gauge 类型不要使用 rate(),否则会丢失瞬时状态信息。