使用rrdtool记录家庭天然气使用量

时间:2019-07-27 09:14:09

标签: graph rrdtool rrd

我要从家里的电表中提取家用天然气的使用量,并尝试将其保存到RRD数据库中,然后使用rrdtool从那里提取以创建图形。

我一直在使用GAUGE db类型对不同的数据源进行此操作,这些数据类型都可以更新/绘图。出于某种原因,我似乎无法使用COUNTER类型的数据源来运行事情。

这就是我一直在使用的东西。

a = 12
b = 3
print(f'12 multiply 3 is {a * b}.')

这些是rrdtool更新语句:

rrdtool create db/gas.rrd --step 300 \
      DS:gas_in:COUNTER:600:0:U  \
      RRA:AVERAGE:0.8:1:300    \
      RRA:AVERAGE:0.8:12:200   \
      RRA:MAX:0.8:1:300        \
      RRA:MAX:0.8:12:200

创建图形

rrdtool update db/gas.rrd N:0
rrdtool update db/gas.rrd N:52
rrdtool update db/gas.rrd N:64
rrdtool update db/gas.rrd N:458
etc.

结果图像示例:

enter image description here

rrdtool的输出获取db / gas.rrd MAX -e1564217220 -s $((1564217220-21600))

rrdtool graph \
-E -R light \
-t "Gas" \
-v "cm^3" \
gas.png \
--start 21600  \
DEF:gas=db/gas.rrd:gas_in:AVERAGE \
LINE1:gas#99ff00:"Gas (cm^3)\t" \
GPRINT:gas:LAST:"last %3.0lf%s" \
GPRINT:gas:AVERAGE:"avg. %3.0lf%s\n"

如果我运行带有调试选项的更新:

--%<--
1564217100: -nan
1564217400: -nan
--%<--

第二次运行只会返回

$ rrdtool updatev /home/arne/scripts/rrd/db/gas.rrd N:900
return_value = 0
[1564131900]RRA[AVERAGE][1]DS[gas_in] = NaN
[1564132500]RRA[AVERAGE][1]DS[gas_in] = NaN
[1564132800]RRA[AVERAGE][1]DS[gas_in] = NaN
----%<--- (more NaN's)

(不确定表示什么,可能是“因为相同的值而不允许?”)

数据似乎没有进入RRD。我究竟做错了什么? (恐怕答案会包含有关“费率”的内容。)

1 个答案:

答案 0 :(得分:0)

您没有在示例数据中指定两次更新之间的等待时间,但我怀疑这太短了。

由于DS的类型为COUNTER,因此您需要有两个完整的时间窗口,才能使RRA每秒更新增量值。由于您的更新不太可能完全在窗口边界上,因此这意味着您需要3个样本。由于步数为300,这意味着每个样本之间需要5分钟的延迟。

您的数据正在单调增加,因此它似乎适合于COUNTER,尽管每秒的速率非常小。

确保输入样品数据时出现延迟:

rrdtool updatev db/gas.rrd N:0
sleep 300
rrdtool updatev db/gas.rrd N:52
sleep 300
rrdtool updatev db/gas.rrd N:64
sleep 300
rrdtool updatev db/gas.rrd N:458

我希望它会在第三次更新后开始在RRA中显示一些值。

请注意,您在RRA定义中使用了较高的XFF,因此粒度较低的RRA更有可能隐藏丢失的数据。