更新rrdtool数据库

时间:2017-11-03 04:50:46

标签: python-2.7 rrdtool

我在这里发表的第一篇文章,所以我希望自己不会过于冗长。 我发现我丢失了数据点,因为我的rrdtool配置中只有10行,并希望从包含旧数据的备份源文件更新。 修复行计数后,配置创建时使用:

rrdtool create dailySolax.rrd \
--start 1451606400 \
--step 21600 \
 DS:toGrid:GAUGE:172800:0:100000 \
 DS:fromGrid:GAUGE:172800:0:100000 \
 DS:totalEnerg:GAUGE:172800:0:100000 \
 DS:BattNow:GAUGE:1200:0:300 \
 RRA:LAST:0.5:1d:1010 \
 RRA:MAX:0.5:1d:1010 \
 RRA:MAX:0.5:1M:1010

并且python中的更新行是

newline = ToGrid + ':' + FromGrid + ':' + TotalEnergy + ':' + battNow
UpdateE = 'N:'+ (newline)
print UpdateE
try: 
    rrdtool.update(
    "%s/dailySolax.rrd" % (os.path.dirname(os.path.abspath(__file__))),
    UpdateE)

这一切都适用于输入原始数据(来自crontabbed网站scrape),但正如我所说,我丢失了数据并希望添加回早期的数据点。 从我的备份源我有一个纯文本文件,其行看起来像

1509386401:10876.9:3446.22:18489.2:19.0
1509408001:10879.76:3446.99:18495.7:100.0

其中第一个字段是时间戳。然后使用此代码读取更新行:

with open("rrdRecovery.txt","r") as fp:
    for line in fp:
        print line
## newline = ToGrid + ':' + FromGrid + ':' + TotalEnergy + ':' + battNow
    UpdateE = line
    try: 
        rrdtool.updatev(
        "%s/dailySolax.rrd" % (os.path.dirname(os.path.abspath(__file__))),
        UpdateE)

当它与数据库当前版本的副本无法正常工作时,我再次尝试在使用相同配置创建的空数据库上。 在每种情况下,更新仅产生数据库中的时间戳数据,而不产生来自其他字段的数据。 Python没有抱怨,我期待

1509386401:10876.9:3446.22:18489.2:19.0

会像

一样更新
N:10876.9:3446.22:18489.2:19.0

转储显示所有字段的lastupdate数据,但接着显示rra数据库的

<!-- 2017-10-31 11:00:00 AEDT / 1509408000 --> <row><v>NaN</v><v>NaN</v><v>NaN</v><v>NaN</v></row>

不确定我是否有python问题 - 更可能是rrdtool理解问题。谢谢你的任何指示。

1 个答案:

答案 0 :(得分:0)

您遇到的问题是RRDTool时间戳必须增加。这意味着,如果增加RRA的长度(回到过去),则无法将数据直接放入这些点 - 只会随着时间的增加将新数据添加到最后。此外,当您创建新的RRD时,“上次更新”时间默认为NOW。

如果您有上一个时间戳记的日志,那么您应该能够添加此历史记录,只要您在完成此操作之前不进行任何“现在”更新。

首先,创建RRD,其开始时间早于第一次历史更新。

然后,按时间顺序处理所有历史更新,并使用适当的时间戳。

最后,您可以开始定期“现在”更新。

我怀疑发生的事情是,在运行所有历史数据输入之前,您已经使用常规cronjob添加新数据 - 或者您在历史时间戳之后的开始时间创建了RRD。