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"

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

Установившиеся версии: на 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, но ответа на него нет до сих пор.

Вот, собственно, и все, основные плагины настроены, нотификации на них тоже.

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

Share post

Similar posts

Comments 30

    0
    Скажите пожалуйста, этот collectd что то типа cacti + net-snmp, только более гибкий?
      0
      что то вроде, но collectd — это демон, который просто собирает статистику и сохраняет ее в rrd файлы. кто или что их будет рисовать это уже другой разговор… использовал кактус, но этот демон более простой. в данном случае статистику для графиков я имею и так же я могу настроить нотификации. кактус более грузный в этом смысле. для collectd в комплекте есть около 90 плагинов, написание своих не составит труда, там есть доп плагины для явы, перла, которые позволяют написать свои плагины на этих языках, так же можно «писать» плагины на любом языке, главное соблюдать формат приема. Более того, в документации описано как можно взаимодействовать с любыми сервисами, в том числе и с нагиосом и кактусом. Данная статья не преследовала этих целей, но можно написать её.
      • UFO just landed and posted this here
          +1
          Zabbix не пользовался, поэтому не смогу сказать.

          Насчет munin и collectd. Я в посте писал, что они используют разные методы получения данных: collectd использует push — это значит, что сервер не посылает никаких запросов к серверам-клиентам, клиенты сами на сервер заливают информацию. К примеру это может быть полезно для мониторинга серверов, которые находятся за фаерволлом и сливать инфу на какойто внешний сервер. для этоого не надо клиент высовывать наружу, достаточно отфорвардить запрос. в любом случае это будет исходящий запрос. Удобно мониторить домашние сервера, потому что исходящие запросы у них будут. а мунин (как и заббикс, кактус, нагиос и т.п.) сам опрашивает сервера, значит сервер должен быть доступен для входящих совединений.

          ну и не маловажный факт в отношении мунина — он не имеет демона и запускается кроном, а это значит, что он постоянно запускает свой код, что будет давать ненужную нагрузку на систему. к тому же написан нна перле, следовательно какието пакеты придется доставить для этого. Collectd имеет демона, написан на С.
          Генерация графиков и страниц у мунина опять же по крону каждые 5 минут, ну и чем больше будет хостов тем выше будет нагрузка на сервер. Collectd ничего этого не делает, гафики он сам визуализировать не умеет. этим должны другие программы заниматься.
          • UFO just landed and posted this here
      0
      Что произойдет если начнется дрожание CPU то 84%, то 85%? Спам на почту?
        0
        нет если указать параметр Hits, он как раз предназначен для таких ситуаций.
          0
          А что произойдет если таки после Hits проц упрется в 100%?
            0
            тогда придет одно сообщение, спама не будет. как только оно упадет ниже указанного значения, то придет соответствующее сообщение… постоянно отсылаемых сообщений не будет.
              0
              Так вроде после hits уведомлений уже не приходит если я правильно понял?
                0
                да, только при попадании в другое «условие»
        0
        это для рисования графиков?
        как там с написанием собственных проверок?
        В нагиосе плагин — просто скрипт с кодом возврата, а тут как?

        и зачем собственно раз в 10 секунд мучать сервер — для какой задачи?
          0
          Мастер сервер не мучается, это раз, нагиос как раз мастер сервер будет грузить сильнее, но опять же это будет видно на большом количестве хостов.
            0
            для нагиоса есть пассивные проверки и NSCA для решения аналогичной задачи.
          +1
          Вот бы еще был для него нормальный веб. :(
            0
            Collectd-web и Colletd Graph Panel, а так все остальные на сайте collectd

            пользуюсь (точнее выбираю) первыми двумя… Есть еще Jarmon, для него вообще нужен только вебсервер, но поскольку это только библиотека, то САМ фронтенд нужно дописывать.

            Либо использовать плагины для коммуникации с другими системами мониторинга, например, cacti или nagios/icinga
              0
              collectd-web — единственный относительно вменяемый. Остальные на вебе у них страшны.

              cgp последняя версия от 2010 года, т.е. не живая и не развивающаяся. :-(
                0
                CGP на данный момент обновился, но, как я понял, это форк…
                  0
                  о, а где?
                    0
                    ну какбэ с гита автора форка… последнее обновление 19.10.2012
            0
            del
              0
              collectd хорошо использовать в комплекте с observium
                0
                спасибо, посмотрю.
                  0
                  да и observium сам по себе хорош даже без collectd ;)
                    0
                    да, понравилось описание… сколько кушает?
                      0
                      Смотря чего именно, там где сам observium крутиться загрузка минимальная в отличии от cacti лучше маштабируеться когда нужно очень много устройств polling делать. У меня крутился на машине P3-800 с 768 мегабайтами памяти, там в основном не хватало проца уже когда графики рисовались была задержка до 2 сек.
                        0
                        графики налету рисуются или кроном/демоном?
                          0
                          Динамика, да, там даже есть real-time графики
                      0
                      какие люди… не ты ли shopik с #observium? :)
                        0
                        Привет Lex, он самый

                  Only users with full accounts can post comments. Log in, please.