Работа с rrdtool на FreeBSD

Работа с rrdtool на FreeBSD

Если хочется визуализировать статистику загрузки процессора, памяти, изменения температур и прочих нужных вещей, то хорошим вариантом является связка snmpd и rrdtool.
Увидев реализованные варианты, решил сделать аналогичное свое, а заодно выложить кукбук по настройке для будущих реализаций...

добавляем путь /usr/local/bin/ в /etc/crontab/ в переменную PATH
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin

устанавливаем из портов snmp:
/usr/ports/net-mgmt/net-snmp
make
make install
make clean
rehash

и rrdtool
/usr/ports/databases/rrdtool
make
make install
make clean
rehash

перегружаемся

настраиваем snmp запустив
snmpconf -i

в меню
1: snmpd.conf
2: snmp.conf
3: snmptrapd.conf
выбираем 1, так как настраивать будем snmpd.conf

в появившемся меню
1: System Information Setup
2: Access Control Setup
3: Trap Destinations
4: Monitor Various Aspects of the Running Host
5: Extending the Agent
6: Agent Operating Mode
выбираем 1 для заполнения контактной информации

в этом меню
1: The [typically physical] location of the system.
2: The contact information for the administrator
3: The proper value for the sysServices object.
последовательно выбираем 1 2 и 3 указывая произвольные месторасположение машины, контактное лицо и системные задачи машины
для меню 3 буудет такой диалог:
Select section: 3

Configuring: sysservices
Description:
The proper value for the sysServices object.
arguments: sysservices_number

does this host offer physical services (eg, like a repeater) [answer 0 or 1]: 0
does this host offer datalink/subnetwork services (eg, like a bridge): 0
does this host offer internet services (eg, supports IP): 1
does this host offer end-to-end services (eg, supports TCP): 1
does this host offer application services (eg, supports SMTP): 1

Finished Output: sysservices 76

выходим из меню набрав finished, попадаем в меню
1: System Information Setup
2: Access Control Setup
3: Trap Destinations
4: Monitor Various Aspects of the Running Host
5: Extending the Agent
6: Agent Operating Mode
выбираем 2 для выбора работы протокола работы SNMP

в меню
1: a SNMPv3 read-write user
2: a SNMPv3 read-only user
3: a SNMPv1/SNMPv2c read-only access community name
4: a SNMPv1/SNMPv2c read-write access community name
можно выбрать 3, так как нам достаточно RO community без авторизации

диалог:
Select section: 3

Configuring: rocommunity
Description:
a SNMPv1/SNMPv2c read-only access community name
arguments: community [default|hostname|network/bits] [oid]

The community name to add read-only access for: public
The hostname or network address to accept this community name from [RETURN for all]:
The OID that this community should be restricted to [RETURN for no-restriction]:

Finished Output: rocommunity public

в данном случае мы установили имя RO community с именем public

выходим в главное меню набрав finished
1: System Information Setup
2: Access Control Setup
3: Trap Destinations
4: Monitor Various Aspects of the Running Host
5: Extending the Agent
6: Agent Operating Mode
выбираем 6 для настройки режима работы агента

в меню
1: Should the agent operate as a master agent or not.
2: The system user that the agent runs as.
3: The system group that the agent runs as.
4: The IP address and port number that the agent will listen on.
выбираем 4

диалог
Select section: 4

Configuring: agentaddress
Description:
The IP address and port number that the agent will listen on.
By default the agent listens to any and all traffic from any
interface on the default SNMP port (161). This allows you to
specify which address, interface, transport type and port(s) that you
want the agent to listen on. Multiple definitions of this token
are concatenated together (using ':'s).
arguments: [transport:]port[@interface/address],...

Enter the port numbers, etc that you want the agent to listen to: 161

Finished Output: agentaddress 161

в данном случае мы установили слушать по всем интерфейсам на порту 161 (UDP порт по умолчанию). Можно указать 127.0.0.1 указав слушать только на localhost на дефолтном порту 161

выходим из меню finished
еще раз выходим finished
выходим из конфигуратора quit
после выхода будет создан файл /usr/local/share/snmp/snmpd.conf с нашими настройками:
syslocation home
syscontact alexey
sysservices 76
rocommunity public
agentaddress 161

в etc/rc.conf добавляем
snmpd_enable="YES"

в файрволе не забываем разрешить UDP на localhost по порту 161

Теперь займемся настройкой rrdtool
Я предпочитаю хранить каждый тематический счетчик в отдельной базе
создадим базу для записи значений загрузки CPU:
rrdtool create /var/log/rrd/cpuload.rrd --step 60 --start N DS:cpuload:GAUGE:120:U:U RRA:AVERAGE:0.5:1:1440
здесь создается база /var/log/rrd/cpuload.rrd
--step 60 с минимальным шагом обновления 1 минута
--start N с началом отсчета с момента создания базы (с текущего момента выполнения команды)
DS
cpuload переменная через которую получать значения из базы называется cpuload
GAUGE писать значение без обработки as is
120 время ожидания каждого значения, если превышено то в ячейку пишется undefined
U:U пороговые значения минимума и макимума которые в данном случае проставлены как неопределнные. для CPU можно поставить 0:100
RRA
AVERAGE:0.5:1 усреднять каждое значение выборкой из одного элемента. в нашем случае конструкция вырожденная так как усредняется КАЖДЫЙ элемент сам относительно себя, а значит ничего не меняется. Это полезно, когда значений на ячейку больше чем одно а надо записать среднее из всех
1440 количество хранимых элементов. В нашем случае 1440 60-секундных интервалов, тоесть 1 сутки.

