如何使用RRDtool更新数据?

时间:2008-11-30 09:49:12

标签: perl rrdtool rrd

我使用RRDtool来存储显示图形的数据。我通过RRDs :: update更新RRD,这在尝试重写信息时失败,意味着过去更新数据一段时间(例如有人将系统计时器移回)。我得到的错误是:

ERROR: Cannot update /opt/dashboard/rrd/Disk/192.168.120.168_disk_1.rrd with 
'1228032301:24:24' illegal attempt to update using time 1228032301 when last 
update time is 1228050001 (minimum one second step)

我想总是允许重写,我该怎么做?

3 个答案:

答案 0 :(得分:4)

rrdtool不会将您的输入写入rrd文件。它会对您输入的内容进行采样,然后存储生成的数据点。因此,为rrdtool更新提供“旧数据”将无法以相同的方式工作,因为您无法轻松跳回录音以“修复”一些不良笔记。

显然有一些方法可以改变旧数据,rrdtool中的方法是将rrd文件“转储”到xml,修改内容并“恢复”它。不是人们想定期做的事情。

答案 1 :(得分:3)

在这种情况下我使用以下脚本:

#!/bin/sh
rrdtool dump "$1" | perl -ne 'BEGIN {$t=`date +%s`; chomp($t);} $a=$_; if ($a =~ /lastupdate.\d+..lastupdate/) { $a =~ s/(lastupdate.)\d+(..lastupdate)/$1$t$2/; } print $a' | rrdtool restore -f - "$1"

这有点......怪异,但我找不到另一种自动解决方案。

答案 2 :(得分:1)

根据RRD文档,每次更新时,时间戳编号必须增加。鉴于您的约束,我将修改您的更新例程,以便在更新失败时捕获异常并重新执行更新,并将时间字段设置为“N”。这将使RRDtool使用当前时间作为更新时间。

或者,如果您不想处理catch-and-retry代码,只需修改您的更新代码以始终使用'N'作为时间值 - 然后更新将始终有效。

快速查看RRDtool update command的文档可能会有所帮助。