我没有找到“移动平均线”功能,我想知道是否有解决方法。
我使用 influxdb 作为后端。
Grafana 支持添加movingAverage()
. 我也很难在文档中找到它,但是您可以(有点滑稽地)在功能介绍页面上看到它的用法:
像往常一样,单击图形标题,编辑,按照石墨文档中的描述添加指标movingAverage():
movingAverage(seriesList, windowSize)
绘制固定数量的过去点或时间间隔内指标(或指标)的移动平均值。
采用一个度量标准或通配符 seriesList,后跟 N 个数据点或带引号的字符串,其时间长度如“1 小时”或“5 分钟”(有关时间格式的示例,请参见 render_api_ 中的从/直到)。绘制图表上每个点的先前数据点的平均值。在图表的开头,所有先前的数据点都设置为无。
例子:
&target=movingAverage(Server.instance01.threads.busy,10)
&target=movingAverage(Server.instance*.threads.idle,'5min')
Grafana 本身不进行计算,它只是查询后端并绘制漂亮的图表。所以聚合能力完全取决于你的后端。虽然 Graphite 支持移动平均等窗口函数,但 InfluxDB 目前不支持它。
网络上有很多关于 influxdb 移动平均线的请求。您可以留下您的“+1”并在此工单中跟踪进度https://github.com/influxdb/influxdb/issues/77
可能(但不是那么容易)的解决方法是创建一个自定义脚本(cron、守护进程等),它将预先计算 MA 并将其保存在单独的 influxdb 系列中。
我发现自己在这里尝试使用 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 做到这一点。
方法和能力取决于您的数据源。
您指定了 InfluxDB,因此您的查询将需要在 Moving_average($aggregation_function, $num_of_points) '转换函数'中包装一个'聚合函数' [例如 mean($field) ]。
在“指标”选项卡中,您将在菜单的“选择”部分找到“转换”功能。
首先使用“聚合函数”(平均值、最小值、最大值等)制作您的查询——这样您可以确保数据看起来符合您的预期。
之后,只需单击“聚合函数”旁边的“+”按钮,然后在“转换”菜单下,选择“移动平均”。
括号中的数字将是您希望取平均值的点数。
截屏:
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")
另一种选择是将数据报告为“时间”指标而不是计数。这很容易做到,尤其是在你的堆栈中使用 Statsd。已内置将时序数据(来自 statsd)绘制为报告数据点的平均值。