3. 指标成本模型:时间序列基数、样本数量、标签基数对存储成本的影响

在 Prometheus 成本分摊体系中,指标存储成本是最直观、最容易被量化的成本项。然而,许多团队在初次核算时,往往只关注“指标数量”,忽略了背后真正驱动存储开销的三个核心变量:时间序列基数、样本数量和标签基数。本节将拆解这三者如何相互作用,并给出成本归因的计算模型。

3.1 三个核心概念的定义与关系

在深入成本模型之前,必须先厘清这三个术语在 Prometheus 数据模型中的精确含义:

概念 定义 成本影响
时间序列基数 同一指标名下,由所有标签组合产生的唯一时间序列总数。 直接决定存储索引大小和内存开销。
样本数量 每个时间序列在时间窗口内采集的数据点个数(= 采集频率 × 时间窗口)。 直接决定磁盘存储空间和查询扫描量。
标签基数 单个标签键(label key)下不同标签值的数量。 高基数标签是时间序列基数膨胀的根源。

核心公式: 时间序列基数 = 所有标签键的基数乘积(笛卡尔积)。例如,指标 http_requests_total 有 3 个标签:method(4 种)、status(5 种)、endpoint(10 种),则时间序列基数 = 4 × 5 × 10 = 200。

3.2 存储成本分解模型

Prometheus 的存储成本可以拆解为三个层次,每个层次对应不同的资源消耗:

  1. 内存成本(WAL + 最近数据块):与时间序列基数强相关。每个活跃序列在内存中维护一个样本缓冲区,基数越高,内存占用越大。
  2. 磁盘成本(持久化块):与样本数量强相关。每个样本在磁盘上占用固定字节(通常约 1-2 字节/样本,含压缩),样本总量 = 基数 × 采集频率 × 保留时间。
  3. 查询成本(CPU + IO):与标签基数和样本数量共同相关。高基数标签导致索引膨胀,查询时需要扫描更多倒排索引条目。

成本归因经验法则: 80% 的存储成本通常由不到 20% 的高基数指标贡献。优先治理那些标签组合爆炸的指标,成本下降效果最显著。

3.3 时间序列基数对存储成本的影响(SVG 图)

下图展示了时间序列基数如何通过内存和磁盘两个路径影响总存储成本。基数每增加一个数量级,内存开销近似线性增长,而磁盘开销则因压缩算法呈现亚线性增长,但总体仍不可忽视。

时间序列基数对存储成本的影响路径 时间序列基数 → 存储成本影响路径 时间序列基数 (标签组合总数) 内存路径 WAL 缓冲区 (每个序列 1 行) 磁盘路径 持久化块 (压缩后样本) 总存储成本 内存成本 + 磁盘成本 + 查询成本 💡 关键洞察: 基数每增加 10 倍,内存成本约增加 8-10 倍(线性);磁盘成本约增加 3-5 倍(受压缩算法抑制)。 因此,控制基数对降低内存成本的效果远大于磁盘成本。

3.4 样本数量与保留策略的成本计算

样本数量是存储成本中另一个可精确计算的变量。给定一个指标的时间序列基数 N,采集间隔 I(秒),保留时间 R(天),则总样本数公式为:

总样本数 = N × (R × 86400 / I)

示例:
- 基数 N = 10,000
- 采集间隔 I = 15s
- 保留时间 R = 30 天
总样本数 = 10,000 × (30 × 86400 / 15) = 10,000 × 172,800 = 1,728,000,000(约 17.28 亿样本)

⚠️ 常见误区: 很多团队只关注“指标个数”(如 500 个指标),却忽略了每个指标下的时间序列基数。一个看似只有 10 个指标的应用,如果每个指标都带有 user_id(10 万用户),则实际时间序列数 = 10 × 100,000 = 100 万,存储成本远超预期。

3.5 标签基数:成本膨胀的放大器

标签基数是时间序列基数膨胀的根本驱动力。以下表格对比了不同标签基数场景下的成本差异:

场景 标签组合 时间序列基数 月存储成本(估算)
低基数 method(4) × status(5) × endpoint(10) 200 ≈ $0.5
中基数 method(4) × status(5) × endpoint(100) 2,000 ≈ $5
高基数 method(4) × status(5) × user_id(100,000) 2,000,000 ≈ $5,000+

从上表可以看出,当引入高基数标签(如 user_id、request_id、ip)时,成本呈指数级增长。这是 Prometheus 成本分摊中最需要警惕的“成本陷阱”。

3.6 成本归因模型:从指标到团队

将上述三个变量整合,可以得到一个可操作的指标级成本归因公式:

指标存储成本 = 时间序列基数 × 样本大小 × 保留因子 × 单位存储价格

其中:
- 时间序列基数 = ∏(每个标签键的基数)
- 样本大小 = 采集间隔决定的单样本字节数(压缩后约 1.5 字节)
- 保留因子 = 保留天数 / 默认保留天数(如 15 天为基准)
- 单位存储价格 = 集群总存储成本 / 总样本数(或总基数)

实战建议: 在成本分摊平台中,建议按以下优先级进行归因:

  1. 先按团队/命名空间聚合:通过 namespace 或 team 标签划分成本归属。
  2. 再按指标维度分解:识别每个团队内的高基数指标,计算其存储成本占比。
  3. 最后输出成本报告:展示 Top N 高成本指标,并给出优化建议(如降低采集频率、移除高基数标签)。

3.7 成本优化策略总结(SVG 图)

基于上述模型,我们可以从三个维度制定成本优化策略。下图总结了针对每个核心变量的具体措施及其预期效果:

指标存储成本优化策略三维度 指标存储成本优化策略三维度 维度一:控制基数 • 移除高基数标签(user_id 等) • 使用记录规则聚合降维 • 设置标签白名单/黑名单 • 预期效果:内存成本 ↓ 80% 维度二:降低样本量 • 延长采集间隔(15s → 30s) • 缩短保留时间(30d → 15d) • 使用远程存储归档冷数据 • 预期效果:磁盘成本 ↓ 50% 维度三:优化标签 • 标签值标准化(减少冗余) • 避免动态标签(如 timestamp) • 使用 __tmp 前缀标记临时标签 • 预期效果:查询成本 ↓ 60% 综合成本优化目标 三维联动,总存储成本可降低 60% - 80%

3.8 本节小结

  • 时间序列基数是存储成本的第一驱动因素,由标签组合的笛卡尔积决定。
  • 样本数量由基数、采集频率和保留时间共同决定,直接影响磁盘空间。
  • 标签基数是成本膨胀的放大器,高基数标签(如 user_id)是成本治理的首要目标。
  • 成本归因模型应基于“指标 → 时间序列 → 样本”的层级进行分摊,并最终映射到团队或应用。
  • 优化策略应同时从控制基数、降低样本量、优化标签三个维度入手,实现成本效益最大化。