6

我正在使用 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)

我想始终允许重写,我该怎么做?

4

3 回答 3

4

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

#!/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"

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

于 2012-07-25T08:44:47.327 回答
4

rrdtool 不会将您的输入写入 rrd 文件。而是对您输入的内容进行采样,然后存储结果数据点。因此,向 rrdtool update 提供“旧数据”将不会以相同的方式工作,因为您无法轻松地跳回录音以“修复”一些错误的音符。

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

于 2012-07-20T06:32:16.237 回答
1

根据 RRD 文档,该时间戳编号必须随着每次更新而增加。鉴于您的限制,我将修改您的更新例程,以便如果更新失败,您可以捕获异常并在时间字段设置为“N”的情况下重做更新。这将使 RRDtool 使用当前时间作为更新时间。

或者,如果您不想处理捕获并重试代码,只需修改更新代码以始终使用“N”作为时间值——那么更新将始终有效。

快速查看 RRDtool更新命令的文档可能会有所帮助。

于 2008-11-30T13:42:26.663 回答