4. 聚合操作符详解:sum、avg、min、max、count、stddev、stdvar 在误差预算中的应用场景

误差预算(Error Budget)台账的核心是对多个服务、多个维度(如可用性、延迟、错误率)的指标进行汇总与偏差分析。PromQL 的聚合操作符是构建这些台账的基石。本章将逐一拆解 sum、avg、min、max、count、stddev、stdvar 在误差预算场景下的具体用法与选型依据。

4.1 聚合操作符与误差预算的映射关系

不同的聚合操作符服务于不同的台账分析目标。下表总结了各操作符在误差预算中的典型角色:

操作符 台账用途 典型场景
sum 总量汇总 计算全局错误总数、总请求量、总消耗预算
avg 平均水位 评估平均延迟、平均错误率、平均资源利用率
min 最低水位 / 最佳表现 找出最低延迟路径、最低错误率的服务实例
max 峰值 / 瓶颈 识别最大延迟、最高错误率、预算消耗峰值
count 实例计数 / 维度基数 统计活跃实例数、参与聚合的维度数量
stddev 离散度(标准差) 衡量延迟抖动、错误率波动、预算消耗稳定性
stdvar 离散度(方差) 与 stddev 互补,用于更敏感的波动检测
选型原则: 误差预算台账通常以 sum 和 avg 为主干,min/max 用于边界告警,stddev/stdvar 用于稳定性评估。不要在一个查询中混用过多聚合操作符,以免增加计算开销。

4.2 核心操作符深度解析

4.2.1 sum:总量汇总与预算消耗

sum 是最常用的聚合操作符,用于将多个时间序列的指标值相加。在误差预算中,它通常用于计算全局的错误总数或总请求量。

# 计算过去 1 小时所有服务的总错误数
sum(
  increase(
    http_requests_total{status=~"5.."}[1h]
  )
)

# 计算所有服务实例的总请求量
sum(
  rate(http_requests_total[5m])
)

在台账中,sum 常与 by 子句配合,按团队、集群或区域维度汇总预算消耗。

4.2.2 avg:平均水位与预算消耗率

avg 用于计算指标的平均值,适合评估服务的平均延迟或平均错误率。在误差预算中,它帮助判断整体健康度是否处于可接受范围。

# 计算所有服务的平均延迟(P50 近似)
avg(
  rate(http_request_duration_seconds_sum[5m])
  /
  rate(http_request_duration_seconds_count[5m])
)

# 按服务维度计算平均错误率
avg by(service) (
  rate(http_requests_total{status=~"5.."}[5m])
  /
  rate(http_requests_total[5m])
)
注意: 对比率(如错误率)使用 avg 时,需要先计算每个时间序列的比率,再聚合平均,否则会得到错误的结果。推荐使用 avg(rate(...) / rate(...)) 而非 avg(rate(...)) / avg(rate(...))。

4.2.3 min / max:边界检测与异常定位

min 和 max 用于找出指标的最小值和最大值,在误差预算中常用于识别最佳和最差表现的实例或维度。

# 找出所有服务实例中的最大延迟
max(
  histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
)

# 按区域维度找出最低错误率
min by(region) (
  rate(http_requests_total{status=~"5.."}[5m])
  /
  rate(http_requests_total[5m])
)

在台账中,max 常用于设置告警阈值,min 用于验证是否存在异常低负载或空闲实例。

4.2.4 count:实例计数与维度基数

count 用于统计非空时间序列的数量,在误差预算中常用于监控实例存活数或参与聚合的维度数量。

# 统计当前活跃的服务实例数
count(up == 1)

# 按团队维度统计有多少个服务在消耗预算
count by(team) (
  http_requests_total
)

当 count 的值突然下降时,可能意味着实例宕机或指标采集中断,需要立即关注。

4.2.5 stddev / stdvar:波动性与稳定性评估

stddev(标准差)和 stdvar(方差)用于衡量指标的离散程度。在误差预算中,它们帮助评估服务的稳定性——即使平均延迟正常,高标准差也意味着存在抖动风险。

# 计算所有服务实例延迟的标准差
stddev(
  rate(http_request_duration_seconds_sum[5m])
  /
  rate(http_request_duration_seconds_count[5m])
)

# 按集群维度计算错误率的方差
stdvar by(cluster) (
  rate(http_requests_total{status=~"5.."}[5m])
  /
  rate(http_requests_total[5m])
)
实践建议: 在误差预算台账中,建议同时展示 avg 和 stddev。例如,延迟台账可以包含“平均延迟”和“延迟标准差”两列,帮助快速识别“平均正常但抖动严重”的服务。

4.3 聚合操作符在误差预算台账中的组合应用

下图展示了不同聚合操作符在误差预算台账中的协作关系:

聚合操作符在误差预算台账中的协作关系 原始指标数据 聚合操作符 台账指标 sum avg min max count stddev stdvar 总错误数 / 总请求量 平均延迟 / 平均错误率 边界值 / 实例计数 波动性指标 说明:聚合操作符将原始指标转换为台账指标,sum/avg 用于总量和平均,min/max 用于边界,count 用于基数,stddev/stdvar 用于波动性评估

4.4 聚合操作符选型决策树

在实际编写误差预算查询时,可以按照以下决策树快速选择聚合操作符:

  1. 需要总量? → 使用 sum(如总错误数、总请求量)
  2. 需要平均水位? → 使用 avg(如平均延迟、平均错误率)
  3. 需要边界值? → 使用 min 或 max(如最大延迟、最小错误率)
  4. 需要实例计数? → 使用 count(如活跃实例数)
  5. 需要评估稳定性? → 使用 stddev 或 stdvar(如延迟抖动、错误率波动)
优化提示: 在误差预算台账中,避免对高基数标签(如 instance、pod)直接使用 stddev 或 stdvar,因为计算开销较大。建议先按服务或集群维度聚合,再计算标准差。

4.5 常见误区与避坑指南

误区 错误示例 正确做法
对比率直接聚合 avg(rate(...)) / avg(rate(...)) avg(rate(...) / rate(...))
忽略 by 子句 sum(rate(...)) 得到全局值 sum by(service) (rate(...)) 按服务聚合
stddev 用于高基数标签 stddev by(instance) (...) 先按服务聚合,再计算标准差
count 误用于计数指标值 count(http_requests_total) count(up == 1) 统计实例数