我没有找到“移动平均”功能,想知道是否有变通方法。
我正在使用influxdb作为后端。
movingAverage()
。我在文档中也很难找到它,但你可以(有点滑稽地)在功能介绍页面上看到它的用法。
按照惯例,点击图表标题,编辑,在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')
Grafana本身不进行任何计算,它只是查询后端并绘制漂亮的图表。因此聚合能力完全取决于您的后端。虽然Graphite支持窗口函数,例如移动平均值,但InfluxDB目前不支持。
在网络上有相当多的关于influxdb移动平均的请求。您可以在此工单中留下您的“+1”,并跟踪进度:https://github.com/influxdb/influxdb/issues/77
可能的(但不太容易的)解决方法是创建一个自定义脚本(cron、守护程序或其他方式),预先计算移动平均数并将其保存到单独的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;
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")
avg_over_time(metrics_name[2m])
(来自最底部的答案) - Howard