有没有办法在 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 分钟自动移动一次)