Apr 11, 2012

RRDTool пример использования в python

RRDtool (Round Robin Database). Обеспечивает хранение и отображение данных мониторинга (загрузка каналов, температура и любая другая зависящая от времени последовательность данных, которую можно получить некоторым способом). Задумывалась как повторная, но более правильная реализация MRTG. Объём хранимых данных не увеличивается со временем (ячейки хранения используются циклически). Использование различных функций консолидации данных позволяет охватывать большие интервалы времени без чрезмерного увеличения объема БД за счет снижения разрешающей способности. В отличие от mrtg, программа не упаковывает старые данные самостоятельно, это надо предусматривать при проектировании БД. Сбор информации и генерация HTML-кода также производится с помощью внешних средств. Более мощные средства генерации графиков. Все времена во внутреннем формате Unix (число секунд с 1 января 1970 в UTC). Значения счетчиков могут быть целыми или вещественными числами или специальным значением UNKNOWN. Лицензия - GPL (но автор не будет против, если в благодарность послать ему CD/DVD из указанного им списка; при установке rrdtool имитируется заказ CD на amazone.com ;-). Необходимо иметь perl 5 (без perl rrdtool соберется, но не будет модулей подержки perl) и обычный набор средств компиляции (make, gcc, autoconf, automake, libtool). Имеется также поддержка tcl и python. Нельзя использовать для учета и биллинга - слишком много он усредняет и сглаживает, используя достаточно сложные алгоритмы.

Очень хорошее описание http://www.bog.pp.ru/work/rrdtool.html#at

Создаем файл

rrd_file = "/usr/local/www/nagios/2week.rrd"
def rrd_create(rrd_file):
    if not os.path.isfile(rrd_file):
        rrdtool.create(rrd_file,
                        "--step", "86400",
                        "DS:available:GAUGE:172800:0.0:100.0",
                        "RRA:AVERAGE:0.5:1:366",
                       )
step - интервал через который будут обновляться значения. У нас 86400 сек - это 1 день т.е. ежедневно.
DS:available:GAUGE:172800:0:100 - источник данных
available - название источника
GAUGE - тип (в данном случае поддерживает числа с плавающей точкой)
172800 - значение которое должно быть 2*step :)
0:100 - интервал допустимых значений

RRA:AVERAGE:0.5:1:366 - архив значений
AVERAGE - тип (в данном случае среднее значение)
1:366 - означает что в архиве 366 записей с интервалом 1*step

Вносим данные

def rrd_update(rrd_file, value):
    rrdtool.update(rrd_file, "N:%s" % str(value))
N - означает на текущее время (Now)
через двоеточие указываются значения DS (В случае нескольких DS могло быть так N:%s:%s:%s)

Создаем график в png

import tempfile
fd,path = tempfile.mkstemp('.png')
rrdtool.graph("/tmp/net.png",
            "--imgformat", "PNG",
            "--height", "250",
            "--width", "550",
            "--end", "now",
            "--start", "end-2w-1h",
            "--lower-limit", "99.3",
            "--upper-limit", "100.0",
            "--zoom", "1.5",
            "--y-grid", "0.05:1",
            "--x-grid=DAY:1:DAY:1:DAY:2:0:%a",
            "--right-axis", "1:0",
            "--right-axis-format", "%0.2lf%%",
            "--slope-mode",
            "--vertical-label=Up times/day",
            "DEF:avl=%s:available:AVERAGE" % rrd_file,
            "AREA:avl#00FF00:Up times(%)",
            'GPRINT:avl:AVERAGE:avg\: %2.2lf%%')

Описание всех параметров есть в ссылке приведенной выше.

Backup и Restore

Фаил rrd платформо зависим и может не заработать на другом железе или ОС (например из 32бит в 64бит), поэтому принято хранить бэкапы в xml.

$ rrdtool dump файл.rrd > бэкап.xml

XML можно править вручную и залить обратно в rrd.

$ rrdtool restore бэкап.xml > файл.rrd

Результат:

../../../_images/rrdtool.png

rrdtool пример графика

Для обучения лучше выбрать меньший интервал чем 1 день, например 2 мин (step = 120).


Comments

comments powered by Disqus