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 聚合操作符在误差预算台账中的组合应用
下图展示了不同聚合操作符在误差预算台账中的协作关系:
4.4 聚合操作符选型决策树
在实际编写误差预算查询时,可以按照以下决策树快速选择聚合操作符:
- 需要总量? → 使用
sum(如总错误数、总请求量) - 需要平均水位? → 使用
avg(如平均延迟、平均错误率) - 需要边界值? → 使用
min或max(如最大延迟、最小错误率) - 需要实例计数? → 使用
count(如活跃实例数) - 需要评估稳定性? → 使用
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) 统计实例数 |