Удалить данные из RRDTool

У меня есть несколько графиков, созданных RRDTool, которые собирали неверные данные в течение пары часов.

Как я могу удалить данные из RRD за этот период времени, чтобы они больше не отображались?


person mscccc    schedule 24.04.2012    source источник


Ответы (4)


Лучший способ, который я нашел для этого...

  1. Используйте RRDTool Dump для экспорта файлов RRD в XML. .
  2. Откройте файл XML, найдите и отредактируйте неверные данные.
  3. Восстановите файл RRD с помощью RRDTool Restore .
person mscccc    schedule 25.04.2012

У меня была аналогичная проблема, когда я хотел отбросить последние несколько часов из моих баз данных RRDtool, поэтому я написал быстрый скрипт для этого (извините за нетрадиционные имена переменных - стиль кодирования, унаследованный от работы, вздох):

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

Работал на меня. Надеюсь, это поможет кому-то еще.

person RobM    schedule 31.10.2014

Если вы хотите избежать записи и редактирования файла xml, так как это может занять несколько вызовов ввода-вывода файла (в зависимости от того, сколько у вас неверных данных), вы также можете прочитать весь rrd в память, используя выборку и обновление значений в памяти.

Я выполнил аналогичную задачу, используя python + rrdtool, и в итоге я сделал:

  1. читать rrd в памяти в словаре
  2. исправить значения в словаре
  3. удалить существующий файл rrd
  4. создать новый rrd с тем же именем.
person Sumit Purohit    schedule 01.10.2012
comment
Если вы откроете исходный код своего решения, держу пари, вы поможете многим людям! - person mscccc; 03.10.2012

Единственным, кто предложил, что именно редактировать, был RobM. Я попробовал его решение, и оно у меня не сработало в rrdtool 1.4.7.

В моей базе данных используются AVERAGE, MAX и MIN. Он содержит DERIVE, GAUGE и COMPUTED. Интервалы: секунда (70), минута (70), час (25), день (367). Моя задача: удалить последнюю часть (типичная причина: часы перевели назад).

Я применил решение RobM: изменить на мое новое время окончания, удалить все после него. Восстановленная база данных выглядела нормально. Но он не принял новых дополнений. Я исследовал только что созданную пустую базу данных. И я нашел в нем 70-секундные записи с NaN, одинаковые для минут и часов.

Итак, мое рабочее решение - если я удаляю записи в конце какого-то периода, я добавляю такое же количество записей NaN в начале этого периода с правильно уменьшающимся временем. Исключение - ежедневные записи, они только удаляются без добавления. Если после удаления период становится пустым, я заполняю его записями NaN, заканчивающимися на мое новое время окончания (с округлением до границы периода).

person Mahris    schedule 28.05.2015