有没有办法在 Grafana 中设置移动平均线?

Posted

技术标签:

【中文标题】有没有办法在 Grafana 中设置移动平均线?【英文标题】:Is there a way to have a moving average in Grafana? 【发布时间】:2015-02-13 20:16:33 【问题描述】:

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

我使用 influxdb 作为后端。

【问题讨论】:

试试avg_over_time(metrics_name[2m])(从最底部开始) 【参考方案1】:

Grafana 支持添加movingAverage()。我也很难在文档中找到它,但你可以(有点搞笑)在feature intro page 上看到它的用法:

像往常一样,点击图表标题,编辑,按照graphite documentation中的描述添加指标movingAverage():

movingAverage(seriesList, windowSize)

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

采用一个指标或一个通配符 seriesList 后跟 N 个数据点或一个带引号的字符串,其时间长度如“1 小时”或“5 分钟”(有关时间格式的示例,请参见 render_api_ 中的 from / until )。绘制图表上每个点的先前数据点的平均值。所有之前的数据点在图表的开头都设置为 None。

例子:

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

【讨论】:

使用 influxdb 时的 UI 有点不同。我似乎 influxdb 正在做聚合,所以我开始认为它必须在 influxdb 中实现。也许石墨也是如此。 MovingAverage 是一个石墨函数:graphite.readthedocs.org/en/latest/… 太棒了,我不知道你可以在 Grafana 上做 MA,谢谢!当然,根据数据,我将我的设置为大约 6 或 12 小时的平均值,这会给你一个很好的趋势线。【参考方案2】:

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

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

可能(但不是那么容易)的解决方法是创建一个自定义脚本(cron、守护进程等),该脚本将预先计算 MA 并将其保存在单独的 influxdb 系列中。

【讨论】:

InfliuxDB 现在支持moving_average v1.2【参考方案3】:

我发现自己在这里尝试使用 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 也有办法做到这一点。

【讨论】:

【参考方案4】:

此方法和功能取决于您的数据源。

您指定了 InfluxDB,因此您的查询需要在 Moving_average($aggregation_function, $num_of_points) '转换函数'中包装一个'聚合函数' [例如 mean($field) ]。

在“指标”选项卡中,您会在菜单的“选择”部分找到“转换”功能。

首先使用“聚合函数”(平均值、最小值、最大值等)创建查询 - 这样您可以确保数据看起来符合您的预期。

之后,只需单击“聚合函数”旁边的“+”按钮,然后在“转换”菜单下,选择“移动平均”。

括号中的数字将是您希望取平均值的点数。

截图:

【讨论】:

【参考方案5】:

另一种选择是将数据报告为“时间”指标而不是计数。 这很容易做到,尤其是在您的堆栈中使用 Statsd。 已内置将时序数据(来自 statsd)绘制为报告数据点的平均值。

【讨论】:

【参考方案6】:

InfluxDB 2 允许您计算查询中的moving average,例如:

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")

【讨论】:

【参考方案7】:

试试avg_over_time(mymetric[5m])

【讨论】:

虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。

以上是关于有没有办法在 Grafana 中设置移动平均线?的主要内容,如果未能解决你的问题,请参考以下文章

我想在红色的 html 表中设置当前时间线(如果可能的话,每 10 分钟自动移动一次)

在我自己的网站中的嵌入式 youtube 视频中设置时间线

Grafana:x 轴上没有日期时间的折线图

如何从文本面板在 grafana 仪表板中设置时间范围

有没有办法在 iOS 和 Android 设备中设置 Web 套接字服务器(不是客户端)?

在弹簧过滤器中设置视图名称