【问题标题】:How can I update data with RRDtool?如何使用 RRDtool 更新数据?
【发布时间】:2008-11-30 09:49:11
【问题描述】:

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

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

【问题讨论】:

    标签: perl rrdtool rrd


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-16
          • 1970-01-01
          相关资源
          最近更新 更多