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

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

我使用 influxdb 作为后端。

【问题讨论】:

  • 试试avg_over_time(metrics_name[2m])(从最底部开始)

标签: metrics influxdb grafana


【解决方案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 系列中。

【讨论】:

【解决方案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 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
          猜你喜欢
          • 2022-01-06
          • 2021-08-23
          • 2017-09-01
          • 2014-04-09
          • 2013-12-22
          • 1970-01-01
          • 2013-12-03
          • 2014-08-15
          • 2011-06-15
          相关资源
          最近更新 更多