MRTG и CentOS 5. Использование скриптов для сбора статистики.
Мне потребовалось собирать базовую статистику с Linux-сервера, работающего под управлением CentOS 5.3. Так как ничего сложного от системы мониторинга не требовалось, только простые графики по нескольким параметрам, я выбрал MRTG. Подробно рассказывать, что это такое, нет смысла: в Интернете по этой теме достаточно материалов.
Установить MRTG из rpm-пакета очень просто:
yum install mrtg
Статистику предполагалось собирать через SNMP, поэтому на сервере, с которого нужно получать данные, требуется установить snmpd:
yum install snmpd
Теперь настроим /etc/snmp/snmpd.conf. Я разрешил чтение из всего дерева. У меня получился такой вариант:
# cat /etc/snmp/snmpd.conf | more
syslocation Someplace Verhnyaya street building 3 ats 1
syscontact Kudryavtsev Ignat <i.kudryavtsev@somemail.ru> +79627277780
com2sec mrtg 127.0.0.1/32 CommunityKey # Разрешать запросы только для 127.0.0.1 с ключом CommunityKey
group MyROGroup v2c mrtg
view all included .1 80
access MyROGroup "" any noauth exact all none none
Добавим опцию для snmpd, чтобы демон слушал только 127.0.0.1, причем на нестандартном порте 1161:
# cat /etc/sysconfig/snmpd.options
# snmpd command line options
# OPTIONS="-Lsd -Lf /dev/null -p /var/run/snmpd.pid -a"
OPTIONS="127.0.0.1:1161"
Теперь можно попробовать создать конфигурацию MRTG. Она создается с помощью утилиты cfgmaker. Подробнее о ключах можно прочитать в man cfgmaker.
cfgmaker --snmp-options=:1161::::2c \
--global 'WorkDir: /var/www/mrtg' \
--global 'Options[_]: bits,growright' \
CommunityKey@127.0.0.1 > /etc/mrtg/mrtg.cfg
Эта команда отправляет запросы на порт 1161, использует SNMP версии 2c с ключом CommunityKey по адресу 127.0.0.1, задает директорию для логов и графиков /var/www/mrtg, а также строит графики в битах слева направо. Файл конфигурации /etc/mrtg/mrtg.cfg будет перезаписан.
В MRTG есть дополнительные скрипты, которые по параметрам cfgmaker пытаются получить информацию о сетевых интерфейсах хоста 127.0.0.1 и добавить необходимые строки в конфигурацию.
Теперь нужно добавить запуск MRTG с конфигурацией mrtg.cfg, чтобы он регулярно собирал новые значения и рисовал точки на графиках:
crontab -e
Добавим запуск раз в 5 минут:
*/5 * * * * env LANG=C mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log
Но статистика все равно не будет собираться. В CentOS 5 есть проблема с распознаванием кодировки значений, которые скрипту MRTG передаются в результате работы библиотеки SNMP в Perl.
Например, для записи в конфигурации такого вида:
Target[127.0.0.1_5]: 1.3.6.1.2.1.25.3.3.1.2.768&1.3.6.1.2.1.25.3.3.1.2.771:CommunityKey@127.0.0.1:1161::::2c
MaxBytes[127.0.0.1_5]: 100
YLegend[127.0.0.1_5]: CPU LOAD
Options[127.0.0.1_5]: growright, integer, gauge
Title[127.0.0.1_5]: CPU LOAD
PageTop[127.0.0.1_5]: <H1>CPU LOAD</H1>
Данные собираться не будут; более того, в логах будут одни нули, а на графиках будет пусто. В CentOS 5.3 по умолчанию ставится версия MRTG 2.14.5. Я пробовал последнюю стабильную на тот момент версию mrtg-2.16.2.zip, но это не помогло.
Поэтому я решил использовать внешние скрипты: результаты их работы передаются в MRTG, а MRTG уже отрисовывает графики.
Например, чтобы снимать статистику загрузки двух ядер процессора, памяти, дисков и сетевых интерфейсов, я создал следующие записи, в которые значения передаются через скрипты:
# WAN INTERFACE
Target[127.0.0.1_6]: `/mrtgscripts/intETH1`
MaxBytes[127.0.0.1_6]: 12500000
Title[127.0.0.1_6]: Traffic Analysis for Internet Interface (ip.ad.dr.es)
PageTop[127.0.0.1_6]: <H1>INTERNET INTERFACE UTILIZATION</H1>
YLegend[127.0.0.1_6]: Bytes/sec
ShortLegend[127.0.0.1_6]: Bytes
LegendI[127.0.0.1_6]: INTERFACE Utilization RX (Bytes)
LegendO[127.0.0.1_6]: INTERFACE Utilization TX (Bytes)
Options[127.0.0.1_6]: gauge, nopercent
# LAN INTERFACE
Target[127.0.0.1_7]: `/mrtgscripts/intETH0`
MaxBytes[127.0.0.1_7]: 12500000
Title[127.0.0.1_7]: Traffic Analysis for LAN Interface (ip.ad.dr.es)
PageTop[127.0.0.1_7]: <H1>LAN INTERFACE UTILIZATION</H1>
ShortLegend[127.0.0.1_7]: Bytes
YLegend[127.0.0.1_7]: Bytes/sec
LegendI[127.0.0.1_7]: INTERFACE Utilization RX (Bytes)
LegendO[127.0.0.1_7]: INTERFACE Utilization TX (Bytes)
Options[127.0.0.1_7]: gauge, nopercent
# CPU LOAD
Target[127.0.0.1_5]: `/mrtgscripts/cpu_load.sh cpu`
MaxBytes[127.0.0.1_5]: 100
YLegend[127.0.0.1_5]: CPU LOAD
Options[127.0.0.1_5]: gauge, nopercent
Title[127.0.0.1_5]: CPU LOAD
PageTop[127.0.0.1_5]: <H1>CPU LOAD</H1>
AbsMax[127.0.0.1_5]: 100
ShortLegend[127.0.0.1_5]: %
LegendI[127.0.0.1_5]: CPU Utilization Core 1 (percentage)
LegendO[127.0.0.1_5]: CPU Utilization Core 2 (percentage)
# MEMORY USAGE
Target[127.0.0.1_8]: `/mrtgscripts/memory.sh`
MaxBytes[127.0.0.1_8]: 2001
YLegend[127.0.0.1_8]: Memory Usage
Options[127.0.0.1_8]: gauge, nopercent
Title[127.0.0.1_8]: MEMORY USAGE
PageTop[127.0.0.1_8]: <H1>MEMORY USAGE</H1>
AbsMax[127.0.0.1_8]: 2001
ShortLegend[127.0.0.1_8]: MegaBytes
LegendI[127.0.0.1_8]: Memory Free (Mbytes)
LegendO[127.0.0.1_8]: Memory Used (Mbytes)
# DISK USAGE
Target[127.0.0.1_9]: `/mrtgscripts/disk_usage.sh`
MaxBytes[127.0.0.1_9]: 72
YLegend[127.0.0.1_9]: Disk Usage
Options[127.0.0.1_9]: gauge, nopercent
Title[127.0.0.1_9]: DISK USAGE
PageTop[127.0.0.1_9]: <H1>DISK USAGE</H1>
AbsMax[127.0.0.1_9]: 72
ShortLegend[127.0.0.1_9]: GBytes
LegendI[127.0.0.1_9]: DISK FREE (Gbytes)
LegendO[127.0.0.1_9]: DISK USED (Gbytes)
Ниже привожу примеры скриптов.
# cat /mrtgscripts/cpu_load.sh
NAME=$1
echo `snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 1.3.6.1.2.1.25.3.3.1.2.769 | cut -d ' ' -f 4`
echo `snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 1.3.6.1.2.1.25.3.3.1.2.771 | cut -d ' ' -f 4`
echo `/bin/date +%s`
echo $NAME
# cat /mrtgscripts/disk_usage.sh
echo `df -h | awk '/sda3/ {print $3}' | sed "s/G//"`
echo `df -h | awk '/sda3/ {print $4}' | sed "s/G//"`
echo `snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 sysUptime | cut -d ' ' -f 5`
echo DiskUsage
# cat /mrtgscripts/memory.sh
echo `free -m | awk '/Mem/ {print $4}'`
echo `free -m | awk '/Mem/ {print $3}'`
echo `snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 sysUptime | cut -d ' ' -f 5`
echo MemoryUsage
# cat /mrtgscripts/intETH0
# LAN INTERFACE
LASTRX=`cat ./RXeth0~`
NEWRX=`snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 ifHCInOctets.3 | cut -d ' ' -f 4`
SCOPERX=`expr $NEWRX - $LASTRX`
SPEEDRX=`expr $SCOPERX / 300`
let $SPEEDRX
echo $SPEEDRX
echo $NEWRX > ./RXeth0~
LASTTX=`cat ./TXeth0~`
NEWTX=`snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 ifHCOutOctets.3 | cut -d ' ' -f 4`
SCOPETX=`expr $NEWTX - $LASTTX`
SPEEDTX=`expr $SCOPETX / 300`
let $SPEEDTX
echo $SPEEDTX
echo $NEWTX > ./TXeth0~
echo `snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 sysUptime | cut -d ' ' -f 5`
echo eth0-LAN
# cat /mrtgscripts/intETH1
# WAN INTERFACE
LASTRX=`cat ./RXeth1~`
NEWRX=`snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 ifHCInOctets.2 | cut -d ' ' -f 4`
SCOPERX=`expr $NEWRX - $LASTRX`
SPEEDRX=`expr $SCOPERX / 300`
let $SPEEDRX
echo $SPEEDRX
echo $NEWRX > ./RXeth1~
LASTTX=`cat ./TXeth1~`
NEWTX=`snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 ifHCOutOctets.2 | cut -d ' ' -f 4`
SCOPETX=`expr $NEWTX - $LASTTX`
SPEEDTX=`expr $SCOPETX / 300`
let $SPEEDTX
echo $SPEEDTX
echo $NEWTX > ./TXeth1~
echo `snmpwalk -Osn -c CommunityKey -v 2c 127.0.0.1:1161 sysUptime | cut -d ' ' -f 5`
echo eth1-INTERNET
Теперь осталось создать индексный файл, чтобы все графики были на одной странице:
indexmaker /etc/mrtg/mrtg.cfg > /var/www/mrtg/index.html
Эта команда создаст файл, в котором будут графики всех переменных. Предполагается, что установлен веб-сервер Apache, а рабочая директория — /var/www/mrtg/.
Не забудьте изменить файл /etc/httpd/conf.d/mrtg.conf, чтобы разрешить доступ с нужных IP-адресов.
Должно получиться нечто похожее:
В следующей статье я покажу, как использовать MRTG для снятия статистики с VoIP-оборудования Cisco.
Ссылки: