![]() |
| пики в 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 ")
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
Дампим rrd файл в xmltry:
rrd_dump = os.system("rrdtool dump '%s' > 'old.xml'" % (filename))
except:
print "Error RRD file type"
raise
На всякий случай копируем старый rrd в папку rrd_bakif not os.path.exists('rrd_bak'):
os.makedirs('rrd_bak')
shutil.copy2(filename, 'rrd_bak')
Функция для получения списока всех элементов из xmldef 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 и импортируем изменения в rrdtree.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.pysudo ./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


Комментариев нет:
Отправить комментарий