@ Карта сайта News Автора!

Bog BOS: RRDtool - хранение и отображение данных мониторинга

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL

Последнее изменение файла: 2009.10.29
Скопировано с www.bog.pp.ru: 2024.11.23

Bog BOS: RRDtool - хранение и отображение данных мониторинга

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. Нельзя использовать для учета и биллинга - слишком много он усредняет и сглаживает, используя достаточно сложные алгоритмы.

Установка 1.2.13/1.2.27 (Linux RedHat 9/CentOS 5.1 x86_64)

В версии 1.2 вместо gd используется libart (антиалиасинг, прозрачность, TrueType; дополнительно вывод в форматах PDF, SVG, EPS); поддержка переменных (VDEF); изменился формат хранения данных (новая версия читает старые архивы); дополнительные библиотеки не включены в поставку; предсказание следующего значения методом Holt-Winters; отсеивание подозрительных (слишком сильно отличающихся от предсказанных) данных.

  1. проверить наличие пакетов -devel библиотек zlib, libpng, freetype, libart_lgpl
  2. скачать и развернуть архив
  3. прочитать doc/rrdbuild.txt
  4. ./configure [--prefix=/usr/local/rddtool-версия] [--disable-rrdcgi] [--enable-shared] [--disable-tcl] [--disable-python] [--disable-ruby]
  5. make
  6. make install (/usr/local/rrdtool-1.2.13)
    1. /usr/local/rrdtool-1.2.13/lib/ (librrd.la, librrd.so.2.0.7, librrd.so.2, librrd.so, librrd.a, (librrd_th.la, librrd_th.so.2.0.7, librrd_th.so.2, librrd_th.so, librrd_th.a)
    2. /usr/local/rrdtool-1.2.13/lib/perl/5.8.0/ (RRDp.pm)
    3. /usr/local/rrdtool-1.2.13/lib/perl/5.8.0/i386-linux-thread-multi/ (RRDs.pm, perllocal.pod, ntmake.pl, auto/)
    4. /usr/local/rrdtool-1.2.13/bin/ (rrdtool, rrdupdate, rrdcgi)
    5. /usr/local/rrdtool-1.2.13/include/rrd.h
    6. /usr/local/rrdtool-1.2.13/man/man1/ (bin_dec_hex.1, cdeftutorial.1, rpntutorial.1, rrd*.1)
    7. /usr/local/rrdtool-1.2.13/share/
      1. doc/rrdtool-1.2.13/ (html/, txt/)
      2. man/man3/ (RRDp.3pm, RRDs.3pm)
      3. rrdtool/fonts/DejaVuSansMono-Roman.ttf
      4. rrdtool/examples/

Установка 1.0.33 (Linux RedHat 6.2 и Solaris 2.5)

В исходники версии 1.0 включены zlib, gd (довольно старый - без поддержки png и jpeg), libpng, libcgi.

  1. скачать и развернуть архив
  2. ./configure [--prefix=/usr/local/rddtool-версия] [--enable-shared] [--with-tcllib=/path-где-лежит-tclConfig.sh] (в RedHat 6.2 tcl лежит в /usr/lib, в Solaris - в /usr/local/lib)
  3. в Solaris включить /usr/ccs/bin в PATH
  4. make
  5. make install (/usr/local/rrdtool-1.0.33)
    1. lib (librrd.a, librrd.la, perl/)
    2. bin (rrdcgi, rrdtool, rrdupdate, trytime)
    3. include/rrd.h
    4. doc/ (форматы: txt и pod)
    5. html/
    6. man/man1/
    7. examples/ (bigtops.pl, cgi-demo.cgi, minmax.pl, piped-demo.pl, shared-demo.pl, stripes.pl)
    8. contrib/
  6. make site-perl-install (perl-овые модули RRDp.pm и RRDs.pm в общедоступное место)
  7. make site-tcl-install (если был запрошен модуль для tcl)

Методика использования

    Основные этапы использования:
  1. проектирование и создание базы данных (rrdtool create)
  2. регулярное получение значения счетчика с помощью, например, snmpget; занесение значения счетчика и времени его получения (это не обязательно текущее время) в базу данных (rrdtool update)
  3. при необходимости извлечение информации из БД (rrdtool fetch)
  4. при необходимости создание графика (rrdtool graph); генерация html-страницы производится внешними средствами

Примеры использования:

Параметры передаются в командной строке или через stdin (в этом случае в командной строке должен быть знак "минус"). Для удобства в интерактивном режиме обеспечиваются команды: cd (делает chroot при работе с uid=0), mkdir, ls, quit. Описание любой команды можно получить командой: rrdtool help имя-команды (без указания имени команды выдаётся список команд).

rrdtool можно использовать по сети следующим способом (про безопасность автор не задумывался, так что рекомендую пользоваться сбором данных с помощью ssh):

Создание базы данных

rrdtool create имя-файла.rrd --start начальное-время --step интервал DS:имя-источника-данных:тип-источника-данных:heartbeat:min:max RRA:функция-консолидации:x-доля:отсчетов-на-ячейку:число-ячеек

Начальное время задается в формате timestamp или at-формате (по умолчанию - текущее время). Можно использовать также формат вида: 20010906 20:07 (без секунд!).

Интервал задает предполагаемый интервал в секундах между последовательными отсчетами, задавая таким образом (вместе с начальным временем) сетку по оси времени (по умолчанию 300 секунд).

Каждый DS (data source) описывает отдельный источник данных (их может быть несколько в одной БД). Имя источника не длинее 19 символов. Типы источников:

heartbeat устанавливает максимальный допустимый интервал в секундах между последовательными отсчетами (рекомендуется 2*step). При превышении его промежуточные отсчеты заполняются значением UNKNOWN.

Если значения min и/или max установлены (отсутствие установок определяется символом U), то обработанные значения отсчетов, выходящие за эти пределы, не используются (считаются неопределёнными).

Каждый RRA (round robin archives) для DS (может быть несколько архивов для одного источника-данных) описывает количество ячеек в архиве (после заполнения последней ячейки запись идет в первую), как вычисляется значение ячейки из значения отсчетов (функция консолидации: AVERAGE, MAX, MIN, TOTAL, LAST; сколько отсчетов комбинировать в одну ячейку).

x-доля определяет долю неопределённых значений в интервале консолидации, при которой консолидированное значение ещё считается определённым (от 0 до 1).

В версии 1.2 в дополнение к прежним функциям консолидации добавились функции сглаживания (предсказание на основе предыдущих данных) и фильтрации предположительно ошибочных данных (слишком большое отклонение от предсказанного): HWPREDICT (предсказание методом Holt-Winters), DEVPREDICT (отклонение от предсказания, взвешенное для одного цикла), FAILURES (слишком большое отклонение от предсказанного), SEASONAL (предсказание по алгоритму Holt-Winters со скользящим окном в 288 отсчётов), DEVSEASONAL.

Чтобы съимитировать поведение mrtg (600 5-минутных отсчетов, 600 30-минутных отсчетов, 600 2-часовых отсчетов, 732 дневных отсчета; хранятся усредненные за интервал отсчеты и пиковые значение 5-минутных отсчетов за интервал; всего получается 797 дней) необходимо создать следующую БД:

                           rrdtool create bd.rrd         \
                              DS:input:COUNTER:600:U:U   \
                              DS:output:COUNTER:600:U:U  \
                              RRA:AVERAGE:0.5:1:600      \
                              RRA:AVERAGE:0.5:6:700      \
                              RRA:AVERAGE:0.5:24:775     \
                              RRA:AVERAGE:0.5:288:797    \
                              RRA:MAX:0.5:1:600          \
                              RRA:MAX:0.5:6:700          \
                              RRA:MAX:0.5:24:775         \
                              RRA:MAX:0.5:288:797

Посмотреть описание БД можно с помощью команды
rrdtool info filename.rrd

Изменить размер RRA можно командой (создаётся новый файл; номер RRA можно получить командой info)
rrdtool resize filename.rrd номер-rra {GROW | SHRINK} число-ячеек

Изменить любой параметр DS можно командой
rrdtool tune filename.rrd [--heartbeat имя-ds:heartbeat] [--minimum имя-ds:min] [--maximum имя-ds:max] [--data-source-type имя-ds:тип-ds] [--data-source-rename старое-имя-ds:новое-имя-ds]

Занесение значения в БД

rrdtool update имя-файла.rrd время:значение[:значение-DS2...] ...

Время задается в at-формате или во внутреннем формате Unix. В качестве времени можно использовать символ N (текущее время). В качестве значения можно использовать символ U (unknown). rrdtool пытается интерполировать невовремя приходящие отсчеты, пытаясь привязать их к равномерной временной сетке. Реальные значения тоже хранятся для интерполяции следующих отчетов. Времена должны быть по возрастающей! Болтливый вариант команды update - updatev. Ключ --template позволяет задать последовательность (имена DS через ':'), в которой задаются значения.

Извлечение значений из БД

rrdtool fetch имя-файла.rrd функция-консолидации [--resolution секунд] [--start время] [--end время]

Используется также внутри функции построения графика. rrdtool пытается подобрать RRA подходящего разрешения или производит вычисления на ходу (по умолчанию - максимальное разрешение из имеющихся). Время начала (по умолчанию - end-1day) и конца интервала (по умолчанию - now) задается в at-формате или во внутреннем формате Unix. Результат выводится в текстовом виде на stdout по одному значению в строке в экспоненциальном формате (в начале строки выводится время во внутреннем формате Unix), первые 2 строки - заголовок (имена DS). Для гарантированного выбора RRA нужного разрешения необходимо не только задать параметр --resolution, но и параметры --start и --end, кратные выбранному разрешению, например:

TIME=$(date +%s)
RRDRES=900
rrdtool fetch имя-файла.rrd AVERAGE -r $RRDRES \
   -e $(echo $(($TIME/$RRDRES*$RRDRES))) -s e-1h

Экспорт в формате XML (определение переменной и шага см, в опсании команды graph):
rrdtool xport имя-файла.rrd [--start время] [--end время] [--maxrows число-отсчётов] [--step шаг] [определение-переменной] [XPORT:имя-переменной[:описание]] ...

Посмотреть время последнего изменения (во внутреннем формате Unix)
rrdtool last filename.rrd

Посмотреть время первого изменения определённого RRA (во внутреннем формате Unix; номер RRA можно получить командой info)
rrdtool first filename.rrd --rraindex номер-RRA

Построение графиков

rrdtool graph имя-файла [--start время] [--end время] [--step шаг] [--x-grid описание-оси-времени] [--force-rules-legend] [--y-grid описание-оси-y] [--alt-y-grid] [--no-gridfit] [--units-exponent экспонента] [--units-length число] [--vertical-label текст] [--width пикселей] [--height пикселей] [--only-graph] [--imginfo formatstring] --imgformat PNG|SVG|PDF|EPS [--zoom масштаб] [--upper-limit maxY] [--lower-limit minY] [--rigid] [--alt-autoscale] [--alt-autoscale-max] [--base кило] [--logarithmic] [--units=si] [--color элемент#rrggbb[aa]] [--font элемент:размер:[имя-файла-ttf-шрифта]] [--font-render-mode тип-сглаживания]] [--font-smoothing-threshold размер] [--tabwidth пикселов] [--no-legend] [--title текст] [--watermark текст] [--slope-mode] [--lazy] [определение-переменной] ... [определение-вида-графика] ...

В качестве имени файла можно использовать "-" (вывод на stdout).

Время начала (по умолчанию - end-1day) и конца интервала (по умолчанию - now) задается в at-формате или во внутреннем формате Unix. По умолчанию, rrdtool вычисляет размер интервала времени, приходящегося на 1 пиксел, и пытается извлечь данные с указанным разрешением. Ключ --step позволяет задать разрешение вручную (шаг меньше 1 пикселя молча игнорируется).

Описание метки оси времени и сетки (--x-grid) может быть none (отсутствие сетки), autoconfigure или GTM:GST:MTM:MST:LTM:LST:LPR:LFM. Например: MINUTE:10:HOUR:1:HOUR:1:0:%X.

Описание метки оси Y и сетки (--y-grid) может быть none (отсутствие сетки), autoconfigure или шаг-мелкой-сетки:шаг-текстовых-меток. --alt-y-grid автоматически порождает достаточно плотную метрическую сетку по оси Y (т.е. каждые 1, 2, 5 или 10 единиц или кратных им). --no-gridfit отменяет выравнивание сетки по целым пикселям. --units-exponent позволяет вручную задать единицы измерения по оси Y: 0 - единицы, 3 - k, 6 - M, -3 - m и т.д. --units-length позволяет задать число цифр в метке по оси Y. --logarithmic задаёт логарифмический масштаб по оси Y. --units=si позволяет сохранить метрические метки при логарифмическом масштабе. --force-rules-legend выводит метки осей, даже если сами оси не поместились.

--width (400) и --height (100) определяют размер области, занимаемой графиком (ещё требуется некоторое пространство на оформление). --only-graph отключает вывод сопроводительных надписей (подходит для иконок совместно с --height меньше 32).

--imginfo позволяет вывести на stdout строку текста, параметризованную именем файла и разрешением картинки. Например: --imginfo '<IMG SRC="/img/%s" WIDTH="%lu" HEIGHT="%lu" ALT="Demo">'

--zoom позволяет масштабировать график. --upper-limit задает максимальное значение Y на графике вместо автоматически вычисляемого. Если максимальное значение функции больше указанного, то не учитывается пока не указан ключ --rigid. --lower-limit задает минимальное значение Y на графике вместо автоматически вычисляемого. Если минимальное значение функции меньше указанного, то не учитывается пока не указан ключ --rigid. --alt-autoscale определяет интервал по оси Y на основе минимального и максимального значения функции не округляя до одного из предопределенных интервалов. --alt-autoscale-max не округляет только максимальное значение до одного из предопределенных интервалов.

--base определяет, что понимается под кило - 1000 или 1024 (для трафика должно быть 1000).

--color позволяет переопределить цвета элементов оформления: BACK (фон), CANVAS, SHADEA (верхняя и левая границы), SHADEB (нижняя и правая границы), GRID (мелкая сетка), MGRID (крупная сетка), FONT, AXIS (оси), FRAME (рамка), ARROW (стрелки вверх и вправо). Ключ может быть использован несколько раз.

--font позволяет переопределить для PNG шрифт и размер шрифта элементов оформления: DEFAULT, TITLE, AXIS, UNIT, LEGEND. Отслеживается также переменная окружения RRD_DEFAULT_FONT. --font-render-mode позволяет задать режим сглаживания: normal, light, mono. --font-smoothing-threshold определяет минимальный размер шрифта, который ещё будет сглаживаться (по умолчанию - 0).

--slope-mode сглаживает график.

--lazy отменяет генерацию графика, если файл существует и не устарел.

Определение переменной (может использоваться в дальнейшем; имя переменной может состоять из букв, цифр, тире и подчёркивания; не длинее 255 символов) имеет следующий вид:

Выбор RRA происходит автоматически исходя из функции консолидации и необходимого разрешения (в идеальном случае один отсчет на один пиксел; например, если разрешение RRA - 300 секунд, то для графика шириной 400 пикселов необходимо выбрать интервал 300*400 секунд, т.е. указать "--start end-2000minutes"). Если разрешение RRA выше, чем требуется, то производится дальнейшая консолидация с помощью указанной функции ( а если - ниже?).

Элементы обратной польской записи (числа, имена ранее определенных переменных и коды операций) перечисляются через запятую. Истина - 1, ложь - 0. Сравнение с неопределённым или бесконечным значением всегда даёт 0. Логарифмы натуральные. Углы в радианах. Допустимы операции: +, -, *, /, %, SIN, COS, LOG, EXP, SQRT, ATAN, ATAN2 (первым извлекается x, затем y), DEG2RAD, RAD2DEG, FLOOR, CEIL, LT, LE, GT, GE, EQ, IF (извлекает 3 элемента из стека; если последнее извлеченное значение не 0, т.е. истина, то в стек кладется второе извлеченное значение, иначе - первое), MIN, MAX, LIMIT (первые 2 значения из стека определяют границы, если третье значение лежит внутри этих границ, то оно кладется в стек, иначе в стек кладется неопределенное значение), DUP (дублирует верхний элемент стека), EXC (меняет 2 верхних элемента местами), POP (удаляет верхний элемент из стека), UN (если верхний элемент стека является неопределенным значением, то он заменяется на 1, иначе - на 0), UNKN (в стек кладется неопределенное значение), INF (бесконечность в стек), NEGINF (отрицательная бесконечность), ISINF (если верхний элемент стека является бесконечным значением, то он заменяется на 1, иначе - на 0), SORT (первый извлечённый элемент определяет число элементов для сортировки), REV (обратить последовательность, первый извлечённый элемент определяет число элементов), TREND (усреднение, первый извлечённый элемент определяет интервал времени), PREV (если это первый отсчет, то неопределенное значение в стек, иначе значение данного DS, вычисленное на предыдущем шаге), PREV(имя-переменной) (если это первый отсчет, то неопределенное значение в стек, иначе значение данной переменной VDEF, вычисленное на предыдущем шаге), COUNT (поместить в стек индекс текущего значения в DS), NOW (текущее время), TIME (время отсчета), LTIME (TIME с добавлением смещения временой зоны и учетом летнего времени). Агрегирующие операции для VDEF: MAXIMUM, MINIMUM, AVERAGE, LAST, FIRST, TOTAL (сумма значений, умноженных на интервал отсчёта; например, можно получить общий траффик по БД скоростей), PERCENT (первый параметр - число процентов; второй - имя DS или CDEF; значения последовательности сортируются; возвращается такое число, что заданный процент значений не превышает его), параметры корреляции (LSLSLOPE, LSLINT, LSLCORREL).

Примеры обратной польской записи:

Определение вида графика:

Символы ':' в тексте и легендах необходимо защищать обратной косой чертой. Управление форматированием текста:

Формат:

Пример наложения графиков текущей и предыдущей недели:

...
--end now --start end-1w \
DEF:thisweek=router.rrd:ds0:AVERAGE \
DEF:lastweek=router.rrd:ds0:AVERAGE:end=now-1w:start=end-1w \
...

Обмен данными

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

Вывод в файл в формате XML: rrdtool dump filename.rrd > filename.xml

Чтение из файла в формате XML (возможна проверка минимальных и максимальных значений): rrdtool restore filename.xml filename.rrd [--range-check] [--force-overwrite]

at-формат указания времени

Состоит из двух частей:

  1. опорное время (по умолчанию - now) состоит из
    1. времени дня (HH:MM, HH.MM, HH, midnight, noon)
    2. дня (имя-месяца день-месяца [год], yesterday, today, tomorrow, MM/DD/[YY]YY, DD.MM.[YY]YY, YYYYMMDD)
    В качестве исключения можно использовать формат: 19970703 12:45
  2. смещение относительно опорного времени (в одно смещение можно конкатенировать несколько единиц - 1h30m; можно использовать несколько смещений - -6h+15min)
    1. знак (+ или -)
    2. число
    3. единица измерения (years, months, weeks, days, hours, minutes, seconds); можно сокращать вплоть до одной буквы; чтобы понять, что означает буква m - минуты или месяца программе приходится читать мысли ;)

Пробелы (и заменяющие их подчеркивания или запятые) вставляются по вкусу (закавычивать для shell не забывайте!).

В качестве опорного времени для начала можно использовать слово end, а опорного времени для конца интервала можно использовать слово start (цикл ссылок устраивать не надо!).

Результат может вас удивить (May 31 -1month есть 1 мая!), особенно в момент перехода на летнее время и обратно.

Сбор информации с удаленных хостов с помощью SSH

SSH довольно медленно инициализирует сеанс, поэтому сбор информации с удалённых хостов необходимо пакетировать:

  1. настроить выполнение пакетной команды ssh без задания пароля
    1. на хранящем базу хосте создать специальный ключ для работы rrdtool
      ssh-keygen -t dsa -b 2048 -N "" -f ~/.ssh/rrdtool
    2. на остальных хостах добавить его в ~/.ssh/authorized_keys с командой ~/rrdtool/gather_answer.sh
  2. на хранящем базу хосте в crontab внести выполнение каждые 5 минут ~/rrdtool/gather_query.sh
  3. gather_query.sh: обращается по ssh ко всем хостам и складывает результат в ~/rrdtool/имя-хоста.data
  4. gather_answer.sh: собирает необходимую информацию в зависимости от имени локального хоста и выводит её на stdout

Ссылки

@ Карта сайта News Автора!

Bog BOS: RRDtool - хранение и отображение данных мониторинга

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru