从零开始的XDB/Grafana返回计数器

从零开始的XDB/Grafana返回计数器,grafana,influxdb,Grafana,Influxdb,我正在监测家里的用水情况,我有一个一直向上移动的计数器,它表示自我的源设备重新启动以来使用的水的升数。我在一张图表上显示了这些数据,比如说1天的数据,它很好地显示了水的使用情况。问题是,一旦计数器达到几千升,就很难读取图表,因为它显示的是从10123开始,到10456结束。我想从图上的每个值中减去10123,所以这个值从零开始 例如,这是我的查询和结果。我想从返回的每个值中减去417.388698630137。我很高兴能在Inflox或Grafana找到解决方案。如果解决方案通过计数器重置工作,

我正在监测家里的用水情况,我有一个一直向上移动的计数器,它表示自我的源设备重新启动以来使用的水的升数。我在一张图表上显示了这些数据,比如说1天的数据,它很好地显示了水的使用情况。问题是,一旦计数器达到几千升,就很难读取图表,因为它显示的是从10123开始,到10456结束。我想从图上的每个值中减去10123,所以这个值从零开始

例如,这是我的查询和结果。我想从返回的每个值中减去417.388698630137。我很高兴能在Inflox或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

变化率通常由计数器计算。XDB对此具有派生函数。但应该使用非负的导数,因为计数器可以重新启动,负值对于这个用例没有意义

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


查看文档并改进示例查询以满足您的需要。例如,您可能需要根据使用的时间分组指定单位。

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

编辑:我发现您需要设置fillprevious以处理数据中的空白,否则最终结果将不准确,图形将意外跳转。我还发现它能很好地处理计数器重置,这就是为什么我们需要非负导数

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种使用它的方法:

让查询保持原样,让Grafana尽最大努力 从详细的水数据中选择累积水负导数水总体积计,1h为X。水,其中时间>现在-24h按时间分组1h

使用原始查询作为子查询执行最大流入 从“选择累计水”中选择最大值,从“负导数”中选择最大值,从“详细数据”中选择最大值,其中时间>现在-按时间分组

在流入中使用sum,如下所示:
从SELECT non_negative_derivativemeanwaterTotalVolumeMeter中选择SUMX,从详细数据中选择1h作为X。water WHERE time>now-24h GROUP BY time1h fillprevious谢谢,但我不想要变化率,我只希望图表中的计数器显示为从零开始。