2012-04-24 13 views
5

Mam kilka wykresów utworzonych przez RRDTool, które zbierały złe dane w czasie kilku godzin.Usuń dane z RRDTool

Jak mogę usunąć dane z RRD w tym okresie czasu, aby nie wyświetlały się?

Odpowiedz

9

Najlepszy sposób znalazłem to zrobić ...

  1. użytkowania RRDTool Dump do eksportowania plików RRD do XML.
  2. Otwórz plik XML, znajdź i edytuj złe dane.
  3. Przywróć plik RRD za pomocą RRDTool Restore.
2

Jeśli chcesz uniknąć zapisywania i edytowania pliku xml, ponieważ może to zająć kilka wywołań IO pliku (w zależności od tego, ile masz złych danych), możesz również odczytać cały rrd w pamięci przy użyciu wartości pobierania i aktualizacji w -pamięć.

Zrobiłem podobne zadanie przy użyciu Pythona + rrdtool i skończyło się robi:

  1. odczytu RRD w pamięci w słowniku
  2. wartości poprawka w słowniku
  3. usunąć istniejące pliki RRD
  4. Utwórz nowy rrd o tej samej nazwie.
+4

Jeśli otworzysz swoje rozwiązanie, założę się, że pomógłbyś wielu ludziom! – mscccc

2

miałem podobny problem, gdzie chciałem wyrzucić najnowsze kilka godzin z moich baz rrdtool, więc napisałem krótki skrypt, aby zrobić to (przeprosiny dla niekonwencjonalnych nazwach zmiennych - styl kodowania dziedziczone z pracy , westchnienie):

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

Pracowałem dla mnie. Mam nadzieję, że pomaga komuś innemu.

0

Jedynym, który zaproponował, co dokładnie edytować, był RobM. Próbowałem jego rozwiązanie i nie działało dla mnie w rrdtool 1.4.7

Moja baza danych używa AVERAGE, MAX i MIN. Zawiera DERIVE, GAUGE i COMPUTED. Przedziały: sekunda (70), minuta (70), godzina (25), dzień (367). Moje zadanie: usunąć ostatnią część (typowy powód: zegar cofnięty).

Zastosowałem rozwiązanie RobM: zmień na mój nowy czas zakończenia, usuń wszystkie po nim. Przywrócona baza danych wydawała się być normalna. Ale nie akceptuje nowych dodatków. Przeanalizowałem nowo utworzoną pustą bazę danych. I znalazłem w nim 70 sekund nagrań z NaN, tak samo przez minutę i godzinę.

Moje rozwiązanie robocze - jeśli usuwam rekordy w pewnym okresie, dodaję taką samą liczbę rekordów NaN w tym okresie, z poprawnym czasem pomniejszania. Wyjątek - dzienne zapisy są usuwane tylko bez dodatku. Jeśli okres zostanie pusty po usunięciu, wypełniam go rekordami NaN, które kończą się moim nowym czasem zakończenia (zaokrąglone do granicy okresu).