2. Prometheus 架构回顾:核心组件与数据流
在深入成本分摊与归因之前,必须先厘清 Prometheus 的架构。只有理解数据从产生、采集、存储到告警的完整链路,才能精准定位成本归属。Prometheus 采用 拉取(Pull) 为主的架构,辅以 推送(Push) 机制,整体由五个核心组件构成。
2.1 核心组件一览
| 组件 | 角色 | 成本归因关键点 |
|---|---|---|
| Prometheus Server | 核心调度与存储引擎 | CPU/内存消耗大户,直接决定采集与查询成本 |
| TSDB | 时序数据存储引擎 | 磁盘 I/O 与存储空间成本,与样本基数强相关 |
| Exporter | 目标系统指标暴露器 | 每个 Exporter 产生独立指标集,是成本分摊的最小粒度 |
| Pushgateway | 短任务指标中转器 | 临时任务成本容易遗漏,需单独标记 |
| Alertmanager | 告警路由与去重 | 告警数量与通知渠道产生间接成本 |
2.2 组件详解与数据流
2.2.1 Prometheus Server
Prometheus Server 是整个系统的 大脑。它负责:
- 服务发现与目标管理:通过 Kubernetes、Consul、文件等方式动态发现采集目标。
- 指标拉取(Scrape):按配置的时间间隔(如 15s)向 Exporter 或 Pushgateway 发起 HTTP 请求。
- 数据写入 TSDB:将拉取到的样本数据写入本地磁盘。
- 查询与聚合:对外提供 PromQL 查询接口,支持实时查询与历史回溯。
成本视角: Prometheus Server 的 CPU 消耗与 采集目标数量 和 查询并发度 成正比。内存消耗则与 活跃时间序列数 强相关。在成本分摊时,Server 的资源消耗通常按 指标数量 或 采集目标数 进行二次分配。
2.2.2 TSDB(时序数据库)
TSDB 是 Prometheus 的 存储核心,负责高效写入和压缩时序数据。其关键特性包括:
- Block 结构:数据按时间窗口(默认 2 小时)切分为不可变的 Block,每个 Block 包含 index、chunks、meta.json 等文件。
- 压缩与合并:后台定期对 Block 进行压缩(Compaction),减少文件数量,提升查询效率。
- WAL(Write-Ahead Log):先写日志再落盘,保证数据可靠性。
成本归因技巧: TSDB 的磁盘空间消耗 = 样本数 × 样本大小(约 1-2 字节/样本)。通过
rate(prometheus_tsdb_storage_blocks_bytes) 可以估算每个 Job 的存储成本。
2.2.3 Exporter
Exporter 是 数据源头,负责将目标系统的内部状态转换为 Prometheus 可识别的指标格式。常见的 Exporter 包括:
- Node Exporter:主机级指标(CPU、内存、磁盘、网络)。
- cAdvisor:容器级指标(Kubernetes 容器资源使用)。
- Blackbox Exporter:网络探测指标(HTTP、TCP、ICMP)。
- Kube-State-Metrics:Kubernetes 对象状态指标(Deployment、Pod、Service)。
避坑指南: 每个 Exporter 暴露的指标数量差异巨大。Node Exporter 约 500-800 个指标,而 Kube-State-Metrics 可能产生 3000+ 个指标。在成本分摊时,必须按 实际暴露的指标数量 而非 Exporter 实例数进行分摊,否则会导致严重偏差。
2.2.4 Pushgateway
Pushgateway 用于采集 短生命周期任务(如批处理作业、CronJob)的指标。这些任务无法等待 Prometheus 来拉取,因此主动将指标推送到 Pushgateway,再由 Prometheus 统一拉取。
- 适用场景:CI/CD 流水线、数据 ETL 任务、一次性脚本。
- 成本陷阱:Pushgateway 中的指标不会自动过期,容易造成 指标残留,导致存储成本虚高。
成本归因建议: 为 Pushgateway 中的指标添加
job 和 task_id 标签,并设置合理的 push_time_seconds 过期策略。定期清理超过 1 小时未更新的指标,避免“僵尸指标”占用存储。
2.2.5 Alertmanager
Alertmanager 负责处理 Prometheus Server 发出的告警,执行 去重、分组、静默、抑制 和 通知 等操作。虽然它不直接产生指标,但告警的频繁触发会间接增加 Prometheus Server 的查询负载和通知渠道的成本(如 PagerDuty、Slack 的 API 调用费用)。
2.3 数据流全景
下图展示了 Prometheus 从指标采集到告警通知的完整数据流,以及每个环节的成本归属点。
2.4 数据流关键路径
- 指标暴露:Exporter 或 Pushgateway 在
/metrics端点暴露指标数据。 - 服务发现与拉取:Prometheus Server 根据配置发现目标,发起 HTTP GET 请求拉取指标。
- 数据写入:Server 将拉取到的样本写入 TSDB 的 WAL,随后异步落盘为 Block。
- 告警评估:Server 根据
rules配置定期评估告警规则,触发时发送到 Alertmanager。 - 告警通知:Alertmanager 对告警进行分组、去重后,通过配置的接收器发送通知。
- 查询与展示:用户通过 PromQL 查询 TSDB 数据,Grafana 等可视化工具展示结果。
2.5 成本归因核心原则
| 成本类型 | 产生组件 | 分摊依据 |
|---|---|---|
| 采集成本 | Prometheus Server | Scrape 目标数 × 采集频率 |
| 存储成本 | TSDB | 活跃时间序列数 × 保留时长 |
| 查询成本 | Prometheus Server | 查询并发数 × 查询时间范围 |
| 告警成本 | Alertmanager | 告警规则数 × 触发频率 |
| 网络成本 | 所有组件 | 跨区域拉取 / 远程写入流量 |
实战要点: 在成本分摊实践中,标签(Label) 是连接 Prometheus 架构与成本归因的桥梁。每个指标都携带
job、instance、namespace 等标签,这些标签天然可以作为成本分摊的维度。后续章节将详细讲解如何利用标签实现精细化的成本归因。