Страница 1 из 2

Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 1:24:10
FreeBSP
могу написать заметку о том как с нуля вручную рисовать какие нибудь красивые графики, используя только пакет rrdtool
кому нибудь интересна тема?

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 8:32:51
hizel
:-D

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 10:20:58
ProFTP
интересно, правда я еще не гуглил

вот как на счет графики и диаграмм на JS (jquery) ?

http://msug.vn.ua/blogs/akrakovetsky/ar ... aries.aspx
http://webduty.ru/%D0%BF%D0%BE%D1%81%D1 ... %D0%B0.htm

http://www.google.com.ua/#hl=uk&q=%D0%B ... 1d94482ac6

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 13:24:09
FreeBSP
дядя hizel, чего такого смешного?))

я достаточно долго втыкал в суть проектировки самой кольцевой бд
создавая по примеру, оно конечно работает, но непонимание сути работы интересной вещи меня напрягало..
сейчас вроде бы разобралсо, вот думал поделиться, да не знаю надо ли...

насчет жквери
как я понял, система лишь рисует график, причем на лету, но ни сбором информации ни ее обработкой не занимается

rrd же сам полностью занимается как сбором информации в базу, так и ее обработкой и визуализацией
тоесть ему например скармливаешь значение счетчика ipfw и из этих цыферек средствами самого rrd вычисляется скорость, и рисуется красивый график

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 13:34:10
hizel
FreeBSP писал(а): rrd же сам полностью занимается как сбором информации в базу, так и ее обработкой и визуализацией
ничего rrdtool не собирает, что сунешь то и положит

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 14:03:28
_Попов
FreeBSP, никаво не слушай - пиши статью как думаешь, если че тебя подкорректируют, т.е. не тока людям поможешь, но еще и сам умнее станешь.

пиши статью в расчете на "баранов", в смысле чтобы нулевой человек прочитал и понял: зачем? как? и сколько вешать в граммах?

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 14:33:40
FreeBSP
hizel писал(а):ничего rrdtool не собирает, что сунешь то и положит
виноват. числовые значения естествено надо самостоятельно получить, а rrd занимается их запихиванием в базу

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 14:35:24
hizel
есть еще жабаскрипт который кушает rrd файлы и рисует, лежит на sourceforge.net и не дружит с частью браузеров

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 17:04:05
FreeBSP
по-моему практичнее раз в 5-10 минут по-новой генерировать рисунки и их уже статически вставлять в страничку
нагрузки меньше получается, да и переносимость выше....
хотя жаваскриптина - вещь безусловно интересная, надо покопаться...

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 17:40:27
thefree
_live.daemony.org начитался? там очень доходчиво рисунки расписаны

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 17:57:31
FreeBSP
типа того
но как я уже говорил, долго не мог воткнуть в принципы проектирования самой бд

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 18:06:57
_Гагарин
ну, пиши статью
я не хочу долго дотыкать

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 18:14:05
thefree
если по шагам распишешь как проектировать саму БД, то я за!!! и руками и ногами

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 20:08:34
FreeBSP
рабочий вариант тут http://www.lissyara.su/?id=2088
В РАБОТЕ, принимаются замечания)
ну тогда прям тут и начну
в общем то даже и статья-не статья,а так, сборная солянка из других источников, помноженная на собственое видение ситуации

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

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

Код: Выделить всё

# csup -L 2 /usr/local/etc/ports-supfile 
# cd /usr/ports/databases/rrdtool
# make config install clean

если хотим материться с картинок на родном великорусском, то отмечаем опцию DEJAVU Use DejaVu fonts (requires X11) без нее вместо русских буковок на картинках будет всякая абракадабра)
кроме того, если вы - адепт перла/руби/пистона, ставим соответствующие опции. у меня еще выбрана опция mmap

трогать rc.conf не надо, ибо никаких демонов и серверов запускаться не будет, да и настраивать в общем то нечего

теперь пора создавать свою первую, а может и не первую, и надеюсь не последнюю базу
а начинается создание с проектировки)
кольцевая база данных представляет собой обычный файл, тоесть ни какой то СУБД, ни таблиц, ни администраторов...

Код: Выделить всё

