2008-11-30 20 views
5

Estoy usando RRDtool para almacenar datos para mostrar gráficos. Actualizo el RRD por RRDs :: actualización y esto falla al intentar reescribir la información, significa actualizar datos por un tiempo en el pasado (por ejemplo, alguien movió el temporizador del sistema hacia atrás). El error que consigo es:¿Cómo puedo actualizar los datos con RRDtool?

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) 

Quiero permitir siempre la reescritura, ¿cómo puedo hacer esto?

Respuesta

1

De acuerdo con la documentación de RRD, ese número de marca de tiempo debe aumentar con cada actualización. Dadas sus limitaciones, modificaría su rutina de actualización para que, si la actualización falla, capture la excepción y vuelva a realizar la actualización con el campo de tiempo configurado en 'N'. Eso hará que RRDtool use la hora actual como el tiempo de actualización.

Alternativamente, si no quiere tratar con el código catch-and-retry, simplemente modifique su código de actualización para usar siempre 'N' como valor de tiempo, entonces la actualización siempre funcionará.

Puede ser útil echar un vistazo a la documentación de la herramienta RRDtool update command.

3

rrdtool no escribe su entrada en el archivo rrd. Más bien muestra lo que ingresa y luego almacena los puntos de datos resultantes. Por lo tanto, proporcionar "datos antiguos" a la actualización de rrdtool no funcionará de la misma manera, ya que no se puede omitir fácilmente en una grabación de sonido para "corregir" algunas notas malas.

Obviamente, hay formas de alterar los datos antiguos, la forma de hacerlo todo en rrdtool, es "volcar" el archivo rrd a xml, modificar el contenido y "restaurarlo". No es algo que a uno le gustaría hacer de forma regular.

3

utilizo siguiente secuencia de comandos en este tipo de situaciones:

#!/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 un poco ... extraño, pero no pude encontrar otra solución automática.

Cuestiones relacionadas