我在这里的第一篇文章,所以我希望我没有太过冗长。我发现由于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)
这一切都适用于输入原始数据(来自crontabed网站抓取),但正如我所说,我丢失了数据,想添加回以前的数据点。从我的备份源,我有一个纯文本文件,行看起来像
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
转储显示所有字段的最后更新数据,但这是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理解问题。谢谢你的指点。
您遇到的问题是RRDTool时间戳必须在增加。这意味着,如果增加RRA的长度(回到过去),则无法将数据直接放入这些点中,只能随着时间的增加将新数据添加到末尾。此外,当您创建新的RRD时,"上次更新"时间默认为NOW。
如果你有以前时间戳的日志,那么你应该能够添加这个历史记录,只要你在完成之前没有进行任何"现在"更新。
首先,创建RRD,其"开始"时间早于第一次历史更新。
然后,使用适当的时间戳,按时间顺序处理所有历史更新。
最后,您可以开始定期"立即"更新。
我怀疑发生的情况是,在运行所有历史数据输入之前,您的常规cronjob添加了新数据,或者您创建了RRD,其开始时间在历史时间戳之后。