[19:04]rrd/# file local-inet-internal-http_traffic.rrd
local-inet-internal-http_traffic.rrd: RRDTool DB version 0003

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

теперь пора подумать, КАКИЕ числа мы будем в нее класть. а числа могут быть самыми разнообразными, вплоть до скорости течения воды в реке, или направления и скорости ветра. годовую розу ветров rrdtool строить конечно не умеет, но даже это можно будет некоторым образом изобразить
Не знаю как кому, но мне розы ветров по барабану, есть и поважнее данные которые хочется визуализировать, например оперативка, которая вечно куда то утекает..

итак, что мы будем визуализировать - решили - свободную оперативку
далее. где мы ее будем брать. источник данных в принципе не важен, но мы должны знать в каком формате он поставляет данные и как из этого выдернуть нужные нам цыфры.
вариантов не то чтобы куча, но имеются несколько - sysctl, vmstat, top, snmp...
Daemony выбрал первый, и я с ним согласен... данные получаем из "уважаемых" системных переменных с точностью до размера сраницы(обычно 4096 байт). если кто присоветует откуда брать более точные данные - хвала ему и почет и благодарность от меня лично ))
значит число свободных страниц оперативки лежит тут vm.stats.vm.v_free_count а размер страницы в байтах - соответствено тут vm.stats.vm.v_page_size.то-есть число свободных байтов оперативки получается банальным перемножением второго на первое )

мы уже знаем, что хранить мы будет число свободных байтов ОП.
как часто нам надо это знать. мне например интересно знать это каждую минуту
того что мы уже знаем достаточно для того чтобы заложить первую часть нашей БД
сама процедура создания не долгая, но долго набивать все параметры и ключи в командной строке. поэтому начинаем стругать скриптик)

Код: Выделить всё

#!/bin/sh

rrdtool create freeram.rrd --step 60 \
DS:freeram:GAUGE:120:U:U             \
тут самое время вернуться к теории
Параметр DS (Data Source, истояник данных) описывает какие данные приходят, как они себя могут вести и определяет некоторые граничные условия
кроме того, есть параметр RRA(Round Robin Archive, собствено хранилище данных) - он описывает что делать с пришедшими данными, как их хранить, что делать с уже накопленными данными при поступлении новых и как из имеющихся данных и поступивших получить новое значения для данной ячейки хранения
Каждая бд содержит как минимум один DS (Data Source, истояник данных) и минимум один RRA(Round Robin Archive, собствено хранилище данных)

кроме того, числа поступающие в бд завязаны на времени, так как все расчеты при добавлении новых данных в бд опираются на промежуток времени между предыдущим и текущим добавлениями

в базе может быть несколько DS и несколько RRA
а теперь интересный момент: полный комплект описанных RRA создается ДЛЯ КАЖДОГО DS. то есть если описать 2 DS и 4 RRA то в итоге получится всего 8 штук RRA, по 4 штуки на каждый DS
удостоверитья этом можно командой rrdtool info filename.rrd
одновременно с этим, при выборке информации из базы нельзя указать из какого RRA брать информацию - система сама выберет RRA с наилучшим масштабом, покрывающий требуемый промежуток времени


при описании DS мы ограничимся частным случаем. в большинстве ситуаций этого хватит, а что что сюда не попадает - не шибко описано и у самого Тоби. в этом самом частном случае DS задается так: DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max
вначале ключевое слово DS
затем имя из латинских букв, цифр и подчеркивания [a-zA-Z0-9_]
затем тип DS, об этом ниже
затем heartbeat - максимальное время, в течение которого интервал не заполняется значениями *UNKNOWN*
затем максимальное и минимальное значение

теперь немного о типах DS
GAUGE - это "для вещей типа температуры, или количества людей в комнате" ©
то есть некоторая величина, которая характеризует состояние измеряемой величины в данный момент и которая ляжет в базу без обработки
COUNTER - "для постоянно растущих величин, типа числа байтов прошедщих через интерфейс". не может уменьшаться. хранится как скорость изменения величины в секунду(per-second rate.)
DERIVE - грубо говоря, это counter который может уменьшаться. хранит изменение величины от предыдущего значения до текущего значения DS
ABSOLUTE - используется для счетчиков, которые сбрасываются при чтении

