Ключевые слова:rrdtool, monitor, statistic, snmp, (найти похожие документы)
From: Кропачев Артемий <neon@insysnet.ru.>
Newsgroups: email
Date: Mon, 1 Sep 2006 14:31:37 +0000 (UTC)
Subject: Мониторинг интерфейсов в сети с помощью netmond и rrdtool
Введение
С ростом размера компьютерной сети, увеличением количества работающих
серверов и сервисов, увеличением числа обслуживаемых клиентов и
пользователей, а так же увеличением их критичности всё более актуальной
задачей является необходимость своевременного устранения сбоев, а,
следовательно, своевременного их нахождения, другими словами -
мониторинг сети.
На мой взгляд, наиболее часто встречающимися задачами мониторинга
локальной сети являются:
* определение доступности/недоступности оборудования, серверов и сервисов
* проверка каналов передачи данных (доступность, загруженность)
* сохранение и просмотр статистики на интерфейсах коммутаторов и серверов (байты, пакеты и ошибки)
* сохранение и просмотр различных параметров сервисов и объектов
(например, загрузка CPU маршрутизаторов, размер свободного дискового
пространства на файловых серверах, количество подключённых модемных
пользователей на Cisco и другие).
Существует большое количество уже готовых систем мониторинга: nagios,
mrtg, zabbix,cacti. Настройка "полной" системы мониторинга является
достаточно сложной задачей и выходит за рамки данной статьи. Любой
системный администратор рано или поздно и ввиду различных задач
сталкивается с необходимостью анализа закономерностей сетевого трафика в
течении часов, суток, месяцев и т.п. Пожалуй, наиболее удобным способом
является просмотр графиков пакетных и байтовых нагрузок на каналах.
Данная статья ставит своей задачей донести до читателя мой личный опыт
по отображению статистики на интерфейсах серверов и оборудования в
наглядном виде (графики). Эта проблема может быть решена большим
количеством способов (например cacti, mrtg), но я реализовал именно
этот, чем и хочу поделиться.
Используемое программное обеспечение
Для решения поставленной задачи потребуются:
- netmond - сердце системы, выполняет опрос объектов
Домашняя страница производителя RINET Software Team находится по адресу http://soft.risp.ru/ ,
там имеется очень хорошая документация о продукте на русском языке.
Netmond представляет из себя некий серверный инструмент, позволяющий
собирать данные со всех объектов и сервисов сети в одном месте (сервере
мониторинга) и в удобном для использования виде (в нашем случае это
rrdtool, возможно хранить данные в SQL базах данных)
- rrdtool - средство сохранения (база данных) и отображения статистики (утилиты построения изображений)
За информацией о rrdtool можно обращаться на сайт http://www.rrdtool.org.
Есть очень неплохая статья про работу с этой базой http://www.bog.pp.ru/work/rrdtool.html
на русском языке. В man страницах подробно описаны все утилиты работы
см. man rrdtool. Стоит более подробно ознакомится с man страницами по
rrdcreate, rrdupdate, rrdgraph.
- Perl - скрипты для сохранения и отображения данных
- Apache - веб сервер
- Пакет Net-SNMP - для удобства проверки работы протокола snmp
Netmond будет выполнять роль системы получения данных по протоколу SNMP,
а так же будет сохранять данные загрузки интерфейсов в базу rrdtool
через внешний скрипт на Perl. Работа с сохранёнными данными возможна из
командной строки и средствами скриптов. Для удобства использования
написан скрипт отображения результатов в Web интерфейсе.
Настройка системы мониторинга производилась на базе операционной системы
FreeBSD (4.x, 5.x, 6.x), но всё ниже написанное, думаю, можно будет
перенести на Linux (изменится в основном способ установки ПО и место
размещения конфигурационных файлов).
Установка
Чтобы приступить к настройке системы ставим необходимое программное
обеспечение. Вся установка велась из портов FreeBSD. Если у кого-то есть
желание ставить из исходников или пакетов - пожалуйста.
Perl:
# cd /usr/ports/lang/perl5.8 && make install clean
Ставим rrdtool (на момент написания статьи версия 1.2.15):
# cd /usr/ports/net/rrdtool && make install clean
Ставим netmond:
# cd /usr/ports/net-mgmt/netmond && make install clean
Пакет Net-SNMP:
# cd /usr/ports/net-mgmt/net-snmp && make install clean
Ставим, настраиваем и запускаем www сервер apache.
Настройка netmond
------------------
Конфигурационный файл netmond лежит в файле
/usr/local/etc/netmon.conf.sample. Переименовываем его в netmon.conf и
редактируем:
# mv /usr/local/etc/netmon.conf.sample /usr/local/etc/netmon.conf
# vi /usr/local/etc/netmon.conf
Ниже будет дан пример конфигурационного файла с описанием.
RootDir "/var/netmon" # Каталог для сохранения данных
Polling 60 # Время опроса объектов мониторинга (в секундах)
Timeout 2 # Время ожидания ответа на запрос (в секундах)
Retries 3 # Количество переповторов
Saving 60 # Интервал периодического сохранения данных(60 секунд)
TimeFmt "%H:%M:%S" # Формат времени
# Группы доступа к netstate
Group "local" {
Permit "^localhost$"
Permit "^127\\.0\\.0\\.1$"
Deny ".*"
}
Group "remote" {
Permit "^172\\.21\\.81\\."
}
NetState {
Port 3333
# Порт netstate сервера
Timeout 30
Group "local"
Group "remote"
}
Save "make_dir" {
# метод сохранения для создания каталога
File ""
When "0" 0
}
Save "save_rrd_if" {
# Определяем метод сохранения статистики интерфейсов в rrd базу
Pipe "/usr/local/sbin/rrdsave"
# Вызываем скрипт /usr/local/sbin/rrdsave и передаём ему данные на стандартный вход (директива Pipe)
# Возможен вариант с Exec тогда данные будут переданы в командной строке
# После директивы Data идут данные, можно писать с новой строки в кавычках
# Передаём разницу показателей счётчиков байт, много- и моноадресных пакетов, ошибок, дропов на
# интерфейсе, для которого данный метод сохранения прописан в разделе объектов мониторинга
Data
"$DATADIR/rrdint\n"
"60\n"
"RRA:AVERAGE:0.5:1:10080 RRA:AVERAGE:0.5:5:10080 RRA:AVERAGE:0.5:60:10080 RRA:AVERAGE:0.5:3600:10080\n"
"${ifOperStatus}:ifoperstatus:GAUGE:600:0:1.25\n"
"${ifInOctets.delta}:ifinoctets:GAUGE:600:0:U\n"
"${ifOutOctets.delta}:ifoutoctets:GAUGE:600:0:U\n"
"${ifInErrors.delta}:ifinerrors:GAUGE:600:0:U\n"
"${ifOutErrors.delta}:ifouterrors:GAUGE:600:0:U\n"
"${ifInDrops.delta}:ifindrops:GAUGE:600:0:U\n"
"${ifOutDrops.delta}:ifoutdrops:GAUGE:600:0:U\n"
"${ifInUcastPkts.delta}:ifinucastpkts:GAUGE:600:0:U\n"
"${ifOutUcastPkts.delta}:ifoutucastpkts:GAUGE:600:0:U\n"
"${ifInNUcastPkts.delta}:ifinncastpkts:GAUGE:600:0:U\n"
"${ifOutNUcastPkts.delta}:ifoutncastpkts:GAUGE:600:0:U"
}
# ****Здесь начинается раздел описания объектов мониторинга********
Object "Cisco_catalyst" {
# Определяем объект мониторинга - коммутатор Cisco
Address "172.21.80.11" # Адрес, по которому будем опрашивать
Method router "public"
# Определяем стандартный метод опроса router с известной строкой community
Save "make_dir"
Interface "FastEthernet0/1" {
# Определяем интерфейс на коммутаторе по его ifName
# Предопределяем методы сохранения данных на данном интерфейсе
# первый метод нужен для определения переменной DATATDIR
# Второй выполняет сохранение данных
Save "make_dir"
Save "save_rrd_if"
}
Interface 2 {
# Определяем интерфейс по значению ifIndex (по номеру)
Save "make_dir"
Save "save_rrd_if"
}
}
Object "Server" {
Address "172.21.8.1"
Method router "mysnmpcommunity"
Save "make_dir"
Interface "fxp0" {
Save "make_dir"
Save "save_rrd_if"
}
Interface "fxp1"{
Save "make_dir"
Save "save_rrd_if"
}
Interface "em0"{
Save "make_dir"
Save "save_rrd_if"
}
}
Структура конфигурационного файла подробно описана на сайте
производителя, я остановлюсь лишь на нескольких важных деталях. Весь
конфигурационный файл состоит из 5 основных частей:
1. Установка глобальных переменных.
2. Параметры работы netstate протокола.
3. Пользовательские методы опроса объектов и сервисов (в приведённом конфигурационном файле не используются)
4. Пользовательские методы сохранения данных.
5. Раздел описания объектов, сервисов и интерфейсов мониторинга.
Параметр Saving изменён с 300 на 60. Необходимо для правильного
сохранения минутных статистик в базу rrdtool. Переменная RootDir
содержит путь до каталога куда netmond будет сохранять полученные данные
прописанными методами сохранения. Следует предусмотреть достаточный
объём свободного места на разделе (Файл rrdtool для одного интерфейса в
нашем случае будет занимать порядка 3,5 Мб).
В примере конфига добавлено для примера два объекта мониторинга:
коммутатор Cisco и сервер на базе FreeBSD. В свойствах объекта
мониторинга задаётся его IP адрес, метод опроса, и методы сохранения
данных. Мы используем встроенный метод опроса router, который считывает
по SNMP статистику с интерфейсов и некоторую другую информацию. Методу
передаётся 1 параметр (выражение в кавычках после названия метода)-
строка community (что то типа пароля для доступа к данным по SNMP).
В параметрах объектов описано так несколько интерфейсов: один по
названию (по IfName), второй по номеру (по IfIndex). Кому как удобнее
пользоваться. Например, при установке службы SNMP в MS Windows у
интерфейсов вообще ifName отсутствует, так что приходится пользоваться
только вторым способом.
Для каждого интерфейса прописано 2 метода сохранения данных: "make_dir"
и "save_rrd_if".
Метод сохранения данных "save_rrd_if" передаёт данные собранные
встроенным методом опроса "router" (показатели счётчиков байт, пакетов,
дропов, ошибок), имя файла rrdtool базы куда надо данные поместить
(берётся из переменной netmond "DATADIR"), а так же параметры базы
rrdtool необходимые для её создания и последующего обновления на вход
скрипта /usr/local/sbin/rrdsave. Если файл базы не существует скрипт его
создаёт, если существует - то добавляет/обновляет в нём данные.
Опишу подробнее строки с данными (после директивы Data):
- "$DATADIR/rrdint\n"
путь до файла, в нашем случае rrdint, переменная
DATADIR содержит путь до каталога, где хранятся данные данного
объекта/сервиса/интерфейса (в нашем случае для интерфейса).
- "60\n"
время в секундах, как часто будет обновляется база. Параметр
необходим при создании базы.
- "RRA:AVERAGE:0.5:1:10080 RRA:AVERAGE:0.5:5:10080 RRA:AVERAGE:0.5:60:10080 RRA:AVERAGE:0.5:3600:10080\n"
RRA строки - параметр создания базы: определяем количества ячеек тип.
Общий формат:
RRA:функция-консолидации:x-доля:отсчетов-на-ячейку:число-ячеек
Функции консолидации определяют как и какие отсчёты группировать в одну
ячейку (у нас методом усреднения, возможны так же MAX, MIN, TOTAL,
LAST). Создаём 10080 ячеек под минутные отчёты (1 отсчёт по 60 секунд),
10080 ячеек под 5 минутные (5 отсчётов), сколько же под часовые (60
отсчётов) и т.д.. Если кому жалко место на диске, можно без проблем
значительно уменьшить количество ячеек. Например вот так:
"RRA:AVERAGE:0.5:1:1440 RRA:AVERAGE:0.5:5:2016 RRA:AVERAGE:0.5:60:720 RRA:AVERAGE:0.5:3600:365\n"
- "${ifOperStatus}:ifoperstatus:GAUGE:600:0:1.25\n"
передаём OperStatus для интерфейса в виде переменой ${ifOperStatus},
сохраняем как есть (тип GAUGE), максимальное значние 1.25.
- "${ifInOctets.delta}:ifinoctets:GAUGE:600:0:U\n"
переедем переменную разницы счётчиков входящих байт между опросами. В
базе имя столбца будет названо как ifinoctets.
Думаю с остальными строками уже понятно
- "${ifOutOctets.delta}:ifoutoctets:GAUGE:600:0:U\n" (исходящий байты)
- "${ifInErrors.delta}:ifinerrors:GAUGE:600:0:U\n" (ошибки)
- "${ifOutErrors.delta}:ifouterrors:GAUGE:600:0:U\n"
- "${ifInDrops.delta}:ifindrops:GAUGE:600:0:U\n" (дропы)
- "${ifOutDrops.delta}:ifoutdrops:GAUGE:600:0:U\n"
- "${ifInUcastPkts.delta}:ifinucastpkts:GAUGE:600:0:U\n" (моноадресные пакеты)
- "${ifOutUcastPkts.delta}:ifoutucastpkts:GAUGE:600:0:U\n"
- "${ifInNUcastPkts.delta}:ifinncastpkts:GAUGE:600:0:U\n" (многоадресные пакеты)
- "${ifOutNUcastPkts.delta}:ifoutncastpkts:GAUGE:600:0:U"
Метод "make_dir" необходимо вызывать до метода "save_rrd_if" для того
лишь, чтобы определить переменную DATADIR. В противном случае без вызова
метода File она будет не определена.
Скрипт для сохранения данных в rrdtool
Далее необходимо создать скрипт сохранения данных в базу rrd
/usr/local/sbin/rrdsave. Вот его листинг:
#!/usr/local/bin/perl
my (@ds,$line,$exe);
my $FileName=<STDIN>;
my $TimeStep=<STDIN>;
my $RRAString=<STDIN>;
chomp($RRAString,$TimeStep,$FileName);
$FileName=~s/\"//g;
my $rrdtoolpath='/usr/local/bin/rrdtool';
my $num=-1;
while ( defined( $line=<STDIN> ) ) {
chomp($line); $num++; $ds[$num]=$line;
};
if( -e($FileName) ) {
$exe=$rrdtoolpath.' update '.$FileName.' --template';
my $dsname=''; my $value='';
foreach my $ds1 (@ds) {
my @prom=split/:/,$ds1;
$dsname=$dsname.$prom[1].':';
$value=$value.$prom[0].':';
};
$value=~s/:$//; $dsname=~s/:$//;
$exe=$exe.' '.$dsname.' N:'.$value;
system($exe);
} else {
$exe=$rrdtoolpath.' create '.$FileName.' --step '.$TimeStep;
foreach my $ds1 (@ds) {
$ds1=~s/^.+?://;
$exe=$exe.' DS:'.$ds1;
};
$exe=$exe.' '.$RRAString;
system($exe);
system('/bin/chmod 644 '.$FileName);
};
Изменим права доступа на данный скрипт:
# chmod 755 /usr/local/sbin/rrdsave
Запуск приложения
Приложение готово к запуску, запускаем кому как удобно:
# /usr/local/sbin/netmond
# /usr/local/etc/rc.d/netmond.sh start
(предварительно добавив в rc.conf 'netmond_enable="YES"')
# /usr/local/sbin/netmondctl start
Проверяем наличие процесса в памяти (# ps auxw|grep netmond), отсутствие
ошибок в /var/log/messages, а так же наличие каталогов в RootDir:
# cd /var/netmon && ls
Единственный минусом можно назвать факт, что каталоги создались с
правами 750. Для возможности работы системы отображения необходима
возможность пользователю www иметь доступ к файлам, хранящимся в
каталогах в /var/netmon. Для этого необходимо сменить права доступа на
все подкаталоги, находящиеся в /var/netmon на 755. Самый быстрый (но не
самый правильный) вариант:
# chmod -R 755 /var/netmon
Следует отметить, что все скрипты вызываемые из методов сохранения
запускаются с правами пользователя netmon, так что необходимо
предусмотреть возможность записи в каталоги с интерфейсами:
# cd /var/netmon
# chown -R netmon *
Через пару минут после запуска netmond можно проверить наличие файлов
rrdint в подкаталогах интерфейсов. При желании можно посмотреть
содержимое фалов следующим образом:
# rrdtool fetch rrdint AVERAGE[[/CODE]], где rrdfilename - имя созданного файла.
Вот часть результат вывода данной команды:
ifoperstatus ifinoctets ifoutoctets ifinerrors ifouterrors ifindrops ifoutdrops ifinucastpkts ifoutucastpkts ifinncastpkts ifoutncastpkts
1156826040: nan nan nan nan nan nan nan nan nan nan nan
1156826100: nan nan nan nan nan nan nan nan nan nan nan
1156826160: nan nan nan nan nan nan nan nan nan nan nan
1156826220: nan nan nan nan nan nan nan nan nan nan nan
1156826280: nan nan nan nan nan nan nan nan nan nan nan
Информацию о файле можно посмотреть вот так:
# rrdtool info rrdint
Вот чать результата вывода команды:
filename = "rrdint"
rrd_version = "0003"
step = 60
last_update = 1156912412
ds[ifoperstatus].type = "GAUGE"
ds[ifoperstatus].minimal_heartbeat = 600
ds[ifoperstatus].min = 0.0000000000e+00
ds[ifoperstatus].max = 1.2500000000e+00
ds[ifoperstatus].last_ds = "UNKN"
Работа с netstate
Приведу немного изменённую цитату с http://soft.risp.ru :
Netmond хранит все накопленные данные о текущем состоянии сети у себя в
памяти, в специально предназначенных контейнерах - переменных VARIABLE.
Значения VARIABLE могут вводиться в программу по результатам работы
системы сбора данных, а выводиться с помощью разнообразных методов
сохранения SAVE. Однако вывод данных с помощью SAVE выполняется только
по инициативе самого Netmond (периодически или в зависимости от каких-то
условий) совершенно конкретных значений, предусмотренных конфигурацией
программы. Что может быть очень удобно при решении задач накопления и
долговременного хранения данных, но, например, практически не пригодно
для задачи получения мгновенной актуальной картины состояния всей сети в
реальном времени. Для решения задачи вывода любых данных в произвольные
моменты времени в Netmond встроен специальный сервер NetState, который
обеспечивает авторизованным сетевым клиентам асинхронный доступ ко всему
массиву переменных VARIABLE на чтение.
Весь массив переменных VARIABLE представляется в виде иерархии имен
переменных и их владельцев, разделенных специальным символом `!':
Обьект!Подобьект!Переменная = Значение
Возможно получение текущих и предыдущих значений переменных, а также
выбор интересующих переменных по REGEX-маскам на их имена.
Netstate сервер удобен для проверки правильности работы программы, а так
же получения всех текущих переменных, например текущее показание
счётчика байт на интерфейсе, состояние объекта (UP,DOWN), значение
пользовательских переменных и т.п.
Подключение к netstate выполняется по команде:
# telnet 127.0.0.1 3333
В результате отобразится окно приветствия и сервер готов в выполнению
команд пользователя:
NetState server ready (timeout 30 sec.)
Compress: ZLIB 1.2.2
!
В процессе отладки системы неплохо бы узнать основные команды. Приведу
их в примерах
Any ;* - покажет все переменные которые держит в памяти netmond.
Object NAME - покажет имена всех объектов. Приведу часть вывода сервера
на эту команду:
!OBJECT
Server-Proxy!NAME = "Server-Proxy"
!OBJECT
Catalyst11!NAME = "Catalyst11"
!OBJECT
Catalyst25!NAME = "Catalyst25"
!OBJECT
Catalyst34!NAME = "Catalyst34"
!OBJECT
Catalyst45!NAME = "Catalyst45"
!OBJECT
Catalyst46!NAME = "Catalyst46"
Interface STATUS - покажет статус интерфейсов (DOWN,UP)
Object Cisco - покажет переменные которые есть у объекта "Cisco"
Interface Cisco!1 - покажет данные по интерфейсу "1" у объекта "Cisco"
Any Cisco!1!IfIndex - покажет значение переменной IfIndex на
интерфейсе/сервисе "1" объекта "Cisco".
Настройка агентов SNMP
Еще хотелось бы отметить, что для работы процесса съёма статистики с
сетевого оборудования (сервера, коммутаторы, маршрутизаторы) необходимо
настроить их SNMP программное обеспечение и определить comminuty string,
которым уже будет пользоваться Method router. Приведу примеры
минимальной настройки для оборудования и некоторых сервисов для снятия
статистики по SNMP.
Маршрутизаторы и коммутаторы Cisco:
# conf t
(config)# snmp-server enable informs
(config)# snmp-server community public ro (public доступ на чтение ?ro?)
Cisco PIX Firewall:
# conf t
(config)# snmp-server enable
(config)# snmp-server community public
Утилита bsnmpd из состава FreeBSD 5-STABLE и 6-STABLE:
Настраиваем файл /etc/snmpd.conf.
host := 172.21.81.3
system := 1 # FreeBSD
read := "public"
%snmpd
begemotSnmpdDebugDumpPdus = 2
begemotSnmpdDebugSyslogPri = 7
begemotSnmpdCommunityString.0.1 = $(read)
begemotSnmpdCommunityDisable = 1
begemotSnmpdPortStatus.[$(host)].161 = 1
begemotSnmpdPortStatus.127.0.0.1.161 = 1
begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1
begemotSnmpdLocalPortType."/var/run/snmpd.sock" = 4
sysObjectId = 1.3.6.1.4.1.12325.1.1.2.1.$(system)
Добавляем в rc.conf строку bsnmpd_enable="YES" и запускаем:
# /etc/rc.d/bsnmpd start
Проверяем /var/log/messages на наличие/отсутствие ошибок.
Пакет Net-SNMP из портов:
Правим файл /usr/local/share/snmp/snmpd.conf, оставляем/добавляем запись
про community string:
rocommunity public 172.21.81.3
Добавляем в rc.conf строку snmpd_enable="YES" и запускаем:
# /usr/local/etc/rc.d/snmpd.sh start
Служба SNMP в Microsoft Windows
Для начала устанавливаем службу: Пуск(Start)/ Настройка(Settings)/
Панель Управления (Control Panel)/ Установка удаление программ (Add or
remove programs)/ Установка компонентов Windows (Add/remove Windows
Components)/ Средства управления и наблюдения (Management and Monitoring
Tools)/ Протокол SNMP (Simple Network Management Protocol). После
установки необходимо выполнить настройку службы Пуск/ Настройка/ Панель
управления/ Администрирование/ Службы. Находим службу "Служба SNMP"
("SNMP Service"), можно сразу выполнить переход на закладку
"Безопасность". Добавляем новое имя сообщества (community string) по
кнопке "Добавить" для чтения.
Проверка работы SNMP агентов
После запуска агентов SNMP необходимо выполнить проверку работы. Я делаю
это через snmpwalk из пакета Net-SNMP вот так:
% snmpwalk -v версия_протокола cc communitystring IP
% snmpwalk -v 1 -c public 172.21.81.3
Если данные идут (на экране появится моного информации), значит служба
работает как надо. Если не идут: либо не правильно задана community
string, либо агент snmp не запущен, либо данному хосту нельзя забирать
данные по SNMP.
Для того чтобы определить IfIndex для интерфейсов, например в MS
Windows, я делаю следующее: читаю ifTable (кому удобнее можете все
данные по snmp прочитать) нахожу там что-то вроде:
IF-MIB::ifNumber.0 = INTEGER: 2
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.65539 = INTEGER: 65539
IF-MIB::ifDescr.1 = STRING: MS TCP Loopback interface
IF-MIB::ifDescr.65539 = STRING: Realtek RTL8139 Family PCI FastEthernet NIC
Тут видно что имеется 2 интерфейса - Loopback и rl, имеющие ifIndex=1 и
65539 соответственно.
Мониторинг интерфейсов, имеющих IfIndex больше 65535
-----------------------------------------------------
С такой задачей я столкнулся только при мониторинге серверов MS Windows.
Причина в том, что netmond отказывается принимать интерфейсы в
конфигурационном файле, имеющие IfIndex больше 65535, узнать об этом
можно будет после запуска в файле /var/log/messages будет строка вроде
"interface index out of range". Лекарство нашлось только маленькой
правкой кода netmond в файле parseconf.y. Находим там поиском 2 строки
содержащие "interface index out of range" и правим в условиях:
if ($2 < 1 || $2 > 65535) цифру 65535 на что то вроде 655350 (может не совсем
правильно, но я сделал так).
После этого пересобираем netmond.
# cd /usr/ports/net-mgmt/netmond
# make patch
# cd work/netmond-2.2-b6
# vi parseconf.y
# cd /usr/ports/net-mgmt/netmond
# make install clean
Сохранение в rrdtool других числовых значений
Для того чтобы сохранять какие-то другие числовые параметры (загрузка
CPU Cisco маршрутизаторов, свободная память, количество процессов и
т.п.) в rrdtool необходимо сначала их получать, то есть написать
соответствующий метод опроса (см. http://soft.risp.ru), чтобы определить
переменную в netmond. Если числовое значение считывается по SNMP через
известный идентификатор, то можно в конфигурационном файле netmond
прописать:
Save "save_var" {
# Создаём новый пользовательский метод сохранения данных в rrdtool
# метод принимает 2 аргумента, первый имя создаваемого файла
# второй строка с сохраняемыми данными
# количество ячеек RRA определено в методе сохранения
Pipe "/usr/local/sbin/rrdsave"
Data
"$DATADIR/$1\n"
"60\n"
"RRA:AVERAGE:0.5:1:10080 RRA:AVERAGE:0.5:60:10080\n"
"$2"
}
Object "Cisco" {
Address "10.1.1.1"
Method router "public"
Save "make_dir"
Interface 1 { Save "make_dir" Save "save_rrd_if" }
Interface 2 { Save "make_dir" Save "save_rrd_if" }
# Прописываем переменную которую нам надо считать по SNMP
# ВНИМАНИЕ ЭТО ВСЕГО ЛИШЬ ПРИМЕР ИДЕНТИФИКАТОРА
$testvar 1.3.6.1.2.1.2.1.0
# Получаем значение переменной
Method SNMP "public" {$testvar}
# Вызываем метод сохранения, передав ему 2 параметра через пробел
# имя файла лучше давать такое же как название переменой
# строка ${testvar}:testvar:GAUGE:600:0:U уже была рассмотрена выше
Save "save_var" "testvar ${testvar}:testvar:GAUGE:600:0:U"
}
После запуска netmond должен будет создать файл testvar в каталоге
объекта "Cisco".Можно будет просмотреть какие данные будут положены в
файл:
# rrdtool fetch testvar AVERAGE
Построение графиков из командной строки
Таким образом, мы имеем систему сбора числовых параметров и сохранения
их в rrdtool базу. Теперь самое дело отобразить полученные значения.
Отображение можно сделать средствами командной строки (подробнее man
rrdgraph). Я приведу пример скрипта для построения графиков байтовой
загрузки для файлов интерфейсов, созданных методом "save_rrd_if":
#!/bin/sh
/usr/local/bin/rrdtool graph $1 \
--end $4 --start $3 \
--width 600 --height 400 \
--imgformat PNG --title "Image PNG" \
--color BACK#FAFAFA \
DEF:ifin=$2:ifinoctets:AVERAGE \
DEF:ifout=$2:ifoutoctets:AVERAGE \
CDEF:ifin1=ifin,60,/ \
CDEF:ifout1=ifout,60,/ \
VDEF:sumin=ifin1,TOTAL \
VDEF:sumout=ifout1,TOTAL \
VDEF:maxin=ifin1,MAXIMUM \
VDEF:maxout=ifout1,MAXIMUM \
VDEF:avgin=ifin1,AVERAGE \
VDEF:avgout=ifout1,AVERAGE \
AREA:ifin1#00FF00:In \
GPRINT:maxin:Max=%lf%s \
GPRINT:avgin:Avg=%lf%s \
GPRINT:sumin:Sum=%lf%s\l \
LINE1:ifout1#0000FF:Out \
GPRINT:maxout:Max=%lf%s \
GPRINT:avgout:Avg=%lf%s \
GPRINT:sumout:Sum=%lf%s\l
Синтаксис использования:
% /path/to/script /путь_до_создаваемого_изображения /путь_до_rrd_файла
начальное_время_на_графике конечное_время_на_графике
Время задаётся в формате, который воспринимает rrdtool. Я пользуюсь
временем в таком виде: -1m (минуту назад), -54m (54 минуты назад), -12d
(12 дней назад), now (текущий момент) и т.п. Пример использования
данного скрипта:
% script /tmp/graph.png /var/netmon/Cisco/Interface1/rrdint -1d now
Первым параметром скрипт принимает имя создаваемого файла изображения,
вторым - путь до файла содержащего rrd данные, 3 и 4 параметры
определяют время, за которое будет построен график.
Чтобы построить график, например, по моноадресным пакетом, достаточно
будет поменять 2 строки, задать другой источник данных (другой столбец в
нашем случае):
Находим строки:
DEF:ifin=$2:ifinoctets:AVERAGE \
DEF:ifout=$2:ifoutoctets:AVERAGE \
Меняем на:
DEF:ifin=$2: ifinucastpkts:AVERAGE \
DEF:ifout=$2: ifoutucastpkts:AVERAGE \
Название столбцов можно посмотреть у файла через rrdtool fetch или
rrdtool info.
Чтобы построить данные из одного столбца, или одной переменной (как у
нас в примере testvar) скрипт придётся модифицировать.
Покажу пример как это сделать:
#!/bin/sh
/usr/local/bin/rrdtool graph $1 \
--end $4 --start $3 \
--width 600 --height 400 \
--imgformat PNG --title "Image PNG" \
--color BACK#FAFAFA \
DEF:varname=$2:testvar:AVERAGE \
LINE1:varname#0000FF:line
Параметры скрипта те же самые, только изменены несколько параметров
подписи данных на графике. Думаю, по данным примерам легко написать
скрипты под другие задачи.
Пример Web оболочки для работы с графиками
Описанный выше способ построения графиков не всегда удобен. Некоторые
задачи администрирования требуют просмотра многих графических
зависимостей за короткий промежуток времени, поэтому мне пришлось
написать под свои нужды некоторый web интерфейс на Perl для удобной
работы с графиками загрузки интерфейсов сети. Скачать пример можно вот с
http://neon.heavennet.ru/shownetmon.tar.gz (~13 Kb). Данный архив
содержит 2 каталога (cgi-bin,data) и описание по установке. Принцип
работы скрипта сводится к следующему: получив запрос от пользователя
скрипт подключается к netstate порту у netmond и считывает имена всех
интерфейсов, объектов и сервисов, а так же DATADIR для них. Скрипт на
основании этих данных строит дерево объктов мониторинга с интерфейсами и
пользователю остаётся лишь выбрать требуемый интерфейс для просмотр
графика. Скиншот смотреть Здесь (~80 Кб).
Настройка скрипта отображения данных:
Копируем содержимое каталога cgi-bin (файл shownetmon) в соответствующий
каталог web сервера.
Даём право на запуск пользователю www:
# chmod 755 /usr/local/www/cgi-bin/shownetmon
В скрипте shownetmon устанавливаем адрес netstate порта у netmond:
$main::config{'netstateaddress'} = "127.0.0.1"; # Адресс NETSTATE сервера
$main::config{'netstateport'} = 3333; # Порт NETSTATE сервера
Устанавливаем в скрипе каталог куда будут скаладыватся созданные изображения:
$main::config{'imgdir'} = "/usr/local/www/data/img"; # Путь до создаваемых изображений
$main::config{'webimgdir'} = "/img"; # Путь до изображений в www
Создаём каталог /usr/local/www/data/img. Даём пользователю www
возможность записи в него:
# chmod 777 /usr/local/www/data/img
или
# chown www /usr/local/www/data/img
# chmod 755 /usr/local/www/data/img
Копируем папку data/shownetmon в соответствующий каталог web сервера.
Даём права доступа пользователю www на все файлы в этой папке.
Запускаем netmond если не запущен.
Проверяем есть ли возможность с хоста заходить на порт NetSTATE.
# telnet 127.0.0.1 3333
Если не удаётся подключится, то смотрим настройки firewall и конфиг
netmon.conf на предмет netstate групп.
Устанавливаем модуль Net-Telnet для perl если он отсутствует:
# cd /usr/ports/net/p5-Net-Telnet
Обращаемся http://IP/cgi-bin/shownetmon, предварительно включив JavaScript.
Заключение
В заключении хотел бы отметить нагрузку на компьютер, создаваемую
созданной системой. Данная система разворачивалась на компьютерах с
различной тактовой частотой CPU.Как показал опыт Intel Pentium 166 мог
сохранять и отображать статистику примерно по 200 интерфейсам. Компьютер
на базе Intel 867 Мгц справляется без труда с 500 интерфейсами (больше
просто не было), не нагружая систему больше 1%. Лишь на момент
сохранения нагрузка слегка возрастает на 1-5 секунд. Если учесть, что
обновление данных в базах rrdtool идёт раз в минуту, можно сказать, что
полученная система требует куда меньше ресурсов системы, чем старушка
mrtg.
P.S.: Текст статьи находится по ссылке http://neon.heavennet.ru/netmond_rrdtool.html
и ваш комментарий можно покритиковать
я даже не понимаю зачем cacti, если это все можно слелат при помощи rrdtool и элементарного скрипта на shell, с котором snmpget делает опрос счетчиков и обновляет базу rrd.
>и ваш комментарий можно покритиковать
>я даже не понимаю зачем cacti, если это все можно слелат при
>помощи rrdtool и элементарного скрипта на shell, с котором snmpget делает
>опрос счетчиков и обновляет базу rrd.
угу... но как только кол-во железок помноженое на кол-во портов на них превысит Ваше терпение в дописывании оного скрипта под них - Вы сразу вспомните магическое слово cacti... простой шелл скрипт хорош на 2-3 ну на 5 железок с max 2-мя портами, потом начинается гимор... все это уже пройдено...
а что мешает "осилить" дефолтовый конфиг netmond? там для нерусских написано
# Hint:
# '%include file.name' directive reduce config and make it more readable.
от себя даю еще хинт:
1) cp catalist1 catalist2
2) тупо меняем адрес и comunity string (в вашем любимом и дюрявом кактусе тоже необходимые телодвижения)
3) echo "%include catalist2">>netmond.conf
4) перезапускаем netmond
5) радуемся
p.s. юзать еще и *sql для таких дел это "пять" (я про кактус). да, автора статьи не посмотрел но интересно насколько она отличается от хаутушки от авторов:)
по поводу гемора.. я лично считаю что более геморно тупо тыкать мышой по чексоксам. много проще делать copy-paste интерфейсов в конфиге.
Шикарная статья! Будет применяться совместно с биллинговой системой. В биллинге есть данные, кто на каком порту сидит, оттуда будем генерировать конфиг, а отображать прямо в карточке абонента.
Cacti и прочие "поделки" для этого не подходят, так что не надо про "велосипед". Cacti - вообще комбайн, со всеми вытекающими неповоротливостями и тормозами. А это решение идеально для тех, кому нужно решить подобную задачу наилучшим образом.
Понимание основ RRD не мешает использовать cacti. Более того, никто не запрещает интегрировать сторонний RRD в cacti. Наколенные решения плохи, например, тем, что не позволяют вести политику доступа, например, по определенным графикам. Или опять предлагаете городить огород с HTTP-AUTH?
Какти позволяет создавать свои шаблоны для снятия статистики чего-то там. Не понимая как работает RRD по нормальному этих шаблонов не сделаешь. Вот я об этом и говорил.
Стандартные шаблоны которые идут уже установленные, не всегда верно рисуют статистику.
>Стандартные шаблоны которые идут уже установленные, не всегда верно рисуют статистику.
Если Вы можете написать шаблоны, охватывающие больший спектр ОС, предложите.
cacti достаточно удачная система шаблонизации для RRD. Для новичка нужно минимум знаний для начала работы. Из действительно минусов можно отметить, что порой для создания некоторых однотипных графиков приходится осуществлять мышиную возню, чего можно было бы избежать в случае с собственным RRD. Этот минус легко побороть потратив один вечер на изучение внутренней структуры cacti (по времени не сравнимо с затратами на написание собственных sh/perl обвязок).
Уважаемый переадмин, объясните мне вот такой факт: что кактус, что ручками написанный скрипт, генерирующий графики на основе РРД, при изменении интервала времени выдают совершенно разные значения. К примеру, возьмём момент времени Среда, 18:00: за интервал "последний день" значение исследуемой величины больше 1М, а за интервал "последние 2 дня" почему-то это же значение не доходит даже до 700К.
Вот такие вот 103% "Единой России"...
> объясните мне вот такой факт: что кактус, что ручками написанный
> скрипт, генерирующий графики на основе РРД, при изменении интервала времени выдают
> совершенно разные значения. К примеру, возьмём момент времени Среда, 18:00: за
> интервал "последний день" значение исследуемой величины больше 1М, а за интервал
> "последние 2 дня" почему-то это же значение не доходит даже до
> 700К.
Думаю Вам стоит все же повнимательнее почитать как работает rrd.
>> объясните мне вот такой факт: что кактус, что ручками написанный
>> скрипт, генерирующий графики на основе РРД, при изменении интервала времени выдают
>> совершенно разные значения. К примеру, возьмём момент времени Среда, 18:00: за
>> интервал "последний день" значение исследуемой величины больше 1М, а за интервал
>> "последние 2 дня" почему-то это же значение не доходит даже до
>> 700К.
> Думаю Вам стоит все же повнимательнее почитать как работает rrd.
Почитал внимательнее. Из 100 мануалов только в 1 оказался интересующий меня момент. Теперь самописный скрипт работает корректно. А кактус как врал, так и врёт.
здравствуйте. Нужна помощь. Скажите сохраняет ли RRD tool данные по которым строит графики в отдельные файлы в табличной (числовой) форме? Срочно нужны данные по сетевому трафику.
>здравствуйте. Нужна помощь. Скажите сохраняет ли RRD tool данные по которым строит
>графики в отдельные файлы в табличной (числовой) форме? Срочно нужны данные
>по сетевому трафику.