Grafana 仪表盘如何实现移动平均线(Moving Average)?

Grafana 配合 Prometheus 用 avg_over_time 实现移动平均:avg_over_time(rate(metric[1m])[5m:]) 即 5 分钟滑动均值;InfluxDB 用 moving_average() 函数。本文给出两种数据源的写法与平滑效果对比建议。

最佳实践
Grafana 仪表盘如何实现移动平均线(Moving Average)?封面

Prometheus 没有专门的 moving_average 函数,用 avg_over_time(...[5m:]) 子查询即可实现滑动平均;InfluxDB 则直接提供 moving_average()

Prometheus 数据源写法

# 先算 1 分钟速率,再对速率做 5 分钟滑动平均
avg_over_time(rate(http_requests_total{job="frontend"}[1m])[5m:])

注意末尾的 [5m:] 是子查询语法——内层表达式按默认步长采样后,再对每个点取 5 分钟窗口的平均值,曲线立即变平滑。

常用变体:

  • 中位数平滑quantile_over_time(0.5, ...[5m:]),抗尖刺能力更强;
  • 最大/最小包络max_over_time(...[5m:])min_over_time(...[5m:]) 画上下边界。

InfluxDB 数据源写法

SELECT moving_average(mean("value"), 5) FROM "metric" WHERE $timeFilter GROUP BY time($__interval)

moving_average(字段, N) 直接取最近 N 个点的平均。

实用建议

  • 窗口越大越平滑但越滞后,告警用 5-15m,展示用 30m 内;
  • 移动平均会掩盖瞬时尖峰——容量规划看原始值,趋势展示看均线
  • Grafana 面板上把原始曲线(浅色细线)与均线(深色粗线)叠在一起,信息量最大。

观测云对照

观测云看板的图表查询内置滑动平均等时序变换函数,在图表编辑器的函数列表里直接选择即可,无需手写子查询。

常见问题(FAQ)

Q:为什么我的 avg_over_time 报语法错误? 内层是表达式时必须用子查询 [5m:](带冒号);内层是裸指标时用 [5m](不带冒号)。

Q:指数加权移动平均(EMA)能实现吗? Prometheus 原生不支持,可用 holt_winters() 近似趋势预测;复杂需求在观测云等平台用内置函数更省事。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台