а сейчас настало время поговоить об RRA. задаются они так
RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows

ключевое слово RRA
затем функция консолидации,
т.н. x-files factor - максимальная доля неопределенных значений в интервале конолидации, при которой значение еще считается определенным
steps - размер интервала консолидации в шагах (параметр --step). все полученные значения в течение этого интервала преобразуются функцией консолидации в одно значение, которое кладется в очередную ячейку базы
rows - количество ячеек в этом RRA
с функциями консолидации проще чем с типами DS
они все используются для получения итогового значения, которое ляжет в базу из ряда значений DS
AVERAGE вычисляет реднее на интервале консолидации
MIN , MAX и LAST - соответственно минимальное, максимальное и последнее значения
меня терзают смутные сомнения о том что при записи в базу поверх уже существующих значений опять же применяются эти функции, но об этом завтра

теперь надо думать, какие графики мы хотим получать и с какой точностью
например если строить 6-часовой график, а значения получаются каждую минуту, то при ширине графика в 720 пикселей мы получим масштаб 2 пикселя на минуту
если же в те же 720 пикселей впихнуть год, с точностью до минуты, то получится что то около 720 минут на пиксель.
отсюда вывод - хранить большие интервалы времени с большой точностью не целесообразно потому, что 1) точности не увидишь, 2) база разрастется до десятков мегабайт
например я хочу рисовать графики за последние 6 часов, за сутки, 3 суток, неделю месяц, 3 месяца, 6 месцев

из расчета 720px на график - сделаю один rra на последние двое суток без усреднения, один - на период еще какой то , а остальные rra я опишу завтра)
завтра же бнапишу о том как базу заполнять и как собственно рисовать, там уже теории почти нет, чисто практика..

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 20:52:42
Alex Keda
несмотря на то что ты тока начал -я уже полезное нашёл.
галку про дежавю - всё бился чё на новом сервере не по русски пишет =))

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 20:54:11
FreeBSP
гы
Лис, я кстати тебе в жабу писал, по этому поводу, но что то ответа не услышал)
помогла пересборка с дежавю??

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-15 22:16:13
Alex Keda
не приходило ничё...
=========
да, помогло.
========
кстати, было бы интересней дату в собственном формате настроить.
мне дни недели в двухбуквенном обозначении нах не нужны.
а вот чё-то типа 2010-03-15 - куда ближе

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-16 11:00:47
ADRE
один человек уже окучил, данную проблемму, сайт откопаю выложу )

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-16 12:55:35
ADRE
_http://live.daemony.org/?s=rrdtool - отсюда может что выкарчивать -) читал радовался, сколько времени сэкономил ))

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-03-16 13:09:15
FreeBSP
там я тоже копал, собственно с этой статьи я сам и начинал
но в построение самой базы не воткнул только по тем материалам, дополнительно еще копался, доки с сайта читал..

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-08-08 15:06:56
BI_J
Доброго времени суток!!!

