2012-04-24 16 views
5

Ho diversi grafici creati da RRDTool che hanno raccolto dati errati durante un periodo di tempo di un paio d'ore.Rimuovere i dati dal RRDTool

Come posso rimuovere i dati dai RRD durante quel periodo di tempo in modo che non vengano più visualizzati?

risposta

9

Metodo migliore che ho trovato per fare questo ...

  1. Usa RRDTool Dump per esportare i file RRD in XML.
  2. Apre il file XML, trova e modifica i dati non validi.
  3. Ripristinare il file RRD utilizzando RRDTool Restore.
2

Se si vuole evitare la scrittura e la modifica dei file XML come questo può richiede alcuni file di IO chiama (sulla base di quanto i dati cattivo avete), si può anche leggere l'intero RRD in memoria usando recuperare e aggiornare i valori in -memoria.

ho fatto compito simile utilizzando python + RRDtool e ho finito per fare:

  1. lettura rrd in memoria in un dizionario
  2. valori fissi nel dizionario
  3. Elimina file RRD
  4. esistente
  5. crea nuovo rrd con lo stesso nome.
+4

Se apri la tua soluzione, scommetto che aiuteresti molte persone! – mscccc

2

ho avuto un problema simile in cui ho voluto scartare le più recenti poche ore dal mio database rrdtool, così ho scritto uno script veloce per farlo (scuse per i nomi delle variabili non convenzionali - codifica stile ereditato dal lavoro , sigh):

#!/usr/bin/env python2                                             
"""                                                  
Modify XML data generated by `rrdtool dump` such that the last update was at                               
the unixtime specified (decimal). Data newer than this is simply omitted.                                

Sample usage::                                               

    rrdtool dump foo.rrd \ 
     | python remove_samples_newer_than.py 1414782122 \ 
     | rrdtool restore - foo_trimmed.rrd                       
"""                                                  

import sys                                                

assert sys.argv[1:], "Must specify maximum Unix timestamp in decimal"                                 

iMaxUpdate = sys.argv[1]                                            

for rLine in iter(sys.stdin.readline, ''):                                        
    if "<lastupdate>" in rLine:                                           
     # <lastupdate>1414782122</lastupdate> <!-- 2014-10-31 19:02:02 GMT -->                               
     _, _, rData = rLine.partition("<lastupdate>")                                     
     rData, _, _ = rData.partition("</lastupdate")                                     
     iLastUpdate = int(rData)                                          
     assert iLastUpdate < iMaxUpdate, "Last update in RRD older than " \                                
            "the time you provided, nothing to do"                                
     print "<lastupdate>{0}</lastupdate>".format(iMaxUpdate)                                   
    elif "<row>" in rLine:                                            
     # <!-- 2014-10-17 20:04:00 BST/1413572640 --> <row><v>9.8244774011e+01</v><v>8.5748587571e-01</v><v>4.2046610169e+00</v><v>9.3016101695e+01</v><v>5.0000000000e-02</v><v>1.6652542373e-01</ v><v>1.1757062147e+00</v><v>1.6901226735e+10</v><v>4.2023108608e+09</v><v>2.1457537707e+08</v><v>3.9597816832e+09</v><v>6.8812800000e+05</v><v>3.0433198080e+09</v><v>6.0198912250e+06</v><v>2.  0000000000e+00</v><v>0.0000000000e+00</v></row>                                       
     rData, _, _ = rLine.partition("<row>")                                       
     _, _, rData = rData.partition("/")                                        
     rData, _, _ = rData.partition("--")                                        
     rData = rData.strip()                                           
     iUpdate = int(rData)                                           
     if iUpdate < iMaxUpdate:                                          
      print rLine,                                            
    else:                                                
     print rLine,                                             

Ha funzionato per me. Spero che aiuti qualcun altro.

0

L'unico che ha proposto, cosa esattamente da modificare, era RobM. Ho provato la sua soluzione, e non ha funzionato per me in rrdtool 1.4.7

Il mio database utilizza MEDIA, MAX e MIN. Contiene DERIVE, GAUGE e COMPUTED. Intervalli: secondo (70), minuto (70), ora (25), giorno (367). Il mio compito: cancellare parte ultima (motivo tipico: orologio spostato indietro).

Ho applicato la soluzione di RobM: passare al nuovo orario di fine, eliminare tutto dopo di esso. Il database ripristinato sembrava essere normale. Ma non ha accettato nuove aggiunte. Ho esaminato un database vuoto appena creato. E ho trovato 70 secondi di registrazioni con NaN, lo stesso per minuto e ora.

Quindi, la mia soluzione di lavoro - se elimino i record in qualche periodo, aggiungo lo stesso numero di record NaN in questo periodo che inizia, con tempi correttamente decrescenti. Eccezione: record giornalieri, vengono solo eliminati senza aggiunte. Se il periodo diventa vuoto dopo le eliminazioni, lo riempio con i record NaN che terminano con il mio nuovo orario di fine (arrotondato al confine del periodo).

Problemi correlati