2008-11-30 18 views
5

Ich verwende RRDtool zum Speichern von Daten zum Anzeigen von Graphen. Ich aktualisiere die RRD durch RRDs :: update und das scheitert beim Versuch, die Information neu zu schreiben, bedeutet, Daten für eine Zeit in der Vergangenheit zu aktualisieren (z. B. hat jemand den Systemzeitgeber zurückbewegt). Der Fehler, den ich bekomme ist:Wie kann ich Daten mit RRDtool aktualisieren?

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) 

Ich möchte immer das Neuschreiben erlauben, wie kann ich das tun?

Antwort

1

Gemäß der RRD-Dokumentation muss diese Zeitmarkennummer mit jedem Update erhöht werden. Angesichts Ihrer Einschränkungen ändere ich Ihre Update-Routine so, dass Sie bei einem fehlgeschlagenen Update die Ausnahme abfangen und die Aktualisierung mit dem Zeitfeld auf "N" wiederholen können. Dadurch wird RRDtool die aktuelle Zeit als Aktualisierungszeit verwenden.

Wenn Sie sich nicht mit dem Catch-and-Retry-Code befassen möchten, ändern Sie einfach Ihren Aktualisierungscode, um immer 'N' als Zeitwert zu verwenden - dann funktioniert das Update immer.

Es kann hilfreich sein, einen kurzen Blick auf die Dokumentation für das RRDtool update command zu werfen.

3

rrdtool schreibt Ihre Eingabe nicht in die rrd-Datei. Es prüft vielmehr, was Sie eingeben und speichert die resultierenden Datenpunkte. Das Bereitstellen von "alten Daten" für das rrdtool-Update funktioniert nicht auf die gleiche Weise, da Sie nicht einfach in eine Tonaufnahme zurückspringen können, um ein paar schlechte Noten zu "reparieren".

Offensichtlich gibt es Möglichkeiten, alte Daten zu ändern, die Art und Weise, dies in RrdTool, ist es, die RRD-Datei in XML "Dump", ändern Sie den Inhalt und "Wiederherstellen" es. Nicht etwas, das man regelmäßig machen möchte.

3

Ich verwende folgende Skript in solchen Situationen:

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

Es ist ein wenig ... ausgeflippt, aber ich konnte nicht eine andere automatische Lösung finden.

Verwandte Themen