понедельник, 10 декабря 2012 г.

[STAT] Collectd - Установка, настройка, использование.

Что это такое?

Collectd - это небольшой демон, который каждые 10 секунд собирает статистку об использовании ресурсов системы. Есть возможность сбора статистики для нескольких хостов и отсылка её на сервер, который занимается отрисовкой красивых графиков.
Основное отличие этого сборщика в том, что он работает по принципу push, а не poll/pull. Т.е. он "висит" и слушает, а сервера ему сами статистику присылают. :)

Что мы будем делать?

Что я хочу описать в этом посте:
  • Установка.
  • Настройка общая.
  • Настройка отдельных плагинов.
  • Настройка slave серверов, которые будут слать нам на главный сервер свою статистику работы.
  • Настройка нотификаций по email.
По поводу последнего пункта -- это будет только то, что мне подходит и интересно, все представленные интерфейсы я рассматривать не буду.

Установка

Ставим его как обычно через любимый пакетный установщик emerge/yum/apt-get или чо-там-еще-существует.

Для debian.  В стандартных портах collectd нет, для этого нам надо подключить backports.
Делается это достаточно просто:
Добавляем строчку
deb http://backports.debian.org/debian-backports squeeze-backports main
в ваш sources.list (либо создадим новый файл с этой строчкой в /etc/apt/sources.list.d/)
После чего запустим apt-get update

Далее, чтобы установить пакет из backports пишем команду
apt-get -t squeeze-backports install "package"
ну или через aptitude
aptitude -t squeeze-backports install "package"

В нашем случае это будет выглядеть как

apt-get -t squeeze-backports install "collectd"

В генте есть маленький нюанс. Во первых оно замаскировано ~x86, во вторых поумолчанию ставятся только несколько плагинов. Чтобы указать какие плагины ставить надо их указать либо в package.use (типа collectd_plugin_memory) либо в make.conf в переменной COLLECTD_PLUGINS="";
У меня установлены вот такие:

COLLECTD_PLUGINS="apache cpu df disk interface load memory network ntpd processes notify_email ping logfile syslog rrdtool swap hddtemp exec filecount java sensors target_notification target_set target_replace"

Будте внимательны, в зависимости от плагинов оно может за собой много чего потянуть ;), так что выбирайте то, что надо.

Для Centos 6 надо добавить RPMForge репу:
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
После этого надо включить rpm-forge-testing, чтобы получить версию 5.1.0 в /etc/yum.repos.d/rpmforge.repo

Установившиеся версии: на gentoo - 5.1.1, на debian, после некоторых танцев с бубном, - 4.1.1 (но его придется вручную обновить до 5.х, почему -- читаем ниже), на centos6 - 5.1.0. 

 JFYI  Почему необходимо обновиться: потому что вывод данных в rrd в этих версиях отличается, следовательно либо писать костыль для конвертации либо писать 2 скрипта для генерации графиков на фронт-енд морде. Да и изза изменения графиков придется учитывать версию клиента на хосте и под нее отдельно писать правила для нотификаций.

В дебиане и центосе у меня поставились все плагины. Ну потому что из готового пакета ставится :)

Настройка

Едем дальше. Формат конфига мне вообще не понравился, долго искать где что, поэтому для себя я его порезал на нужные мне части, благо что из конфига можно подключать другие конфиги, как говорится, inline :)
Опять же в генте весь конфиг в одном файле, который находится в /etc/collectd.conf. В дебиане оно ставится в красивый путь /etc/collectd/collectd.conf, так же отдельные части конфигурации типа filters и thresholds вынесены в отдельные файлы, что не может не радовать. Вообщем я у себя на генте сделал примерно такую же конфигурацию, немножко ее изменив. В частности подключение нужных мне плагинов вынес в отдельную директорию и каждый плагин (точнее его конфигурацию) так же в отдельный файл. Вот как он стал выглядеть:

# Config file for collectd(1).
#
# Some plugins need additional configuration and are disabled by default.
# Please read collectd.conf(5) for details.
#
# You should also read /usr/share/doc/collectd-core/README.Debian.plugins
# before enabling any more plugins.

Hostname "gen-collectd-master.local"
FQDNLookup true
BaseDir "/data/collectd"
#PluginDir "/usr/lib/collectd"
#TypesDB "/usr/share/collectd/types.db" "/etc/collectd/my_types.db"
#Interval 10
#Timeout 2
#ReadThreads 5

LoadPlugin logfile
LoadPlugin syslog

<Plugin logfile>
        LogLevel "info"
        File "/data/collectd/collectd.log"
        Timestamp true
        PrintSeverity true
</Plugin>

<Plugin syslog>
        LogLevel info
</Plugin>

