пики в rrd |
#!/usr/bin/env python import os import shutil from xml.etree import ElementTree as ET from optparse import OptionParser __version__ = '0.1' def get_configuration(): parser = OptionParser(version="%prog v" + __version__, usage="%prog") parser.add_option("-v", "--verbose", action="count", default=0, help="produce more output") parser.add_option('-b', '--border', action ='store', default=10**10, help='Min value of peak. Default 100000') options, args = parser.parse_args() if not os.path.isfile(args[0]): parser.error("Not found file") return [ options ] + args def main(): options, filename = get_configuration() try: rrd_dump = os.system("rrdtool dump '%s' > 'old.xml'" % (filename)) except: print "Error RRD file type" raise if not os.path.exists('rrd_bak'): os.makedirs('rrd_bak') shutil.copy2(filename, 'rrd_bak') tree = ET.parse('old.xml') def iterparent(tree): for parent in tree.getiterator(): for child in parent: yield parent, child for parent, child in iterparent(tree): if child.tag == 'v': if float(child.text) > options.border: print 'peak detect in %s' % filename child.text = 'NaN' tree.write('new.xml') os.unlink(filename) os.system("rrdtool restore 'new.xml' '%s'" % filename) os.unlink('new.xml') os.unlink('old.xml') if __name__ == '__main__': import sys sys.exit(main())
Для того что бы парсить параметры командной строки воспользуемся модулем optparse
def get_configuration(): parser = OptionParser(version="%prog v" + __version__, usage="%progДампим rrd файл в xml") parser.add_option("-v", "--verbose", action="count", default=0, help="produce more output") parser.add_option('-b', '--border', action ='store', default=10**10, help='Min value of peak. Default 100000') options, args = parser.parse_args() if not os.path.isfile(args[0]): parser.error("Not found file") return [ options ] + args
try: rrd_dump = os.system("rrdtool dump '%s' > 'old.xml'" % (filename)) except: print "Error RRD file type" raiseНа всякий случай копируем старый rrd в папку rrd_bak
if not os.path.exists('rrd_bak'): os.makedirs('rrd_bak') shutil.copy2(filename, 'rrd_bak')Функция для получения списока всех элементов из xml
def iterparent(tree): for parent in tree.getiterator(): for child in parent: yield parent, childЗаписи в xml выглядят так
Пробегаем по всем тегам|
1.2531404050e+04 1.1760614140e+03 1.0547667362e+01 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00 |
6.2535788107e+03 6.5077305135e+02 5.9844172295e+00 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00 |
7.4349123852e+03 7.2086196285e+02 6.7862914917e+00 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00 |
6.6044470194e+03 6.1316221529e+02 6.2081965076e+00 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00 |
1.6377377735e+04 2.8213539887e+03 1.4662221016e+01 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00 ...
1.4991881969e+04 1.9741971231e+03 1.3208469357e+01 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00
for parent, child in iterparent(tree): if child.tag == 'v': if float(child.text) > options.border: print 'peak detect in %s' % filename child.text = 'NaN'Сохраняем xml и импортируем изменения в rrd
tree.write('new.xml') os.system("rrdtool restore 'new.xml' '%s'" % filename)Полученный результат
rrd график без пиков |
#!/bin/bash if [ -a $1 ] then for file in $1* do echo $file python killerpeak.py $file done fi echo "Don't forget delete directory rrd_bak if all is ok" exit 0Запуск скрипта killerpeak.py
sudo ./killerpeak.py data/rrdfile/7890.rrd peak detect in data/rrdfile/7890.rrd peak detect in data/rrdfile/7890.rrd peak detect in data/rrdfile/7890.rrd peak detect in data/rrdfile/7890.rrdЗапуск скрипта на bash killpeak.sh
./killpeak.sh data/rrdfile
Взять код или поправить можно на github https://github.com/uralbash/rrd_killerpeak
Комментариев нет:
Отправить комментарий