如何基于Prometheus网络I/O指标的rate计算Z-score检测K8s Pod异常
基于Kubernetes网络I/O rate值的Z-score计算方法
问题原因
直接将rate(...)代入原Z-score公式报错parse error: ranges only allowed for vector selectors,是因为PromQL规则限制:range聚合函数(如avg_over_time、stddev_over_time)仅接受范围向量(带时间范围的原始指标选择器,如metric[...])作为输入,而rate()输出的是瞬时向量,无法直接嵌套在range聚合函数内部。
正确的Z-score公式
( avg_over_time(rate(container_network_receive_bytes_total{pod=~"xxx-.*"}[120s])[$__rate_interval:120s]) - avg_over_time(rate(container_network_receive_bytes_total{pod=~"xxx-.*"}[120s])[1d:120s]) ) / stddev_over_time(rate(container_network_receive_bytes_total{pod=~"xxx-.*"}[120s])[1d:120s])
公式拆解
- 计算实时速率:内层的
rate(container_network_receive_bytes_total{pod=~"xxx-.*"}[120s])对原始累计字节指标,以120秒为窗口计算每秒网络接收速率,得到瞬时向量序列。 - 聚合当前窗口的平均速率:
avg_over_time(...)[$__rate_interval:120s]对上述速率序列,在Grafana自动适配的$__rate_interval窗口内取平均值,:后的120s是子查询步长,必须和rate的窗口大小一致,保证数据点对齐。 - 计算历史基准值:
avg_over_time(...)和stddev_over_time(...)的[1d:120s]部分,对过去1天内的速率序列分别取平均值(基准值)和标准差,步长同样设为120s,确保粒度统一。
注意事项
- 子查询的步长(冒号后的数值)必须与rate的窗口大小完全一致,否则会导致数据采样错位,影响计算准确性。
- 该语法要求Prometheus版本≥2.7(支持子查询功能)。
$__rate_interval是Grafana内置变量,会根据仪表盘的时间范围自动调整窗口大小,避免小时间范围下rate计算出现抖动。
内容的提问来源于stack exchange,提问作者TPPZ
相关产品推荐
相关产品推荐

