У меня есть несколько графиков, созданных RRDTool, которые собирали неверные данные в течение пары часов.
Как я могу удалить данные из RRD за этот период времени, чтобы они больше не отображались?
У меня есть несколько графиков, созданных RRDTool, которые собирали неверные данные в течение пары часов.
Как я могу удалить данные из RRD за этот период времени, чтобы они больше не отображались?
Лучший способ, который я нашел для этого...
У меня была аналогичная проблема, когда я хотел отбросить последние несколько часов из моих баз данных 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,
Работал на меня. Надеюсь, это поможет кому-то еще.
Если вы хотите избежать записи и редактирования файла xml, так как это может занять несколько вызовов ввода-вывода файла (в зависимости от того, сколько у вас неверных данных), вы также можете прочитать весь rrd в память, используя выборку и обновление значений в памяти.
Я выполнил аналогичную задачу, используя python + rrdtool, и в итоге я сделал:
- читать rrd в памяти в словаре
- исправить значения в словаре
- удалить существующий файл rrd
- создать новый rrd с тем же именем.
Единственным, кто предложил, что именно редактировать, был RobM. Я попробовал его решение, и оно у меня не сработало в rrdtool 1.4.7.
В моей базе данных используются AVERAGE, MAX и MIN. Он содержит DERIVE, GAUGE и COMPUTED. Интервалы: секунда (70), минута (70), час (25), день (367). Моя задача: удалить последнюю часть (типичная причина: часы перевели назад).
Я применил решение RobM: изменить на мое новое время окончания, удалить все после него. Восстановленная база данных выглядела нормально. Но он не принял новых дополнений. Я исследовал только что созданную пустую базу данных. И я нашел в нем 70-секундные записи с NaN, одинаковые для минут и часов.
Итак, мое рабочее решение - если я удаляю записи в конце какого-то периода, я добавляю такое же количество записей NaN в начале этого периода с правильно уменьшающимся временем. Исключение - ежедневные записи, они только удаляются без добавления. Если после удаления период становится пустым, я заполняю его записями NaN, заканчивающимися на мое новое время окончания (с округлением до границы периода).