далее пишем скрипт, заполняющий базу значениями:
взять загрузку CPU в текущий момент можно выполнив
snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.25.3.3.1.2 | awk '{print $4}'

это значение нам надо заносить в базу. Занесение в базу в общем случае выглядит так:
rrdtool update /var/log/rrd/cpuload.rrd N:значение

в итоге наша строка станет выглядеть так:
rrdtool update /var/log/rrd/cpuload.rrd N:`snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.25.3.3.1.2 | awk '{print $4}'`

Пропишем эту строку в /etc/crontab
0-59/1 * * * * root rrdtool update /var/log/rrd/cpuload.rrd N:`snmpwalk -v 2c -c public localhost 1.3.6.1.2.1.25.3.3.1.2 | awk '{print $4}'`
заставив выполняться ее каждую минуту, занося ежеминутное значение загрузки процессора в базу

Обновим правила кронтаба и через несколько минут посмотрим что у нас пишется в базу командой
rrdtool fetch /var/log/rrd/cpuload.rrd AVERAGE

при корректной работе мы должны получить что то вроде этого:
1267603920: nan
1267603980: nan
1267604040: nan
1267604100: nan
1267604160: nan
1267604220: nan
1267604280: nan
1267604340: 3.0061837000e+00
1267604400: 2.0112343500e+00
1267604460: 2.0000000000e+00
1267604520: 2.0000000000e+00
1267604580: 1.0076678167e+00
1267604640: 1.9863752000e+00
1267604700: 1.0187430167e+00
1267604760: 2.9747048667e+00
1267604820: 1.0186701333e+00
1267604880: 1.0000000000e+00
1267604940: 1.0000000000e+00
1267605000: 1.9919802000e+00
1267605060: 3.9627817000e+00
1267605120: nan
как видим, у нас в базу заносятся ежеминутные значения загрузки процессора

Теперь построим график загрузки процессора используя значения нашей базы.
Для простейшего графика нам нужена вот такая команда:
rrdtool graph /usr/home/user/cpuload.png --width 1440 --height 200 --units-exponent 0 --upper-limit 100 --lower-limit 0 --title "CPU Load" DEF:cpuload=/var/log/rrd/cpuload.rrd:cpuload:AVERAGE LINE1:cpuload#00FF00:"Load"
которая создает картинку /usr/home/user/cpuload.png
шириной 1440 (чтобы один пиксель по оси x был равен одному значению из базы
высотой 200
units-exponent 0 задает единицы измерения оси Y. В нашем случае без единиц измерения
верхним лимитом значения Y 100
нижним лимитом значения Y 0
заголовком CPU Load
берем для Y значение cpuload из базы /car/log/rrd/cpuload.rrd
AVERAGE LINE1:cpuload#00FF00:"Load" рисуем линией толщиной 1 зеленым цветом с легендой Load под графиком

заносим отрисовку графика в /etc/crontab на выполнение его раз в 5 минут:
0-55/5 * * * * root rrdtool graph /usr/home/user/cpuload.png --width 1440 --height 200 --units-exponent 0 --upper-limit 100 --lower-limit 0 --title "CPU Load" DEF:cpuload=/var/log/rrd/cpuload.rrd:cpuload:AVERAGE LINE1:cpuload#00FF00:"Load"

Получаем график загрузки процессора за сутки

Точно так же можно построить например график загрузки памяти, используя OID
1.3.6.1.4.1.2021.4.6.0 для количества свободной памяти
1.3.6.1.4.1.2021.4.5.0 для общего количества памяти
вычитая одно из другого можно получить количество используемой памяти.

А для определения свободного места на диске можно воспользоваться OID
1.3.6.1.2.1.25.2.3.1.4.(1,2,3...) hrStorageAllocationUnits
1.3.6.1.2.1.25.2.3.1.5.(1,2,3...) hrStorageSize
1.3.6.1.2.1.25.2.3.1.6.(1,2,3...) hrStorageUsed
с перемножением рамеров и использованных юнитов на количество байт в юните.
так же тут полезен OID
1.3.6.1.2.1.25.2.3.1.3.(1,2,3...) hrStorageDescr
как источник описания типа хранилища

Полезные ссылки:

http://live.daemony.org/doc/rrd

http://silverwraith.com/papers/freebsd-snmp.php

http://bozza.ru/art-105.html

http://oss.oetiker.ch/rrdtool/tut/rrd-beginners.en.html

http://www.ibm.com/developerworks/ru/edu/au-webperfrrd/section4.html

http://onix.opennet.ru/content/view/19/26/1/5/

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>