在Grafana中是否有一种方法可以使用移动平均?

28

我没有找到“移动平均”功能,想知道是否有变通方法。

我正在使用influxdb作为后端。


3
尝试使用 avg_over_time(metrics_name[2m])(来自最底部的答案) - Howard
7个回答

24
Grafana支持添加movingAverage()。我在文档中也很难找到它,但你可以(有点滑稽地)在功能介绍页面上看到它的用法。

screenshot showing movingAverage() call

按照惯例,点击图表标题,编辑,在graphite文档中描述的方式添加指标movingAverage()

movingAverage(seriesList, windowSize)

绘制一个指标(或多个指标)在过去固定数量的点或时间间隔内的移动平均线图。

接受一个指标或通配符 seriesList,后跟数据点数 N 或带有时间长度的引用字符串,例如 '1hour' 或 '5min'(请参阅 render_api_ 中的 from / until 示例以了解时间格式)。绘制每个点之前数据点的平均值。所有先前的数据点在图表开始时都设置为 None。

示例:

&target=movingAverage(Server.instance01.threads.busy,10)
&target=movingAverage(Server.instance*.threads.idle,'5min')

3
使用influxdb时,UI界面有所不同。看起来是influxdb在执行聚合操作,因此我开始认为这必须在influxdb中实现。也许graphite也一样。movingAverage是graphite的一个函数:http://graphite.readthedocs.org/en/latest/functions.html#graphite.render.functions.movingAverage - bbigras
太棒了,我不知道你可以在Grafana上进行MA操作,谢谢!当然,根据数据的不同,我将我的设置为大约6或12小时的平均值,这样可以给你一个漂亮的趋势线。 - Arturski

21

Grafana本身不进行任何计算,它只是查询后端并绘制漂亮的图表。因此聚合能力完全取决于您的后端。虽然Graphite支持窗口函数,例如移动平均值,但InfluxDB目前不支持。

在网络上有相当多的关于influxdb移动平均的请求。您可以在此工单中留下您的“+1”,并跟踪进度:https://github.com/influxdb/influxdb/issues/77

可能的(但不太容易的)解决方法是创建一个自定义脚本(cron、守护程序或其他方式),预先计算移动平均数并将其保存到单独的influxdb系列中。


12
自 InfluxDB v1.2 版本开始支持 moving_average 功能。 - Tim Gage

8

我在这里尝试使用PostgreSQL数据库在Grafana上进行移动平均,所以我将提供一种使用SQL查询的方法:

SELECT
  date as time,
  AVG(daily_average_column) 
    OVER(ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) 
    AS value,
  '5 Day Moving Average' as metric
FROM daily_average_table
ORDER BY time ASC;

这里使用了“窗口”函数来计算最近的4行(加上当前行)的平均值。我相信在MySQL中也有实现这种方法的方式。

6
此方法和能力取决于您的数据源。
您指定了InfluxDB,因此您的查询将需要在“转换函数”moving_average($aggregation_function, $num_of_points)中包装“聚合函数”(例如mean($field))。
在“指标”选项卡中,您将在菜单的“select”部分找到“转换”函数。
首先使用“聚合函数”(平均值、最小值、最大值等)编写您的查询——这样您就可以确保数据看起来符合您的预期。
之后,只需点击“聚合函数”旁边的“+”按钮,在菜单“Transformations”下选择“moving_average”。
括号中的数字是您希望计算平均值的点数。
屏幕截图:

5

尝试使用avg_over_time(mymetric[5m])

enter image description here


2
虽然这段代码片段可能是解决方案,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您的代码建议原因。 - colidyre

3

InfluxDB 2允许在查询中计算移动平均值,例如:

from(bucket: "iot")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "PoolWeather")
  |> filter(fn: (r) => r["_field"] == "batteryvoltage")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> movingAverage(n: 10)
  |> yield(name: "average")

enter image description here


1
另一种选择是将数据报告为“时间”指标而不是计数。这在您的堆栈中使用Statsd特别容易实现。将来自Statsd的时间数据(作为报告的数据点的平均值)绘制出来已经内置了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接