Настройка мониторинга сетевых устройств на базе rrdtool
(ubuntu server)Многие провайдеры компьютерных сетей проводят постоянный мониторинг своих сетевых устройств в этой статье я опишу настройку мониторинга с помощью rrdtool.
RRDtool (Round Robin Database). Обеспечивает хранение и отображение данных мониторинга (загрузка каналов, температура и любая другая зависящая от времени последовательность данных, которую можно получить некоторым способом). Задумывалась как повторная, но более правильная реализация MRTG. Объём хранимых данных не увеличивается со временем (ячейки хранения используются циклически). Использование различных функций консолидации данных позволяет охватывать большие интервалы времени без чрезмерного увеличения объема БД за счет снижения разрешающей способности.
Снимать статистику будем с помощью утилиты snmpwalk
Установка
#sudo apt-get install rrdtool
#sudo apt-get install snmp
Настройка
Создайте каталог для хранения скриптов и баз данных которые будут использоваться rrdtool
допустим /var/rrd и /var/rrd/db
Теперь нужно создать базу данных для хранения статистики для вашего сетевого устройства
#rrdtool create /var/rrd/db/switch.rrd \
–step 300 \
DS:input:COUNTER:600:0:50000000 \
DS:output:COUNTER:600:0:50000000 \
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:60 \
RRA:MAX:0.5:6:700 \
RRA:MAX:0.5:24:775 \
RRA:MAX:0.5:288:797
Эта команда создает rrdb switch.rrd для снятия статистики с сетевого интерфейса свича, предполагая, что данные в нее будут поступать раз в 5 минут, задаются два источника данных: счетчик принятых и отправленных байт. Создаются также 8 рядов, четыре из которых используют для консолидации данных функцию AVERAGE, а остальные – MAX. При этом создаются следующие промежутки: 600 ячеек по 5 минут, 700 ячеек по 30 минут (5*6), 775 ячеек по два часа (5*24), а также 797 ячеек, хранящих статистику отсчетов за день. В данном случае имитируется поведение mrtg, обрабатывающей такие же временные промежутки.
Значения функций
DS:input:COUNTER:600:0:50000000 \
DS:output:COUNTER:600:0:50000000 \
Установлены так что хранимые данные могут принимать значения от 0 до
50000000, в данном случае будет производится статистика загрузки
сетевого устройства то есть скорость канала и верхний порог мы
установили 50 Mbit/s. Если вы нехоитите выставлять ограничения то
используйте запись типа
DS:input:COUNTER:600:U:U \
DS:output:COUNTER:600:U:U \
И так база данных создана.
Для внесения данных со счетчиков в rrdb используется команда rrdtool update, имеющая достаточно простой формат:
rrdtool update имя_rrdb.rrd время:значение_DS1[:значение_DS2[:...]]
Для считывания данных с устройства используем snmpwalk
При условии что на сетевом устройстве включен агент snmp
и SNMP Community: имеет значение public
Пример команды:
#snmpwalk -v 2c -c public 10.9.15.1 IF-MIB::ifInOctets.2
IF-MIB::ifInOctets.2 = Counter32: 449999725
Где -v 2c это версия протокола snmp
10,9,15,1 это адрес сетевого устройства
IF-MIB::ifInOctets считывание входящих данных на интерфейсе под номером 2 сетевого устройства.
Также и для исходящих данных
# snmpwalk -v 2c -c public 10.9.15.4 IF-MIB::ifOutOctets.2
IF-MIB::ifOutOctets.2 = Counter32: 2348960795
*Хочу заметить что данный способ используется в том случае если
данные снимаются с 32-битных счётчиков который не позволяют считать
данные загрузки канала свыше 113 Мбит/с
если ваше сетевое устройство имеет пропускную способность более 100
Мбит/с и скорость которую необходимо считывать будет больше 113 Мбит/с
то стоит использоваться 64-битные счётчики
пример:
#snmpwalk -v 2c -c public 10.9.15.1 IF-MIB::ifHCInOctets.2
#snmpwalk -v 2c -c public 10.9.15.1 IF-MIB::ifHCOutOctets.2
Для того что бы получить последний кусочек строки
IF-MIB::ifOutOctets.2 = Counter32: 2348960795
то есть сами данные используем
#snmpwalk -v 2c -c public 10.9.15.1 IF-MIB::ifInOctets.2 | awk ‘{print($4)}’`
2348960795
Теперь создадим простой скрип для считывания данных с сетевого устройства и сохранении их в базу.
use.sh
#!/bin/bash
input=`snmpwalk -v 2c -c public 10.9.15.4 IF-MIB::ifInOctets.2 | awk ‘{print($4)}’`
output=`snmpwalk -v 2c -c public 10.9.15.4 IF-MIB::ifOutOctets.2 | awk ‘{print($4)}’`
##заполняем переменные
a=`echo $input*8 | bc ` # переводим байты в биты
b=`echo $output*8 | bc `
/usr/bin/rrdtool update /var/rrd/db/switch.rrd \
N:$a:$b
# Сохраняем в базу 2 переменне со значениями входящей и исходящей скоростями.
Теперь отобразим данные на графике и сохраним его в формат png
Напишем скрипт для отрисовки графиков из базы данных:
graph.sh
#!/bin/bash
/usr/bin/rrdtool graph /var/www/switch.png –slope-mode –step 60\
–width 400 –height 100 –imgformat PNG \
–start -86400 \
–title «switch» –rigid –color BACK#FAFAFA \
–vertical-label bit/sec \
DEF:inoctets=/var/rrd/db/switch.rrd:input:AVERAGE \
DEF:outoctets=/var/rrd/db/switch.rrd:output:AVERAGE \
AREA:inoctets#0000ff:»In traffic. Now in (bit/sec) =» \
GPRINT:inoctets:LAST:%.2lf \
AREA:inoctets#0000ff:»In traffic. Now max in (bit/sec) =» \
GPRINT:inoctets:MAX:%.2lf \
AREA:inoctets#0000ff:»In traffic. Now average in (bit/sec) =» \
GPRINT:inoctets:AVERAGE:%.2lf \
LINE1:outoctets#00ff00:»Out traffic. Now out (bit/sec) =» \
GPRINT:outoctets:LAST:%.2lf \
LINE1:outoctets#00ff00:»Out traffic. Now max out (bit/sec) =» \
GPRINT:outoctets:MAX:%.2lf \
LINE1:outoctets#00ff00:»Out traffic. Now average out (bit/sec) =» \
GPRINT:outoctets:AVERAGE:%.2lf \
Для того что бы делать графики не только за сутки, а и за неделю
достаточно поменять значения —start на –start -604800 \ Ну и конечно
же название в файла стоит добавить пометку week, что бы не было
перезаписи.
/usr/bin/rrdtool graph /var/www/switch_week.png –slope-mode –step 60\
–width 400 –height 100 –imgformat PNG \
–start -604800 \
–title «switch» –rigid –color BACK#FAFAFA \
–vertical-label bit/sec \
DEF:inoctets=/var/rrd/db/switch.rrd:input:AVERAGE \
DEF:outoctets=/var/rrd/db/switch.rrd:output:AVERAGE \
AREA:inoctets#0000ff:»In traffic. Now in (bit/sec) =» \
GPRINT:inoctets:LAST:%.2lf \
AREA:inoctets#0000ff:»In traffic. Now max in (bit/sec) =» \
GPRINT:inoctets:MAX:%.2lf \
AREA:inoctets#0000ff:»In traffic. Now average in (bit/sec) =» \
GPRINT:inoctets:AVERAGE:%.2lf \
LINE1:outoctets#00ff00:»Out traffic. Now out (bit/sec) =» \
GPRINT:outoctets:LAST:%.2lf \
LINE1:outoctets#00ff00:»Out traffic. Now max out (bit/sec) =» \
GPRINT:outoctets:MAX:%.2lf \
LINE1:outoctets#00ff00:»Out traffic. Now average out (bit/sec) =» \
GPRINT:outoctets:AVERAGE:%.2lf \
Для графиков за месяц используйте значение start -2592000 \
За год -31536000 \
И создавая аналогичным путём графики для разных диапазонов времени
можно получить статистику загрузки канала сетевого устройства.
Для удобства я создал скрипт объединяющей запуск скрипта use.sh и graph.sh и добавил его в крон для выполнения каждые 5 минут
rrd.sh
#!/bin/sh
export PATH=/usr/local/bin/:/usr/bin/:/bin/
cd /var/rrd
/var/rrd/use.sh
/var/rrd/graph.sh
Теперь каждый 5 минут мы снимаем данные с устройства и складываем его
в базу а затем скрипт рисует графики для каждого интервала времени.