我在这里发表的第一篇文章,所以我希望自己不会过于冗长。 我发现我丢失了数据点,因为我的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理解问题。谢谢你的任何指示。
答案 0 :(得分:0)
您遇到的问题是RRDTool时间戳必须增加。这意味着,如果增加RRA的长度(回到过去),则无法将数据直接放入这些点 - 只会随着时间的增加将新数据添加到最后。此外,当您创建新的RRD时,“上次更新”时间默认为NOW。
如果您有上一个时间戳记的日志,那么您应该能够添加此历史记录,只要您在完成此操作之前不进行任何“现在”更新。
首先,创建RRD,其开始时间早于第一次历史更新。
然后,按时间顺序处理所有历史更新,并使用适当的时间戳。
最后,您可以开始定期“现在”更新。
我怀疑发生的事情是,在运行所有历史数据输入之前,您已经使用常规cronjob添加新数据 - 或者您在历史时间戳之后的开始时间创建了RRD。