RRDTool. Теория и практика.
Как оно работает
Установка и настройка
Создание БД
Обновление БД
Генерация рисунков
Опции (Временной диапазон Заголовки Размеры Лимиты Сетка Прочее)
Работа с данными (DEF VDEF CDEF)
Отрисовка графика
Вывод текста
Пример генерации рисунка
Генерация рисунка через rrdcgi
Дополнительные возможности
Просмотреть информацию о базе данных (info)
Экспорт и импорт RRD-базы (dump)
Экспорт RRD-базы в XML (xport)
Внешние возможности
Weathermap4RRD
Что и как можно мониторить
Приложения
Спецификация AT-формата времени и временных диапазонов, реализованная в RDTool
Ссылки
Как оно работает
Итак, рассмотрим общую логику работы rrdtool. Вначале мы создаем так называемую round-robin database (кольцевая или закольцованная база), в которую можно записывать показания счетчиков. Почему round-robin – т.к. в базе хранится только определенное количество ячеек данных, иначе постоянно увеличивающееся количество поступающих данных просто-напросто переполнит файл данных лишней, устаревшей информацией. Возникает закономерный вопрос – как сделать график, например, за год работы? Было выбрано очень грамотное решение – записывать в одну ячейку данных несколько показателей, производя над ними некую статистическую функцию. В каждую round-robin базу данных можно записывать несколько рядов ячеек, принимающих показатели из одного источника, но по-иному комбинируя поступающие данные. Ну а график строится банальным извлечением данных из базы за определенный период.
Как все это выглядит на практике? В первую очередь нужно решить, за какими данными мы будем следить. Естественно, на первый план выходит контроль трафика маршрутизаторов, коммутаторов, нагрузка аппаратной части серверов (загрузка ЦП, использование жестких дисков, контроль работы сетевых интерфейсов, объем свободной памяти и прочее), нагрузка на сетевые сервисы, такие как http, ftp, proxy сервера. И первый вопрос, который встает перед нами, – как собирать статистическую информацию. Наиболее общим решением является использование протокола snmp, но это не всегда является приемлемым для некоторых целей, например, статистики http сервера. Тогда на помощь приходят различные утилиты анализаии log-файлов, счетчики программных firewall’ов.
Если используется snmp, то для снятия статистики достаточно иметь программы, вроде snmpget и документацию по OID’ам соответствующего оборудования (например, по оборудованию cisco всегда можно найти список поддерживаемых OID’ов для конкретного устройства). В противном случае приходится вручную задавать команду для анализа необходимых параметров. Главные критерии в выборе метода – скорость, доступность и надежность.
Конечно, необходимо учесть, что ценность статистической информации в ее постоянном контроле, то есть если взглянуть на состояние системы в данный момент, то вряд ли можно понять, справляется ли она с нагрузкой, увидеть рост нагрузки и выявить момент, когда что-либо будет нуждаться в замене или усовершенствовании. Определившись с источником информации, можно приступить к написанию скрипта для rrdtool.
Для начала некоторые сведения о структуре скриптов. Изначально создаются 2 или три скрипта, один из которых выполняется однократно, создавая round-robin базы данных при помощи rrdtool create. Далее необходимо переодически запускать скрипт обновления round-robin databases (далее rrdb), который снимает показания с различных сенсоров и передает их в rrdb при помощи rrdtool-update, кроме того, в этот скрипт можно включить генерацию графиков (rrdtool graph). В некоторых случаях можно вынести генерацию графиков в cgi скрипт, тогда каждый раз при вызове cgi скрипта будут генерироваться графики. Второй вариант подходит при использовании mod_expire (модуль apache, позволяющий указать периоды устаревания статических данных, таких как рисунки) и является весьма практичным, т.к. графики обновляются тогда, когда запрашиваются данные, и только в том случае, если старые данные устарели (очень большое преимущество по сравнению c mrtg). При создании скрипта обновления rrdb необходимо учесть, что вызываться он будет весьма часто и при большом количестве собираемых данных может сильно “тормозить” систему. Для таких языков, как perl и python написаны соответствующие библиотеки для доступа к rrdb, поэтому часто целесообразно использовать именно их. Однако, в данной статье я буду ориентироваться все же на shell скрипты, т.к. наиболее ресурсоемким является вызов внешних программ сбора данных, таких как snmpget.
Установка и настройка
Установка rrdtool проблем вызывать не должна: выбираем нужную версию в требуемом формате (для FreeBSD, например, лучше всего использовать систему портов). Rrdtool содержит также несколько сторонних библиотек, таких как libgd (для генерации графики), libpng (для генерации png изображений), а также zlib (для компрессии изображений). Установка проблем не вызывает, только нужно указать в аргументах к configure –enable-shared=yes для создания разделяемых библиотек rrdtool для дальнейшего их использования другими программами.
Создание БД
Итак, для начала опишу применение утилит из пакета rrdtool. Для создания rrdb используется команда rrdtool create, имеющая следующий синтаксис:
./rrdtool create filename.rrd --step длительность_шага \ DS:имя_источника:тип_источника:интервал_определенности:min:max \ RRA:функция_конс:достоверность:отсчетов_на_ячейку:число_ячеек
Параметр filename.rrd указывает имя файла rrdb (может быть абсолютным или относительным, что, конечно же, решается на этапе подстановки самой shell), –step длительность_шага – задает число секунд между предполагаемыми обновлениями rrdb, далее следуют определения источников данных (DS). Строки DS описывают источники данных, которые будут поступать в rrdb, параметры DS-line означают следующее:имя_источника – символическое имя DS, по которому к нему будет идти обращение
тип_источника – символическая константа, определяющая выбор функции для помещения нового значения в rrdb,
допустимые значения:
COUNTER: для получения текущего значения отсчета предыдущее значение счетчика вычитается из текущего и делится на интервал между отсчетами (например, счетчик переданных байт для измерения скорости). Переполнение счетчика обрабатывается только для типа COUNTER. Счетчики могут хранить только целые 32-х или 64-х битные числа
GAUGE: получаемое значение просто кладется в rrdb (например, для счетчика загрузки CPU или температуры, когда нужна не разность, а само значение)
DERIVE: COUNTER, который может уменьшаться (защиты от переполнения нет)
ABSOLUTE: получаемое значение делится на интервал времени между отсчетами, полезно для обнуляющихся при чтении источников данных
COMPUTE: на разбирался. Если кто разбирался – буду признателен за комментарий
интервал_определенности (heartbeat) – значение (в секундах), определяющее, сколько времени может пройти, пока при непоступлении новых данных от счетчика в rrdb будут записываться значения Unknown (обычное значение – 2*длительность_шага)
min, max – минимальные и максимальные значения, которые могут поступить с сенсора, в качестве значения может быть указан символ U, означающий отсутствие нижнего или верхнего пределов.
После определения DS для данной rrdb необходимо определить один или несколько round-robin архивов, для чего служит параметр RRA. Вообще понятие архива в данном случае означает ряд значений, получаемых для DS и имеющего такие параметры, как число точек отсчета на ячейку ряда и число ячеек в ряду. Все данные, предоставляемые rrdb это не реальные значения счетчиков, а их RRA, что позволяет вести статистику различных временных периодов и сильно сокращает размер rrdb. Синтаксис RRA-line таков:
функция_консолидации – функция для объединения данных, получаемых от датчика в ячейку RRA, может принимать следующие значения:
AVERAGE – высчитывается среднее арифметическое всех отсчетов
MAX, MIN – максимальное и минимальное значение отсчетов соответственно
LAST – последний полученный отсчет
достоверность – процент отсчетов со значением Unknown(U), чтобы данная ячейка тоже приняла значение U, указывается в виде правильной десятичной дроби (обычно подходит значение 0.5)
отсчетов_на_ячейку и число_ячеек – не нуждаются в комментариях
Приведу пример создания rrdb:
./rrdtool create /usr/local/var/rrdtool/myrouter.rrd --step 300 \
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
Данная команда создает rrdb myrouter.rrd для снятия статистики с сетевого интерфейса маршрутизатора, предполагая, что данные в нее будут поступать раз в 5 минут, задаются два источника данных: счетчик принятых и отправленных байт, при этом счетчик не имеет ограничений ни сверху, ни снизу. Создаются также 8 рядов, четыре из которых используют для консолидации данных функцию AVERAGE, а остальные MAX. При этом создаются следующие промежутки: 600 ячеек по 5 минут, 700 ячеек по 30 минут (5*6), 775 ячеек по два часа (5*24), а также 797 ячеек, хранящих статистику отсчетов за день. В данном случае имитируется поведение mrtg, обрабатывающей такие же временные промежутки.Обновление БД
Для внесения данных со счетчиков в rrdb используется команда rrdtool update, имеющая достаточно простой формат:
rrdtool update filename.rrd время:значение_DS1[:значение_DS2[:...]]
<code>
параметр "время" может быть заменен символом 'N', что означает текущее время, также допускается задавать время в unix формате (вывод команды date -u +%s) или в формате at(1). Хотя можно не заморачиваться этими проблемами и просто использовать значение 'N'. Значения DS указываются в том порядке, в котором они были определены в rrdtool create (допускается альтернативный порядок, но тогда имена DS должны быть перечислены указанием опции -t ds-name:ds-name:...). В качестве значения можно использовать символ 'U', обозначающий неопределенное значение. За один вызов rrdtool update в rrdb может быть передано несколько отсчетов, для чего можно указать несколько строк time:value[:value], разделенных пробелом. Скрипт, вызывающий rrdtool update лучше всего запускать через интервал step, указанный при создании rrdb. Приведу пример скрипта, осуществляющего обновление счетчиков принятых и отправленных байт через маршрутизатор, на базе freebsd; также производится мониторинг загрузки процессора:
<code>
#!/bin/sh
cpuload=`sysctl vm.loadavg | \
awk '{printf("2k 100 %s * p", $4)}' | \
dc | awk -F'.' '{print $1}'`
inbytes=`ipfw show 1 | awk '{print $3}'`
outbytes=`ipfw show 2 | awk '{print $3}'`
/usr/local/bin/rrdtool update \
/usr/local/var/rrdtool/cpu.rrd N:${cpuload}
/usr/local/bin/rrdtool update \
/usr/local/var/rrdtool/myrouter.rrd N:$inbytes:$outbytes
Соответственно правила ipfw, обеспечивающие учет трафика выглядят следующим образом:
# ipfw list
00001 count ip from me to any
00002 count ip from any to me
Счетчик загрузки процессора создается следующим образом:
./rrdtool create /usr/local/var/rrdtool/cpu.rrd -s 60 \
DS:cpuusage:GAUGE:600:0:U \
RRA:AVERAGE:0.5:1:483840 \
RRA:MIN:0.5:1440:1 \
RRA:MAX:0.5:1440:1
Отмечу, что для данного счетчика используется тип GAUGE.Генерация рисунков
Далее перейдем к процедуре создания графиков. Для этого используется команда rrdtool graph, на мой взгляд, наиболее сложная по синтаксису и самая тяжелая для понимания.
Вызов rrdtool graph имеет, в общем, следующий формат:
rrdtool graph filename [опции] \
[опеределния переменных] \
[задание графических элементов]
<code>
Опции
Для большей структуризации опции сгруппированы по смыслу и схожему влиянию на результат. Собственно говоря, также как и на сайте проекта.
Временной диапазон
Параметры --start и --end определяют период, для которого будет генерироваться рисунок. По умолчанию, последние сутки, с максимально возможным качеством. Для изменения периода необходимо его указать в формате UNIX-команды at. Более подробно об этом написано в приложениях.
--start
точка начала отсчета графика
--end
конечная временная точка графика
--step
определяет шаг (в секундах). Обратите внимание на то, что если шаг менее 1 пикселя на графике, часть данных не будет отображаться
Заголовки
--title
заголовок над графика (кириллицу не понимает)
--vertical-label
заголовок слева от графика
Размеры
--width, --height
ширина и высота графика (области данных графика) соответственно, указывается в пикселях, по умолчанию rrdtool делает график размером 400х100 пикселей
--only-graph
при наличии этой опции, и значении --height<32, создается .иконка. графика без дополнительной информации, которая дает общее представление о поведении графика
Лимиты
По умолчанию график будет автоматически масштабироваться таким образом, чтобы Y-значения всего выводимого диапазона помещались на графике, однако это можно изменить вручную, указав необходимые пределы параметрами --lower-limit и --upper-limit. Тем не менее автоматическое масштабирование будет обеспечивать отображение всего графика, даже если там окажутся значения вне указанного диапазона до того, как Вы установите опцию rigid.
--lower-limit
нижний лимит значений. Все, что меньше, будет увеличиваться до этого значения
--upper-limit
верхний лимит значение. Все, что превышает, будет усекаться до этого значения
--alt-autoscale
В некоторых случаях обычный алгоритм определения масштаба оси Y не назовешь удачным. Обычно масштаб выбирается из заранее предопределенных диапазонов, что будет катастрофически не удачной идеей, если надо нарисовать график функции типа 260+0.001*sin(x). Наличие данной опции включает альтернативный расчет минимума и максимума, отображаемого на оси Y, исходя из существующих минимальных и максимальных значений, отображаемых на графике
--alt-autoscale-max
опция аналогична --alt-autoscale, но в отличии от нее затрагивает только верхнюю границу графика, а нижнюю границу устанавливает в .0.. Эта опция полезна в тех случаях, когда выводится скорость на WLAN порту, которая может оказаться больше номинальной за счет компрессии
--no-gridfit
Система растягивает шкалы таким образом, чтобы сетка ложилась на целочисленные значения шкал. В некоторых случаях это может привести к чрезмерному вытягиванию, для чего его можно запретить этой опцией
Сетка
--x-grid
Ось X достаточно сложна для настройки, поэтому не стоит что-то менять без крайней необходимости. Если необходимо убрать сетку и подписи, относящиеся к оси X, просто укажите опцию --x-grid none. Формат опции следующий:
--x-grid GTM:GST:MTM:MST:LTM:LST:LPR:LFM
Сетка определяется указанием точных временных величин параметрами ?TM. Там можно указать одно из следующих значений: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH или YEAR. Далее определяется какое именно количество этих величин необходимо помещать между линиями и надписями (параметры ?ST). Такие пары (?TM:?ST) необходимо определить для базовой сетки (G??), основной сетки (M??) и подписей (L??). Для подписей также не обходимо указать положение (параметр LPR) и формат строки (параметр LFM). Положение, определяемое параметром LPR, может быть справа от линии (значение 0), а при указании там количества секунд, подпись будет центрироваться относительно указанного сдвига.
--y-grid
определяет частоту горизонтальной сети и подписи у оси Y. Если необходимо убрать горизонтальную сетку необходимо указать --y-grid none. Для определения собственного вида горизонтальной сетки и подписей у оси Y используется следующий формат: --y-grid ШАГ_СЕТКИ:ПРИЗНАК_МЕТКИ, где ШАГ_СЕТКИ . это, соответственно шаг сетки, а ПРИЗНАК_МЕТКИ определяет частоту подписей
--alt-y-grid
Не разбирался
--logarithmic
делает логарифмическое масштабирование по оси Y
--units-exponent
Не разбирался
--units-length
Не разбирался
Прочее
--lazy
обновлять график только при устаревании целевого файла или его отсутствии (смотрится mtime)
--imginfo
Не разбирался
--color
задание цвета различных элементов графика (опцию можно использовать несколько раз для указания цвета различных элементов). Используется в виде --color TAG:#rgbcolor, где TAG - один из элементов графика:
BACK - фон
CANVAS - окаймление
SHADEA - границы справа и сверху
SHADEB - границы слева и снизу
GRID - сетка
MGRID - основная сетка
FONT - шрифт
FRAME - границы непосредственно графика
ARROW - стрелки
--zoom
масштабирует график на заданную величину. Параметр должен быть больше 0
--font
позволяет переопределить шрифты, которые будут использоваться для различных текстовых элементов рисунков RRD. Для определения параметров шрифта используется следующий формат: --font TAG:РАЗМЕР:[ФАЙЛ_ШРИФТА]. Если указать размер шрифта равным нулю, то его размер не будет меняться. Это удобно в том случае, если необходимо изменить шрифт не меняя его размер. RRDTool поставляется с предустановленным шрифтом. Его можно изменить через переменную окружения RRD_DEFAULT_FONT. Если Вы используете формат вывода PNG, то можно использовать только TrueType-шрифты. Параметр TAG определяет элемент, для которого устанавливается шрифт. Может принимать следующие значения
DEFAULT - определяет значения по умолчанию для всех элементов
TITLE - определяет параметры заголовков
AXIS - параметры подписей осей графика
UNIT - параметры единиц изменения
LEGEND - параметры легенды
Например, для того, чтобы установить шрифт Times размера 13 для заголовка, необходимо указать следующее:
--font TITLE:13:/usr/lib/fonts/times.ttf
--font-render-mode
позволяет определить силу сглаживания текста. Может принимать следующие значения
normal - установлено по умолчанию
light - хз
mono - отключаени сглаживание
ч
--font-smoothing-threshold
определяет максимальный размер шрифта, который будет выводиться без сглаживания. По умолчанию одция не установлена вовсе
--slope-mode
Не разбирался
--imgformat
тип изображения (GIF, PNG или GD)
--interlaced
обеспечивает более высокую скорость загрузки рисунков в браузере
--no-legend
запретить генерацию легенды, генерировать только график
--force-rules-legend
гарантирует вывод горизонтальной и вертикальной легенды, даже если она не помещается на рисунке целиком
--tabwidth
позволяет установить размер табуляции. По умолчанию установлено значение 40 пикселей
--base
Не разбирался
--rigid
не растягивать график, если встречаются значения, выходящие за верхний или нижний лимиты
Работа с данными
В rrdtool graph есть, собственно говоря, три способа задания переменных. Один - непосредственно из rrdb, другой - на базе оценки некоторого выражения, составленного в обратной польской нотации, третьий - .. Рассмотрим эти способы.
DEF
Для извлечения данных из rrdb используется следующая конструкция:
<code>
DEF:имя_переменной=rrdb: \
ds-name:функция_консолидации \
[:step=][:start=][:end=][:reduce=]
гдеимя_переменной – символьное имя переменной
rrdb – путь к rrdb файлу
ds-name – имя ряда, указанного в rrdtool create параметром DS:name:…
функция консолидации – любая, из рассмотренных ранее, используется в том случае, если отсчеты происходили чаще, чем разрешение графика (идеальный вариант – один отсчет на один пиксель), если разрешение выше частоты отсчетов, то график масштабируется
VDEF
Вычисление значения. Можно использовать только агрегирующие функции. Вместе со значением может вычисляться момент времени.
VDEF:avg=mydata,AVERAGE
Агрегирующие операции: MAXIMUM, MINIMUM, AVERAGE, LAST, FIRST, TOTAL (сумма значений, умноженных на интервал отсчёта; например, можно получить общий траффик по БД скоростей)
CDEF
Следующий способ задания переменных графика заключается в оценке выражения, записанного в обратной польской нотации (те, кто знаком, например, с калькулятором dc или некоторыми настольными калькуляторами HP, знают, что это такое). Идея записи такова: числа помещаются в стек, операторы извлекают нужное количество чисел из стека, проводят над ними необходимые операции и помещают результат в стек. Например, выражение
2 3 +
будет обработано следующим образом:
поместить в стек число 2
2 -> .
поместить в стек число 3
2 -> 3 -> .
взять из стека два числа и сложить их, результат поместить обратно в стек
5 ->
Выражения в обратной польской нотации очень легко обрабатывать программно (для обычной записи необходимо строить бинарное дерево операндов). Теперь вернемся к rrdtool. Запись переменной таким способом выглядит следующим образом:
CDEF:имя_переменной=выражение
Операнды в выражении разделяются запятыми. Список операторов довольно широк:
стандартные арифметические (+, -, *, /, %)
тригонометрические (SIN, COS, ATAN, ATAN2)
алгебраические (LOG, EXP, FLOOR, CEIL, SQRT, DEG2RAD, RAD2DEG)
сравнения (GT, GE (>=), LT, LE (<=), EQ, работают так – берутся два числа из стека, сравниваются, в стек помещается 0 или 1, например 1,2,LT поместит в стек 0 (аналогично 1>2))
условный оператор IF (из стека берутся три значения, если последнее истинно (не ноль) – в стек помещается второе выражение, если ложно – то первое, например 1,2,LT,1,0,IF будет расцениваться так, если 1>2, то поместить в стек 1, иначе поместить 0)
статистические (MIN, MAX, берут из двух значений из стека минимальное и максимальное соответственно), COUNT (поместить в стек индекс текущего значения в DS)
ограничения (LIMIT, берет три значения из стека: var,low,high – если var не лежит между low и high, то в стек помещается UNKNOWN, иначе – var)
временные NOW (текущее время), TIME (время отсчета), LTIME (TIME с добавлением смещения временой зоны и учетом летнего времени)
Прочие… DUP (дублирует верхний элемент стека), EXC (меняет 2 верхних элемента местами), POP (удаляет верхний элемент из стека), UN (если верхний элемент стека является неопределенным значением, то он заменяется на 1, иначе – на 0), UNKN (в стек кладется неопределенное значение), INF (бесконечность в стек), NEGINF (отрицательная бесконечность), ISINF (если верхний элемент стека является бесконечным значением, то он заменяется на 1, иначе – на 0), SORT (первый извлечённый элемент определяет число элементов для сортировки), REV (обратить последовательность, первый извлечённый элемент определяет число элементов), TREND (усреднение, первый извлечённый элемент определяет интервал времени), PREV (если это первый отсчет, то неопределенное значение в стек, иначе значение данного DS, вычисленное на предыдущем шаге), PREV(имя-переменной) (если это первый отсчет, то неопределенное значение в стек, иначе значение данной переменной VDEF, вычисленное на предыдущем шаге), PERCENT (первый параметр – число процентов; второй – имя DS или CDEF; значения последовательности сортируются; возвращается такое число, что заданный процент значений не превышает его), параметры корреляции (LSLSLOPE, LSLINT, LSLCORREL).
Отрисовка графика
Теперь перейдем к этапу задания отрисовки графика. Для этого существует ряд параметров. Общий вид директив, задающих линии и области на графике таков:
Тип:имя_переменной[#rgbcolor[:легенда]]
где #rgbcolor – цвет, заданный в RGB стандарте, легенда – подпись под графиком, описывающая линию или область. Поле “тип” может принимать следующие значения:
HRULE – горизонтальная линия на графике (идет параллельно шкале времени)
VRULE – вертикальная линия на графике (переменная должна быть временного типа, для чего в CDEF существуют функция TIME)
LINE{1,2,3} – линия, заданной толщины (1 – невидимая, 3 – самая толстая)
AREA – закрашенная область
STACK – рисует линию над предыдущей линией (заданной LINE?, AREA или другим STACK) на расстоянии, равном значению переменной
PRINT – печать такстовой строки (с указанным форматированием) в STDOUT
GPRINT – печать такстовой строки (с указанным форматированием) на графике под легендой
COMMENT –
TICK – вертикальные засечки на месте каждого определённого и ненулевого значения переменной
SHIFT – график указанной переменной будет строиться со сдвигом времени назад; смещение задаётся числом или именем переменной
Вывод текста
Для вывода текстовой информации под графиком используется следующая директива
GPRINT:имя_переменной:функция_консолидации:формат
формат – определяет метод вывода и выравнивание. Предусмотрены следующие форматы:
%% – вывод символа “%”
%#.#lf – фиксированная запятая
%lg – автовыбор
%#.#le – экспоненциальный
%s – сокращённое наименование использованных единиц СИ (k, M и т.д.)
%a, %A – сокращённое или полное имя дня недели
%b, %B – сокращённое или полное имя месяца
%d, %m, %y, %H, %M, %S – день, месяц, год, часы, минуты, секунды в виде 2 цифр
%Y – год в виде 4 цифр
%j – номер дня недели (0-6)
%w – день года (1-366)
%c – дата и время
%x – дата
%X – время
%U – номер недели (первая неделя года по первому воскресенью)
%W – номер недели (первая неделя года по первому понедельнику)
%Z – часовой пояс
Выравнивание может иметь одно из следующих значений:
\l – влево
\r – вправо
\c – в центр
\j – по ширине
\g – подавить вывод завершающих строку пробелов
\s – переход на следующую строку (только для COMMENT)
Например %lf\c. Также можно добавлять %s, что вставит дополнительный пробел по вертикали между текстом и легендой, например %lg%s\r.
Помимо этого предусмотрена директива PRINT, которая обеспечивает вывод не на рисунок (видимо в консоль или файл). Надо попробовать. Это может оказаться очень удобным для последующей обработки данных другими программами.
Пример генерации рисунка
Приведу пример скрипта, который создает графики загрузки CPU и сетевого интерфейса:
#/bin/sh
WWWPREFIX=/usr/local/www/htdocs/rrdtool
RRDPREFIX=/usr/local/var/rrdtool
/usr/local/bin/rrdtool graph $WWWPREFIX/cpuusage.png \
--width 400 \
--start -1d \
--end now \
--title "CPU usage" \
\
DEF:cpuusage=$RRDPREFIX/cpu.rrd:cpuusage:AVERAGE \
"CDEF:percent=cpuusage" \
CDEF:huge=percent,50,GT,percent,0,IF \
CDEF:good=percent,50,GT,0,percent,IF \
HRULE:100#0000FF:"Maximum allowed" \
AREA:good#00FF00:"Good load" \
AREA:huge#FF0000:"Overload!!"
/usr/local/bin/rrdtool graph $WWWPREFIX/myrouter.png \
--width 400 \
--start -1d \
--end now \
--title "Network usage" \
\
DEF:inoctets=$RRDPREFIX/myrouter.rrd:input:AVERAGE \
DEF:outoctets=$RRDPREFIX/myrouter.rrd:output:AVERAGE \
"CDEF:inbits=inoctets,8,*" \
"CDEF:outbits=outoctets,8,*" \
AREA:inbits#00FF00:"In traffic" \
LINE1:outbits#0000FF:"Out traffic"
Графики, сгенерированные данным скриптом будут выглядеть следующим образом:В графике загрузки CPU задаются две зоны – нормальная нагрузка и перегрузка. Перегрузка наступает при загруженности процессора на более, чем 50%. В графике загрузки сети происходит перерасчет байтов, возвращаемых счетчиками ipfw в биты, в которых принято мерить нагрузку сети. В данном примере генерируются однодневные графики. Изменив переменную $PAST можно добиться генерации графиков за нужный период времени.
А для того, чтобы на график вывести данные за текущую и предыдущую неделю необходимо извлечь данные из базы следующим образом:
... --end now --start end-1w \ DEF:thisweek=router.rrd:ds0:AVERAGE \ DEF:lastweek=router.rrd:ds0:AVERAGE:end=now-1w:start=end-1w \ ...
Для запуска скрипта обновления и генерации картинок каждую минуту пишем в /etc/crontab следующую строчку:
* * * * * root /usr/local/libexec/rrdtools-update.sh > /dev/null
Генерация рисунка через rrdcgiДля более же удобной генерации картинок можно использовать специальный cgi интерпертатор rrdcgi, позволяющий вставлять теги вида . Генерация графика с его помощью будет выглядеть следующим образом:
#!/usr/local/bin/rrdcgi
<HTML>
<HEAD><TITLE>RRDCGI Demo</TITLE></HEAD>
<BODY>
<H1>Demo of CPU usage graph</H1>
<P>
<RRD::GRAPH ../htdocs/images/cpu.png
--lazy
--width 400
--start -1d
--end now
--title "CPU usage"
--imginfo '><IMG SRC=/images/%s WIDTH=%lu HEIGHT=%lu >'
DEF:cpuusage=/usr/local/var/rrdtool/cpu.rrd:cpuusage:AVERAGE
"CDEF:percent=cpuusage"
CDEF:huge=percent,50,GT,percent,0,IF
CDEF:good=percent,50,GT,0,percent,IF
HRULE:100#0000FF:"Maximum allowed"
AREA:good#00FF00:"Good load"
AREA:huge#FF0000:"Overload!!">
</P>
</BODY>
</HTML>
Учтите, что директория, куда производится запись картинок должна быть доступна для записи пользователю, под которым работает apache (по умолчанию nobody:nobody). Параметр –lazy указан, чтобы не “дергать” rrdgraph при чрезмерно частом обновлении страницы.В данной статье я не буду приводить много примеров графиков. В дебрях интернета я нашел набор скриптов, который позволит решить большинство проблем и выполнить мониторинг основных параметров FreeBSD маршрутизатора. Хотя, чаще всего бывает полезнее использовать snmp для сбора разнообразной информации из гетерогенной сети.
Учтите, что главное в мониторинге – его постоянность, поэтому компьютер, на котором накапливаются статистические данные должен быть хорошо защищен и стабилен. Только так можно проследить динамику развития инфраструктуры сети и предложить замену узких мест (подойти к начальству и продемонстрировать графики производительности намного эффективнее, нежели пытаться объяснить все на пальцах: “Ну эта, тормозит!”). Rrdtool дает гораздо больше возможностей, нежели mrtg, поэтому совершенствовать графики и скрипты можно постоянно, заставляя их показывать ту информацию, которая нужна. Конечно же, обычно наиболее полезным является сбор статистики каждого устройства за определенный промежуток времени (день, месяц, год). Как вы могли убедиться, реализовать такое поведение не должно составить труда.
Дополнительные возможности
Просмотреть информацию о базе данных (info)
Для просмотра информации о структуре и параметрах RRD-базы сожно воспользоваться следующей командой. Формат вывода более чем понятный.
rrdtool info filename.rrd
Экспорт и импорт RRD-базы (dump)
Для сохранения данных данных одной базы данных (один .rrd-файл) в формате XML, для того, чтобы потом его можно было также быстро восстановить обратно в RRD-базу можно воспрользоваться классическим механизмом DUMP-RESTORE, который реализован во всех, или почти во всех СУБД. Как обычно, если не указать, куда надо выводить данные – будет использоваться стандартный вывод. Синтаксис, разумеется, максимальнго простой:
rrdtool dump filename.rrd > filename.xml
или
rrdtool dump filename.rrd filename.xml
Для обратной операции используется rrd restore, который используется следующим образом:
rrdtool restore filename.xml filename.rrd [–range-check|-r] [–force-overwrite|-f]
где –range-check позволяет при импорте данных делать дополнительную проверку на попадание значения в определенный диапазон для каждого источника данных (DS), а –force-overwrite позволяет при импорте данных перезапись имеющихся данных в базе.
Экспорт RRD-данных в XML (xport)
Одной из возможностей RRDTool является экспорт и импорт данных, что позволяет обеспечить высокую переносимость между серверами, даже с различными операционными системами. с помощью данной возможности Вы можете создать XML-представление данных из одной или нескольких RRD-баз для дальнейшой обработки.
Синтаксис команды следующий:
rrdtool xport \
--start НАЧАЛО --end КОНЕЦ \
--maxrows rows \
--step value \
[DEF:vname=rrd:ds-name:CF] \
[CDEF:vname=rpn-expression] \
XPORT:vname[:legend]
Параметры –start и –end определяют период, для которого будет генерироваться рисунок. По умолчанию, последние сутки, с максимально возможным качеством. Для изменения периода необходимо его указать в формате UNIX-команды at. Более подробно об этом написано в приложениях.Параметр –step – определяет шаг (в секундах). Обратите внимание на то, что если шаг менее 1 пикселя на графике, часть данных не будет отображаться.
Параметр –maxrows работает в точности также как, параметр –width при генерации рисунков.
Внешние возможности
Weathermap4RRD
Что и как можно мониторить
Один из наиболее простых способов сбора статистики с удаленных серверов – это использование SSH. При всех очевидных плюсах (шифрование данных и простота настройки и использования) надо иметь ввиду следующие особенности:
SSH достаточно медленно работает.
Для использования SSH придется обеспечить возможность авторизации по ключам, таким образом если будет взломан сервер, на котором хранятся RRD-базы взломаны могут быть и все сервера, на которых производится мониторинг. Тем не менее это не так страшно, если проработать схему безопасности заблоговременно и обойти эти “дырки” корректным распределением прав.
По умолчанию, сервер имеет весьма ограниченное количество SSH-подключений, которые могут обслуживаться одновременно, поэтому если много приложений используют этот ресурс, или для получения каждого параметры Вы используете отдельное SSH-соединение, их лимит будет быстро исчерпан. Для этого можно написать скрипты, которые будут готовить свежие данные статистики локально на удаленном хотсе, а потом, через SSH эти данные будут просто забираться в БД. Или Вы всегда можете изменить максимальное количество удаленных консолей в Вашей системе.
Настроить выполнение пакетной команды ssh без задания пароля на хранящем базу хосте можно следующим образом.
Создайте специальный ключ ssh-keygen -t dsa -b 2048 -N “” -f ~/.ssh/rrdtool
На остальных хостах добавить его в ~/.ssh/authorized_keys
Приложения
Спецификация AT-формата времени и временных диапазонов, реализованная в RDTool
В отличии от традиционного UNIX-Timestamp (Время с начала эпохи Unix), RDTool также понимает at-формат, который изначально поддерживается стандартом PISIX, и используется утилитой at, который обеспечивает несколько вариантов указания точного времени. Фактически спецификация состоит из двух частей: Спецификация указания времени и спецификация указания временных диапазонов.
Спецификация указания времени
Спецификация обеспечивает возможность указания на конкретный момент времени. При отсутствии указания времени (там, где его наличие подразумевается) используется секущее время.
Полное время состоит из двух частей: ВРЕМЯ_ДНЯ (должно быть вначале, если оно указывается) и ДЕНЬ.
ВРЕМЯ_ДНЯ может быть указано как ЧЧ:ММ, ЧЧ.ММ или просто ЧЧ. Также допускается использование суффиксов .am. и .pm. для указания времени до и после полудня, но можно указывать время и в 24х часовом формате. Некоторые особенные моменты суток, помимо всего прочего, можно указывать по названиям:
midnight (00:00) – полночь
noon (12:00) – полдень
British teatime (16:00) – Время английского чая
ДЕНЬ может быть указан как НАЗВАНИЕ_МЕСЯЦА ДЕНЬ_МЕСЯЦА ГОД. Также допускается указание названий дней недели и слов yesterday (вчера), today (сегодня) и tomorrow (завтра). Помимо всего прочего можно указать ДЕНЬ полностью в числовых форматах, таких как ММ/ДД/[ГГ]ГГ, ДД.ММ.[ГГ]ГГ, или ГГГГММДД.
Будьте внимательны! В отличие от оригинального формата, используемого командой at (ММДДГГ[ГГ]), при указании ДНЯ в формате одного числа на первом месте указывается год. Также при использовании этого формата ДНЯ необходимо обязательно указывать ВРЕМЯ_ДНЯ
НАЗВАНИЕ_МЕСЯЦА – это англоязычные названия месяцев: January (январь), February (февраль), March (март), April (апрель), May (май), June (июнь), July (июль), August (август), September (сентябрь), October (октябрь,) November (ноябрь), December (декабрь). Также все эти названия месяцев можно использовать в сокращенной нотации (3 первые буквы).
ДЕНЬ_МЕСЯЦА – это число месяца.
ГОД может быть указан в формате 2х или 4х разрядного числа.
Помимо вышеописанного метода указания даты (имеется ввиду полной даты) можно использовать следующие ключевые слова (или их сокращения до первой буквы):
now – ссылается на текущий момент времени
start – ссылается на время начала работы программы
end – ссылается на время окончания работы программы
Спецификация указания временных диапазонов
Спецификация временных диапазонов используется для добавления или вычитания точно определенных промежутков времени относительно заранее определенных моментов времени. Диапазон состоит из ЗНАКА и ВЕЛИЧИНЫ. Для указания ВЕЛИЧИНЫ могут использоваться следующие единицы времени: years (года), months (месяцы), weeks (недели), days (дни), hours (часы), minutes (минуты ), или seconds (секунды). Все эти единицы времени могут указываться в единственном и множественном числе, в виде аббревиатуры или в сокращенном, до первой буквы, формате (например +3days, -1wk, -3y). Несколько единиц времени можно использовать одновременно (например 5mon1w2d) или в виде суммы (concatenation), например так: -5h45min = -5h-45min = -6h+15min = -7h+1h30m-15min, и т.д.
При сокращении до одной буквы месяц (month) и минута (minute) преобразуются в букву m. Для разрешения этой неоднозначности программа пытается понять ваши мысли и делает эвристический анализ по следующим правилам:
Если m используется в контексте годов, месяцев, недель или дней, то она интерпретируется как месяц. Если же она используется в контексте часов, минут и секунд, то она интерпретируется как минута.
Вне контекста (сразу после знака) смысл m определяется числом, после которого оно следует. Если число меньше 25, то m интерпретируется как месяц, иначе как минута (например -25m = -25minutes, +24m = +24months)
Обратите внимание на то, что при указании временных диапазонов в вышеописанном формате, Вы можете получить не всегда ожидаемый промежуток времени, т.к. все они на имеют однозначного интерпретации во времени. Год может состоять из 365 или 366 дней, месяц может быть от 28 до 31 дня, даже день дважды в году может быть не 24 часа (при переходе на летнее/зимнее время). To cope with this, when you use days, weeks, months, or years as your time offset units your time preference date is adjusted accordingly without too much further effort to ensure anything about it (in the hope that mktime(3) will take care of this later). This may lead to some surprising (or even invalid!) results, e.g. ‘May 31 -1month’ = ‘Apr 31’ (meaningless) = ‘May 1’ (after mktime(3) normalization); in the EET timezone ‘3:30am Mar 29 1999 -1 day’ yields ‘3:30am Mar 28 1999’ (Sunday) which is an invalid time/date combination (because of 3am -> 4am DST forward clock adjustment, see the below example).
В противоположность, часы, минуты и секунды четко определяют временные интервалы, что гарантирует четкое соответствие определенного промежутка времени указанным временным интервалам.
Замечание. Спецификация времени чувствительна к регистру букв, но совершенно не обращает внимания на пробелы, кроме случаев, таких как этот: ‘midnight Thu’. Ввиду того, что операционная система, увидев пробел в выражении, разделит параметр на два параметра, можно все выражение взять в кавычки или заменить пробел на символ подчеркивания или запятую, которые расцениваются парсером как пробелы.
Примеры
Формат Описание
Oct 12 12 октября текущего года
-1month или -1m текущее время месяц назад
noon yesterday -3hours вчерашнее утро, также может быть указано как 9am-1day
23:59 31.12.1999 1 минута до наступления 2000 года
12/31/99 11:59pm 1 минута до наступления 2000 года
12am 01/01/01 Начало нового тысячелетия
end-3weeks или e-3w 3 недели до окончания (может использоваться в качестве описания начала диапазона)
start+6hours или s+6h Через 6 часов после запуска (может использоваться в качестве описания окончания диапазона)
931225537 5 июля 1999 года, 18:45 (количество секунд с начала эпохи Unix). Также поддерживается.
19970703 12:45 3 июля 1997 года, 12:45 (любимый формат автора программы RRDTool)
Ссылки
проделжение следует…
P.S. Буду учень признателен за дполнительные материалы для этой статьи, в особенности что-то по Wethermap. Если есть чем поделиться (ссылками или текстами) – пишите на info@perldoc.ru.




Comments
So empty here ... leave a comment!