Подскажите как уберечь статистику после перезапуска сервера ????
Я так понимаю нужно ложить в какую-то БД....
Подскажите как это реализовать :oops:
Спасибо !!

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-08-08 18:24:12
FreeBSP
о какой статистике речь?

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

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-08-08 18:34:25
BI_J
Я тоже так думал, пока IPFW не перезапустил :(
После перезапуска счетчики IPFW обнуляются, а графики обнуляются после срабатывания скрипта обновления БД rrd

Что у меня не так ?? :(

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-08-08 19:28:29
FreeBSP
BI_J писал(а):Что у меня не так ?? :(
равновероятно что не так может быть что угодно - от ядра и то каких то конфигов
покажи что ли конфиги там, скрипты которыми собираешь, еще что..

Re: Заметка: rrdtool, или занимательное рисование

Добавлено: 2010-08-08 19:51:00
BI_J
creat_db.sh

Код: Выделить всё

#!/bin/sh
#
RRDPREFIX=/usr/local/www/apache22/data/rrd/db
rrdtool create $RRDPREFIX/traf-db.rrd \
--step 60 \
DS:KSin:COUNTER:120:U:U \
DS:KSout:COUNTER:120:U:U \
RRA:AVERAGE:0.5:1:6000 \
RRA:AVERAGE:0.5:5:6000 \
RRA:AVERAGE:0.5:30:7000 \
RRA:AVERAGE:0.5:120:7750 \
RRA:AVERAGE:0.5:1440:7970 \
RRA:MAX:0.5:1:6000 \
RRA:MAX:0.5:5:6000 \
RRA:MAX:0.5:30:7000 \
RRA:MAX:0.5:120:7750 \
RRA:MAX:0.5:1440:7970 \
RRA:MIN:0.5:1:6000 \
RRA:MIN:0.5:5:6000 \
RRA:MIN:0.5:30:7000 \
RRA:MIN:0.5:120:7750 \
RRA:MIN:0.5:1440:7970 \
RRA:LAST:0.5:1:6000 \
RRA:LAST:0.5:5:6000 \
RRA:LAST:0.5:30:7000 \
RRA:LAST:0.5:120:7750 \
RRA:LAST:0.5:1440:7970 \
update_db.sh

Код: Выделить всё

#!/bin/sh
#
RRDPREFIX=/usr/local/www/apache22/data/rrd/db

        KSin=`/sbin/ipfw show 120 | awk '{print $3}'`
        KSout=`/sbin/ipfw show 110 | awk '{print $3}'`
        `/usr/local/bin/rrdtool update $RRDPREFIX/traf-db.rrd N:$KSin:$KSout`
1h.sh

Код: Выделить всё

#!/bin/sh
#
export LANG=KOI8-R
export LC_ALL=ru_RU.KOI8-R
RRDPREFIX=/usr/local/www/apache22/data/rrd/db
WWWPREFIX=/usr/local/www/apache22/data/rrd/www-pub
RRDCMD="/usr/local/bin/rrdtool"

$RRDCMD graph $WWWPREFIX/KS_1h.png \
--width 760 \
--height 200 \
--imgformat PNG \
--start -1h \
--end now \
--slope-mode \
--font-render-mode light \
--font DEFAULT:8:Tahoma \
--font TITLE:7:Arial \
--font AXIS:6:Arial \
--font UNIT:7:"Courier New" \
--font LEGEND:6:"Courier New" \
--font WATERMARK:1:Arial \
--color BACK#2F2F2F \
--color CANVAS#003333 \
--color SHADEA#CCCCCC \
--color SHADEB#CCCCCC \
--color FONT#FFFFFF \
--color AXIS#FFFFFF \
--color ARROW#FF0000 \
--color GRID#CCCCCC \
--color MGRID#CCCCCC \
--vertical-label "Скорость бит/секунду" \
--title "Трафик GPRS Kyivstar за час" \
DEF:inoctetsKS=$RRDPREFIX/traf-db.rrd:KSin:AVERAGE \
DEF:outoctetsKS=$RRDPREFIX/traf-db.rrd:KSout:AVERAGE \
"CDEF:inbitsKS=inoctetsKS,8,*" \
"CDEF:outbitsKS=outoctetsKS,8,*" \
COMMENT:\\n \
AREA:outbitsKS#FF0000:"GPRS Kyivstar исходящий\: " \
GPRINT:outbitsKS:LAST:"Последнее %6.2lf %sbps " \
GPRINT:outbitsKS:MAX:"Максимальное %6.2lf %sbps " \
GPRINT:outbitsKS:AVERAGE:"Среднее %6.2lf %sbps " \
GPRINT:outbitsKS:MIN:"Минимальное %6.2lf %sbps "\\c \
COMMENT:\\n \
AREA:inbitsKS#FFFF00:"GPRS Kyivstar входящий\:  " \
GPRINT:inbitsKS:LAST:"Последнее %6.2lf %sbps " \
GPRINT:inbitsKS:MAX:"Максимальное %6.2lf %sbps " \
GPRINT:inbitsKS:AVERAGE:"Среднее %6.2lf %sbps " \
GPRINT:inbitsKS:MIN:"Минимальное %6.2lf %sbps "\\c \
COMMENT:\\n \