2. Prometheus 基础回顾:架构、数据模型与 Metric 类型

在深入设计容器运行时容量预警规则之前,必须牢固掌握 Prometheus 的核心基础。本章将系统回顾 Prometheus 的架构组件、数据模型以及四种核心 Metric 类型(Counter、Gauge、Histogram、Summary),为后续的规则编写和容量分析奠定坚实的理论基础。

2.1 Prometheus 整体架构

Prometheus 采用经典的拉取(Pull)模式采集指标,整体架构由以下核心组件构成:

核心架构要点: Prometheus Server 主动从 Targets(如容器运行时、Node Exporter)拉取指标数据,存储于本地时序数据库(TSDB),并通过 PromQL 查询对外暴露数据。Alertmanager 负责处理告警,Grafana 等工具负责可视化。
Prometheus 核心架构 监控目标 (Targets) 容器运行时 (cAdvisor) Node Exporter Kubelet / 业务应用 Prometheus Server 检索器 (Retrieval) 时序数据库 (TSDB) HTTP Server (PromQL) 告警评估 (Alerting) 数据消费端 Grafana 仪表盘 Alertmanager API / 自动化工具 Pull (HTTP) Query / Push Alertmanager 去重 / 分组 / 静默 / 通知 远程存储 Thanos / Cortex / M3DB 告警推送 远程写

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 延迟。
四种 Metric 类型对比 Counter 只增不减 累计型指标 需配合 rate() 使用 Gauge 可增可减 瞬时状态值 直接阈值比较 Histogram 分桶计数 服务端计算分位数 需 histogram_quantile() Summary 客户端预计算 直接暴露分位数 无需额外函数 容量预警场景中的类型选择建议 • 容器 CPU 使用率 → Counter(通过 rate() 计算) • 容器内存 / 磁盘使用量 → Gauge(直接阈值告警) • 容器运行时请求延迟 → Histogram(计算 P99/P95 分位数) • 预计算延迟分位数(如业务 SLA)→ Summary(直接使用 quantile 标签)

2.4 关键概念总结表

概念 核心特征 容量预警中的典型应用
Pull 模式 Server 主动拉取,配置即服务发现 无需容器主动推送,降低入侵性
Labels 维度 多标签组合唯一标识时间序列 按 namespace、container、pod 分组预警
Counter + rate() 计算每秒增长率 CPU 使用率、网络 I/O 速率
Gauge + 阈值 直接比较当前值 内存使用量、磁盘使用率、OOM 状态
Histogram + 分位数 服务端计算延迟分布 容器运行时 P99 延迟告警
常见误区: 不要对 Counter 类型直接使用 > 比较,因为 Counter 值会持续增长,直接比较没有意义。必须使用 rate() 或 increase() 转换为速率后再设置阈值。同样,对 Gauge 类型不要使用 rate(),否则会丢失瞬时状态信息。