LoadPlugin network
<Plugin network>
    Listen "192.168.56.130" "8085"
</Plugin>

Include "/etc/collectd/inst/*.active"
Include "/etc/collectd/conf/*.conf"

Include "/etc/collectd/filters.conf"
Include "/etc/collectd/thresholds.conf"
 
Это основной файл конфигурации, если вы сравните его с файлом поумолчанию, то заметите что в мое файле нет всех плагинов, только те, которые я считаю основной конфигурацией. Остальные файлы подключаются из директорий inst и conf. 

 JFYI  Так же обратите внимание на параметр FQDNLookup true - если у вас в hostname чтото прописано, то оно должно ресолвиться! В противном случае оно вылетит с ошибкой, другое решение - выставить этот параметр в false.

В каталоге inst находятся файлы конфигурации плагинов:
gen-collectd-master collectd # ls -la /etc/collectd/inst/
total 32
drwxr-xr-x 2 root root 4096 Nov 26 20:57 .
drwxr-xr-x 4 root root 4096 Nov 26 21:00 ..
-rw-r--r-- 1 root root   15 Nov 26 13:54 cpu.active
-rw-r--r-- 1 root root  125 Nov 26 13:54 if.active
-rw-r--r-- 1 root root   16 Nov 26 13:54 load.active
-rw-r--r-- 1 root root   18 Nov 26 13:54 memory.active
-rw-r--r-- 1 root root  122 Nov 26 18:25 mounts.active
-rw-r--r-- 1 root root  133 Nov 26 20:57 ping-hosts.active

как видно я подключаю только файлы с "расширением" active 

 JFYI  Все параметры плагинов можно найти на странице документации collectd.conf 

Далее, в каталоге conf содержится 2 файла, один для настройки плагина notify_email, второй для настройки rrdtool
gen-collectd-master collectd # ls -la /etc/collectd/conf/
total 16
drwxr-xr-x 2 root root 4096 Nov 26 20:30 .
drwxr-xr-x 4 root root 4096 Nov 26 21:00 ..
-rw-r--r-- 1 root root  425 Nov 26 20:30 mail.conf
-rw-r--r-- 1 root root   83 Nov 26 13:54 rrdtool.conf
Вообще их можно вернуть спокойно в collectd.conf, но почемуто на тот момент мне захотелось сделать именно так :)

Содержимое файла conf/rrdtool.conf
LoadPlugin rrdtool
<Plugin rrdtool>
        DataDir "/data/collectd/rrd"
</Plugin>
Как видно тут я заргужаю плагин и задаю ему параметры.

Содержимое файла conf/mail.conf
LoadPlugin notify_email
<Plugin notify_email>
        SMTPServer "stmp.mail.ru"
        SMTPPort 25
        SMTPUser "collectd@mail.ru"
        SMTPPassword "my-super-password-for-mail"
        From "collectd@mail.ru"
#       # <WARNING/FAILURE/OK> on <hostname>.
#       # Beware! Do not use not more than two placeholders (%)!
        Subject "[collectd] %s on %s!"
        Recipient "recipient@mail.ru"
</Plugin> 

Этот плагин нам понадобится когда мы будем настраивать нотификации.

 JFYI  можно написать свой обработчик нотификаций. Для этого нужно подлючить плагин exec и прописать скрипт, который будет запускаться при генерации нотификации. Делается это так:

LoadPlugin exec
<Plugin exec>
    NotificationExec    thunder "/home/thunder/ttest.sh" "test1"
</Plugin>
Общая спецификация этой команды выглядит так:
NotificationExec <пользователь> "<команда-для-запуска>" ["параметр1"] ["параметр2"] и т.д.

В скрипте у меня написано следующее

#!/bin/bash

cat >> /home/thunder/ttest.log
В логе при нотификации будет создаваться что-то вроде

Severity: WARNING
Time: 1354181979.770
Host: jen-master-local
Plugin: cpu
PluginInstance: 0
Type: cpu
TypeInstance: user
DataSource: value
CurrentValue: 9.989738e+01
WarningMin: nan
WarningMax: 8.500000e+01
FailureMin: nan
FailureMax: nan

Host jen-master-local, plugin cpu (instance 0) type cpu (instance user): Data source "value" is currently 99.897375. That is above the warning threshold of 85.000000.
Как мы видим все данные у нас тут есть, распарсить это не составит труда и написать свой нотификатор так же не составит труда ;)

