InfluxDB/Grafana 返回计数器从零开始



我正在监控家里的用水量,我有一个始终向上移动的计数器,它表示自源设备重新启动以来使用的升水量。我将其显示在带有 1 天数据的图表上,它很好地指示了用水量。问题是,一旦计数器达到几千升,就很难阅读图表,因为它显示从 10,123 开始到 10,456 结束。我想从图表上的每个值中减去 10,123,因此该值从零开始。

例如,这是我的查询和结果。我想从返回的每个值中减去 417.388698630137。我很乐意在 Influx 或 Grafana 中找到解决方案。如果解决方案通过计数器重置工作,则获得奖励积分。:-)

> SELECT mean("waterTotalVolumeMeter") 
FROM "detailed_data"."water" 
WHERE time > now() - 6h 
GROUP BY time(1h) fill(null)
name: water
time                mean
----                ----
1592600400000000000 417.388698630137
1592604000000000000 423.9315642458101
1592607600000000000 432.36805555555554
1592611200000000000 443.77777777777777
1592614800000000000 450.3611111111111
1592618400000000000 504.5763888888889
1592622000000000000 544.8134328358209

变化率通常从计数器计算。InfluxDB为此具有DERIVATE函数。但是应该使用NON_NEGATIVE_DERIVATIVE,因为计数器可以重新启动,负值对于此用例没有意义。

SELECT NON_NEGATIVE_DERIVATIVE("waterTotalVolumeMeter") 
FROM "detailed_data"."water" 
WHERE time > now() - 6h

文档:https://docs.influxdata.com/influxdb/v1.8/query_language/functions/#non-negative-derivative

请参阅文档并改进示例查询以满足您的需求。例如,您可能需要根据使用的时间分组指定unit

我找到了一个似乎有效的解决方案,我不确定它是否是最好的解决方案,但发布它,因为它可能对某人有用。对于第一个结果,这并不总是返回 0,因为在第一个间隔中可能会有一些计数器增量,但这确实可以满足我的需求。我返回原始值只是为了突出显示它正在做什么。

编辑:我发现您需要设置填充(以前(以应对数据中的空白,否则最终结果不准确,图形意外跳跃。我还发现它可以很好地应对计数器重置,这就是我们需要non_negative_derivative的原因。

SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)), mean("waterTotalVolumeMeter") FROM "detailed_data"."water" WHERE time > now() - 12h GROUP BY time(1h) fill(previous)
name: water
time                cumulative_sum     mean
----                --------------     ----
1592600400000000000 5.993055555555543  416.29008746355686
1592604000000000000 13.93156424581008  423.9315642458101
1592607600000000000 22.368055555555543 432.36805555555554
1592611200000000000 33.77777777777777  443.77777777777777
1592614800000000000 40.361111111111086 450.3611111111111
1592618400000000000 94.57638888888891  504.5763888888889
1592622000000000000 138.69444444444446 548.6944444444445
1592625600000000000 144.27083333333337 554.2708333333334
1592629200000000000 154.91666666666663 564.9166666666666
1592632800000000000 159                569
1592636400000000000 229.09027777777783 639.0902777777778
1592640000000000000 324.88194444444446 734.8819444444445
1592643600000000000 375                785

我还发现这是为单个统计数据提供准确结果的唯一方法。如果我们想根据计数器显示时间间隔内消耗的事物数量,那么逻辑方法是从最大值中减去最小值或使用扩展函数。不过,这些都不适用于计数器重置。为了应对计数器复位,唯一的选择是总结所有正增量,这就是它的作用。我发现了 3 种在单个统计数据中使用它的方法:

  1. 保持查询不变,让格拉法纳做最大

SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)) AS X FROM "detailed_data"."water" WHERE time > now() -24h GROUP BY time(1h) fill(previous)

  1. 使用原始查询作为子查询进行最大涌入

SELECT MAX(X) FROM (SELECT cumulative_sum(non_negative_derivative(mean("waterTotalVolumeMeter"), 1h)) AS X FROM "detailed_data"."water" WHERE time > now() - 24h GROUP BY time(1h) fill(previous))

  1. 像这样在流入中使用总和:

SELECT SUM(X) FROM (SELECT non_negative_derivative(mean("waterTotalVolumeMeter"), 1h) AS X FROM "detailed_data"."water" WHERE time > now() - 24h GROUP BY time(1h) fill(previous))

最新更新