MRTG: справочная информация и примеры использования во FreeBSD

http://wiki.bsdportal.ru/doc:mrtg
Автор: else


Вступление

MRTG - Multi Router Traffic Grapher - в основном используется для построения графиков загрузки каналов, нагрузки роутеров и коммутаторов. Дело, безусловно, хорошее, но ведь есть еще масса иных задач, которые хотелось бы мониторить во времени и наблюдать разложенными по графикам. Заполнение дискового пространства, загрузка процессора в зависимости от времени суток, эффективность отлова спама и многое другое. Вся прелесть mrtg заключается в том, что ему все равно какие графики рисовать. А значит, наша задача сводится к написанию скриптов, выводящих интересующую информацию в подходящем виде.

Поскольку мониторинг загрузки каналов с помощью mrtg неплохо документирован, в том числе и на русском языке, то эту часть я пропущу.
Немного справочной информации

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

Команды: 1)
Include: имя-файла
WorkDir: имя-директории (задает размещение журнала, рабочих файлов и генерируемых страниц, имеет приоритет над HtmlDir, ImageDir и LogDir)
HtmlDir: имя-директории
ImageDir: имя-директории (обязательно под HtmlDir - страницы генерируются в этом предположении)
LogDir: имя-директории
Refresh: частота перерисовки в броузере (по умолчанию 300 секунд)
RunAsDaemon: no | yes
Interval: предполагаемый интервал запуска mrtg (по умолчанию 5 минут, сам запуск обеспечивается внешними средствами, например, через cron или RunAsDaemon)
IconDir: директория, где хранятся иконки (если отличается от WorkDir)
Forks: число (сколько параллельных процессов опроса запускать)
WriteExpire: no | yes (создавать файлы .meta для apache - в .htaccess надо добавить "MetaDir ." и "MetaFiles on"; этот же эффект - тэг Expiration - можно достичь с помощью mod_expire (см. htaccess.txt))
NoMib2: no | yes (не запрашивать sysUptime, sysName)
LoadMIBs: список-файлов-через-запятую
Language: язык-отчетов
ThreshDir: имя-директории-хранящей-информацию-о-превышении-лимитов
LogFormat: rrdtool (формат журналов для rrdtool - динамическое создание отчетов)
LibAdd: адрес-библиотеки-rrdtool (RRDs.pm)
PathAdd: адрес-rrdtool
для каждого контролируемого устройства - точнее, котролируемого параметра - (обозначается как target, буквы преобразуются к строчным), создается отдельная секция. При работе mrtg каждый target порождает файлы журнала (target.log и target.old), картинки с графиками (target-day.gif, target-week.gif, target-month.gif, target-year.gif) и html-страницу (target.html).
Target[target]: порт:комьюнити@маршрутизатор[:port[:timeout[:retries[:backoff[:2]]]]], где
порт - номер интерфейса на маршрутизаторе (номер в некоей внутренней таблице)
комьюнити - community в смысле SNMP (пароль на чтение)
маршрутизатор (имя или IP-адрес) (не любит точку в конце имени)
port - по умолчанию стандартный порт SNMP (UDP 161)
timeout - 2 секунды
retries - 5 раз
backoff - во сколько раз увеличивать timeout при каждом повторе (по умолчанию - 1)
2 - означает использование 64-битных счетчиков (устройство должно поддерживать SNMPv2c)

в таком формате действительно извлекается информация о входном и выходном трафике. Если перед номер порта поставить знак "минус", то входной и выходной трафик меняется местами. Вместо номера порта можно явно задать два номера OID (идентификатор объекта в MIB, например - 1.3.6.1.2.1.2.2.1.14.1 - счетчик входных ошибок на интерфейсе 1) через амперсенд. Можно использовать символические имена OID (список смотри в mibhelp.txt, например - ifInErrors.1). Номера интерфейсов могут меняться при реконфигурации маршрутизатора, но можно вместо номера интерфейса (последнее число в OID) записывать IP-адрес после косой черты. Интерфейсы также можно задавать по описанию (ifDescr) - после обратной косой черты. Или имени (ifName) - после диез. Или по физическому адресу (ifPhysAddress) - после восклицательного знака (пример: 0a-0-f1-5-23-18). Или типу (?) - после процента.
Target[target]: внешняя-программа-с-параметрами-в-обратных-кавычках

программа должна возвращать на стандартный вывод 4 строки
значение первой переменной (предполагается счетчик входных байт)
значение второй переменной (предполагается счетчик выходных байт)
текстовая строка, содержащая информацию о времени работы объекта после включения (uptime)
строка, указывающая имя объекта
Target[target]: математическое выражение, составленое из простых объектов, описанных ранее (необходимо использовать пробелы вокруг знаков операций)
RouterUptime[target]: комьюнити@маршрутизатор

откуда брать информацию об имени маршрутизатора и его времени работы для составных target
MaxBytes[target]: число

Значения обеих переменных, которые больше этого числа, игнорируются. Используется также для построения немасштабируемого графика.
MaxBytes1
MaxBytes2
Title[target]: заголовок для html-страницы
PageTop[target]: текст, выдаваемый в верхней части html-страницы (можно и нужно использовать html-разметку)
PageFoot[target]:
AddHead[target]: html-текст, вставляемый после TITLE внутри HEAD
MaxAbs[target]: число