Вернемся к основному файлу collectd.conf
Про syslog/logfile объяснять не буду, тут итак все понятно, hostname тоже.
Плагин network - конкретнее про плагин можно почитать тут, в частности там можно задать авторизацию. У себя я не буду это рассматривать пока, как правильно делать это решит каждый для себя сам :)
Этот плагин служит для взаимодействия между серверами collectd.
Чтобы настроить текущий сервер как сервер для сбора статистики, необходимо задать ему параметр Listen "192.168.56.130" "8085", где 192.168.56.130 - ip адрес, на котором будет висеть демон и слушать входящие данные от других серверов. 8085 - порт, на котором он будет висеть.
Чтобы настроить клиента, надо вместо Listen указать Server "192.168.56.130" "8085", соответственно 192.168.56.130 - ip адрес, куда отаправлять данные. 8085 - порт, на который отправлять данные.


 JFYI  Порт можно не указывать, по умолчанию будет использован порт 25826, так же следует помнить, что работать будет по UDP протоколу, так что имейте ввиду, если у вас гдето используется firewall. 

Настройка плагинов и там и там не отличается.

Все, что у вас настроено для мониторинга на "Клиенте" будет отправлять на "Сервер".

Нотифткации по почте

Перейдем к самому вкусному. Единственные примеры настройки нотификации некоторых плагинов есть только в конфиге thresholds.conf.

Основная загрузка плагина и примерчик:
LoadPlugin "threshold"
 <Plugin "threshold">
   <Type "foo">
     WarningMin    0.00
     WarningMax 1000.00
     FailureMin    0.00
     FailureMax 1200.00
     Invert false
     Instance "bar"
   </Type>
 </Plugin>
Краткое пояснение как это работает. Threshold это обычный плагин, поэтому он и загружается как плагин. Все параметры задаются внутри контейнера <Plugin "threshold">. Внутри него может быть заданы контейнеры в следующей последовательности - "Host", "Plugin", "Type". Т.е. внутри контейнера Host может быть контейнер Plugin, внутри которого может быть контейнер Type. Блок Host необязателен, с помощью него можно привязать нотификации для определенного хоста. Также, все значения должны быть заданы только внутри блока Type, единственное значение, которое может быть задано вне блока Type это Instance.
Если несколько блоков применены на одно значение, то будет использован самый точный из блоков. Т.о. можно задать какойто стандартный блок для плагина, а потом, к примеру, для определенного хоста переопределить его с другими параметрами. Итак, приступим непосредственно к конфигурации нотификаций.

Плагин cpu

<Type "cpu">
     Instance "user"
     WarningMax 85
     Hits 1
</Type>
Тут можно не писать перед блоком Type блок Plugin. Мы указываем, что нужно следить за значением user (пользовательские процессы) и если оно достигнет значения 85, то выслать предупреждение. Hits - количество попаданий в это значение за один Interval (см настройку основного конфига),  в нашем случае равно 1, т.е. если в течение 10 секунд значение будет >= 85, то будет сгенерирована нотификация. Тут можно поставить значение больше, например на 6, т.е.если в течение одной минуты значение будет такое, то тогда есть о чем беспокоиться.

Плагин ping

<Plugin "ping">
    <Type "ping_droprate">
        FailureMax 0.9
    </Type>
</Plugin>
Как тут видно мы задаем для плагина ping тип, равный ping_droprate. Эта таблица содержит значение либо 0 либо 1. Соответственно задаем генерацию типа Failure если значение превысит 0.9. Если задать 1, то не будет работать :)

Плагин memory

<Plugin "memory">
    <Type "memory">
        Instance "free"
        WarningMin 25000000
    </Type>
</Plugin>
Выбираем instance free, поскольку мы следим за свободной паматью, тут чем меньше значение free тем хуже, мы выставляем WarningMin. Если значение достигнет или станет меньше указанного значения, то будет сгенерирована нотификация.

Теперь самое интересное, этого нет в документации и пример найти тяжело оказалось, поэтому пришлось экспериментировать.
Делаем нотификации на место на диске ;)

 Плагин df

<Plugin "df">
    Instance "root"
    <Type "df_complex-used">
#       DataSource "value"
        WarningMax 4025360000
        FailureMax 6025360000
        Percentage false
    </Type>
</Plugin>

Итак, в версии 5.х поменялась логика создания таблиц для плагина df, поэтому обращение к таблицам стало подругому.
Instance - указываем к графику для какого раздела обращаться
Type - df_complex-used - df_complex всегда и обязательно, после тире в нашем случае задается поиск данных по использованному месту.
Теперь DataSource можно не указывать, так как таблица имеет только одно поле value.
WarningMax/FailureMax - к сожалению по непонятной причине для этого плагина невозможно использовать процентные данные, поэтому для каждого хоста придется этот плагин забивать конкретными значениями. Так же ниже мы четко указываем, что не использовать процентные значения. Вопрос про это появился еще в 2011 году и в версии 4.9.1, но ответа на него нет до сих пор.

Пожелания, предложения, вопросы приветствуются. Отвечу по возможности.