如何在Grafana时间序列中用stddev_over_time实现误差率异常检测
用PromQL实现误差率时间序列的±10%标准差异常检测上下限
你可以通过组合PromQL的时间聚合函数与原始误差率计算,用单个查询生成三条曲线:原始误差率、均值+10%标准差上限、均值-10%标准差下限。具体查询如下(以1天为统计窗口为例,可根据你的数据周期调整窗口时长):
# 原始误差率序列 ({__name__="errored_count:ccmr"} / {__name__="completed_count:ccmr"}) # 上限带:均值 + 10%标准差 or (avg_over_time(({__name__="errored_count:ccmr"} / {__name__="completed_count:ccmr"})[1d:]) + 0.1 * stddev_over_time(({__name__="errored_count:ccmr"} / {__name__="completed_count:ccmr"})[1d:])) # 下限带:均值 - 10%标准差 or (avg_over_time(({__name__="errored_count:ccmr"} / {__name__="completed_count:ccmr"})[1d:]) - 0.1 * stddev_over_time(({__name__="errored_count:ccmr"} / {__name__="completed_count:ccmr"})[1d:]))
关键部分说明:
avg_over_time([1d:]):计算误差率在最近1天内的整体均值,生成一条水平线。stddev_over_time([1d:]):计算误差率在同一窗口内的标准差。- 乘以0.1后与均值加减,得到你需要的±10%标准差上下限带。
优化建议:
如果两个指标带有相同的标签(如instance、job),可以简化查询写法,直接用指标名代替{__name__=...}:
(errored_count:ccmr / completed_count:ccmr) or (avg_over_time((errored_count:ccmr / completed_count:ccmr)[1d:]) + 0.1 * stddev_over_time((errored_count:ccmr / completed_count:ccmr)[1d:])) or (avg_over_time((errored_count:ccmr / completed_count:ccmr)[1d:]) - 0.1 * stddev_over_time((errored_count:ccmr / completed_count:ccmr)[1d:]))
你可以根据数据的波动周期调整时间窗口,比如把[1d:]改成[1h:](1小时)或[7d:](7天),确保均值和标准差的统计范围符合你的异常检测需求。
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