если используется сжатие, то возвращаемое значение может превосходить MaxByte.
Unscaled[target]: [d][w][m][y]

подавить масштабирование по вертикали для соответствующего графика (d- day, w - week, m - month, y - year)
WithPeak[target]: [w][m][y]

показывать в недельном, месячном и годовом графиках не только средние, но и пиковые значения
Supress[target]: [d][w][m][y]

подавить генерацию части графиков
Extension: суффикс-вместо-.html
Directory[target]: имя-директории

складывать сюда все файлы, относящиеся к указанному target (рекомендуется использовать относительные имена)
XSize[target]: число

число пикселов в графике по горизонтали (от 20 до 600, по умолчанию 400). Расходуется еще немного места под оформление.
YSize[target]: число

число пикселов в графике по умолчанию (от 20, по умолчанию 100). Расходуется еще немного места под оформление.
XZoom[target]: число

масштабировать пикселы по X, гадость
YZoom[target]: число

масштабировать пикселы по Y, гадость
XScale[target]: число

масштабировать график по X, гадость
YScale[target]: число

масштабировать график по Y, гадость
YTics[target]: число-вертикальных-делений (4)
YTicsFactor[target]: коэффициент-значений-оси
Step[target]: секунд

изменить шаг отображения (по умолчанию 300 секунд)
Options[target]: список-опций-через-запятую
growright - время движется вправо (по умолчанию - влево)
bits - все числа умножать на 8 (то бишь мерять в битах, тексты меняются соответственно)
perminute - все числа умножат на 60 (то бишь мерять в единицах за минуту, тексты меняются соответственно)
perhour - все числа умножаются на 3600 (то бишь мерять в единицах за час, тексты меняются соответственно)
noinfo - подавлять вывод информации об имени устройства и его времени работы
nopercent - подавить вывод процентной информации
transparent - генерировать прозрачный фон картинки
integer - выдавать поясняющую информацию без точек
dorelpercent - отношение входного трафика к выходному (от 0% до 100%, если входной больше, чем выходной, то будет показано 100%). Требуется пятый цвет.
gauge - интерпретировать полученные значения как абсолютные значения (а не значения счетчика). Полезно для отображения таких параметров, как загрузка процессора, дискового пространства и т.д. По умолчанию, mrtg трактует полученные значения как увеличивающийся счетчик (т.е. отрисовывает разницу между предыдущим и текущим значением, деленную на прошедший интервал времени).
absolute - используется для значений, которые сбрасываются при чтении (т.е. разница не вычисляется, но значение делится на интервал времени)
unknaszero - трактовать неверные значения как 0, а не как повторение предыдущего значения
withzeroes - учитывать нулевые значения при вычислении среднего (ругается при запуске)
kilo[target]: число

что понимается под кило? по умолчанию - 1000, но можно установить 1024
kMG[target]: список-префиксов-множителей

какими буквами обозначать кило, мега и др. По умолчанию: ",k,M,G,T,P". Пустая строка подавляет генерацию префиксов вовсе.
Colours[target]: Colour1#RRGGBB,Colour2#RRGGBB,Colour3#RRGGBB,Colour4#RRGGBB

определение цветовой схемы, где Coloursi - текстовое имя цвета, помещаемое в легенду графика, RRGGBB - шестнадцатеричные значения, определяющие RGB-цвет. Если используется dorelprocent, то требется определить пятый цвет.
Background[target]: #RRGGBB

цвет фона
YLegend[target]: текстовая-строка

по умолчанию: "Bits per second"
ShortLegend[target]: текстовая-строка

по умолчанию: "b/s"
Legend1[target]: Incoming Traffic in Bits per Second
Legend2[target]: Outgoing Traffic in Bits per Second
Legend3[target]: Maximal 5 Minute Incoming Traffic
Legend4[target]: Maximal 5 Minute Outgoing Traffic
LegendI[target]: In:
LegendO[target]: Out:

строки легенды, описывающие соответствующий цвет. Приведены значения по умолчанию. Если в качестве легенды используется пустая строка, то и график не выводится.
Timezone[target]: имя-TZ
Weekformat[target]: W | V | U (как получать номер недели: strftime(%W) или %V или %U
SetEnv[target]: установка переменных окружения перед при вызове внешних скриптов (target или threshold) в формате имя="значение".
ThreshMinI[target]: минимально-допустимое-значение-первого-параметра
ThreshMaxI[target]: максимально-допустимое-значение-первого-параметра
ThreshProgI[target]: имя-программы

вызывается, если нарушены допустимые значения. Передается три параметра: $router, предельное значение, текущее значение. Вызывается при каждой проверке, пока параметр не придет в норму - надо как-то обходить.
ThreshProgOKI[target]: имя-программы

вызывается, если значение первого параметра вернулось в норму
ThreshMinO, ThreshMaxO, ThreshProgO, and ThreshProgOKO - аналогично для второго параметра
ThreshDesc[target]: строка-передаваемая-программе-через-переменную-THRESH_DESC
специальные устройства (target):
^ - все значения ключей, определенных для него, добавляются перед значениями ключей для дальнейших target
$ - все значения ключей, определенных для него, добавляются после значения ключей для дальнейших target
_ - определяет значения ключей по умолчанию для дальнейших target
NoSpaceChar: символ (использование данного символа в конце ^ или начале $ подавляет вставку пробела



Давайте смотреть на живые примеры. Откуда что бралось, я признаться, не помню. Что-то ставилось из портов, что-то выискивалось в Интернете, что-то дописывалось и правилось, всего не упомнишь, поэтому если вдруг нарушены чьи-то копирайты - не взыщите .
Пример 1.Рисуем статистику обнаружения спама spamassassin

Что нам потребуется:

Почтовый сервер с прикрученным spamassassin
Mrtg2 (/usr/ports/net-mgmt/mrtg)
Веб-сервер Logtail (/usr/ports/security/logcheck/) - эта программулька просматривает лог и запоминает, на чем остановилась, за счет чего при следующем запуске просматривает лог не с начала, а с учетом смещения
Spam-stats.pl - скрипт, собственно обрабатывающий maillog. Если spamassassin пишет логи в отдельный файл (для этого его нужно запустить с ключом -s /путь/до/лога), то обрабатывать следует именно этот лог.

Spam-stats.pl:
#!/usr/bin/perl
$statfile="/home/else/counts";
$offsetfile="/home/else/offset";
$logfile="/var/log/spamd";
$tail_cmd="/usr/local/bin/logtail";
dbmopen %stats, $statfile, 0666 or die "ERROR: Unable to open statsfile: $statfile $! ";
open (LOG, "$tail_cmd $logfile $offsetfile|") or die "ERROR: Unable to open logfile: $logfile $! ";
while () {
$stats{spam}++ if /identified spam/;
$stats{total}++ if /connection from/;
};
close LOG;
my $spam=(($stats{spam}*100/$stats{total}));
print "spam $spam ";
print "total 100 ";
dbmclose %stats;

Конфигурационный файл mrtg - mrtg_spam.cfg:
WorkDir: /usr/local/www/spamstat
Target[spam_percent_spam]: `/usr/local/sbin/spam-stats.pl|egrep "spam|total"|awk '{print ($2)}'`
MaxBytes[spam_percent_spam]: 100
Options[spam_percent_spam]: growright,gauge,nopercent,dorelpercent,noi,noo
Title[spam_percent_spam]: Spam Statistics
PageTop[spam_percent_spam]: Percent of messages tagged as spam
XSize[spam_percent_spam]: 375
YSize[spam_percent_spam]: 150
WithPeak[spam_percent_spam]: dwmy
YLegend[spam_percent_spam]: percent/No. of messages
ShortLegend[spam_percent_spam]: messages
LegendI[spam_percent_spam]: skipped:
LegendO[spam_percent_spam]: total:

Теперь опубликуем WorkDir в веб и создадим index c помощью команды indexmaker: indexmaker [options] mrtg.cfg [other.cfg ...]. Можно, конечно, хранить файлы журналов отдельно от вывода результатов, на ваше усмотрение.

Mrtg можно запускать в режиме демона или вызывать через crontab. Хотя где-то на официальном сайте попадалось упоминание, что в режиме демона программа глючит, у меня работает и так, и так. Пример запуска из крона:
*/5 * * * * root /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg_spams.cfg
Пример 2.Мониторинг загрузки процессора

proc.pl:
#!/usr/bin/perl

$column = defined($ARGV[0]) ? $ARGV[0]:1;
$hborder = defined($ARGV[1]) ? $ARGV[1]:100;

$uptime=$1 if ($record=`/usr/bin/uptime`)=~m[ups+(.*?,.*?),];
@loads=($1*100,$2*100,$3*100)
if $record=~m[load averages: ([0-9.]+),s+([0-9.]+),s+([0-9.]+)];

print "$hborder $loads[$column] $uptime ".`hostname`." ";

Конфигурационный файл mrtg - mrtg_proc.cfg:
WorkDir: /home/local/www/mrtg/
Target[cpu]: `/usr/local/etc/mrtg/load.pl 1 0`
Options[cpu]: gauge, growright, nopercent
MaxBytes[cpu]: 100
WithPeak[cpu]: ymwd

Title[cpu]: Analysis of CPU load averages
PageTop[cpu]: CPU Load Averages

ShortLegend[cpu]: %
YLegend[cpu]: % of Load
Legend1[cpu]: .
Legend2[cpu]: % of Load
Legend3[cpu]: .
Legend4[cpu]: Peak % of Load
LegendI[cpu]: Maximum:
LegendO[cpu]: Loaded:

И в завершение -- пара ссылок:

Учет трафика с помощью Rat
Настройка MRTG для мониторинга текущего состояния Squid
Что можно почитать на английском языке

На официальном сайте проекта есть замечательная подборка ссылок на все случаи жизни. Самая последняя документация также размещена на официальном сайте, доступном также через http://www.mrtg.org

Обновлено: 12.03.2015