Візуальний моніторинг серверної інфраструктури на базі Nagios + Grafana

nagios + grafana

Ми Атласі любимо, коли все знаходиться під контролем. Це стосується і всієї серверної інфраструктури, яка, з роками перетворилася в живий організм з численних віртуальних машин, сервісів і служб. З'явилася потреба спостерігати за життєво важливими аспектами IT-складовою нашої діяльності: моніторити бойової сервер, відстежувати зміни системних ресурсів на виртуалках баз даних, стежити за ходом бізнес-процесів і тд. Постало питання — як же цього досягти і головне якими інструментами? Почали шукати якісь готові рішення. Перепробували купу платних/безкоштовних сервісів, які нібито надавали б нам "найціннішу" інформацію про стан нашої системи. Але, в кінцевому підсумку, все зводилось до якихось незрозумілих діаграм, схем і цифр, які, по суті, для нас не мали ніякої цінності.
Так ми прийшли до розуміння, що треба збирати щось самостійно. За основу вирішили взяти саму гнучку і просунуту систему, яку можна налаштувати для моніторингу чого і як завгодно — Nagios. Налаштували, поставили, працює — круто! Шкода тільки інтерфейс цього дива застряг десь в середині 90-х, а нам хотілося, щоб ще й візуальна складова була на рівні.
Недовгий пошук показав, що лідером серед рішень по створенню гарних дашбордов є Grafana. Так і вирішили виводити весь наш моніторинг з Nagios на моніторах у вигляді красивих графіків в Grafana. Питання залишилося тільки в тому — як їх подружити один з одним?
Загальна мета
Контролювати всю інфраструктуру через Nagios, налаштувати сповіщення про проблеми в системі через Slack, підключити висновок даних про продуктивності системи в графічну оболонку Grafana для моніторингу в реальному часі.
image

Стек технологій
  • Nagios — центральний вузол системи моніторингу
  • NRPE — набір плагінів, передавальних Nagios інформацію про хостах/сервісах
  • Graphios — плагін Nagios для збору даних про продуктивність системи, необхідних для постоения графіків
  • Carbon — back-end прошарок для зберігання даних про проиводительности системи в базі даних
  • Graphite — модуль обробки стат. даних і побудови графіків
  • Grafana — графічна оболонка, що працює з даними з Graphite для побудови красивих дашбордов з графіками в реальному часі
  • Slack Nagios App — модуль для запуску сповіщень Nagios через Slack
Короткий опис
Nagios збирає статистичні дані зі всіляких виртуалок всієї системи. Нам ці дані потрібно зберігати в базу в певному форматі та з певним інтервалом, щоб Grafana змогла їх виводити. Grafana працює з декількома форматами, але найзручніший для нас — Graphite. Graphite — по суті, така ж графічна оболонка, але його інтерфейс, мабуть, робили ті ж люди, що і інтерфейс Nagios. Під капотом у нього лежить база даних, яка зберігає стат. дані — Whisper і прошарок для обробки цих даних Carbon. Безпосередньо Nagios не вміє спілкуватися з Graphite-ом, тому розумні люди створили дод. плагін, який бере поточні показання з Nagios і передає їх у Carbon — цей плагін називається Graphios. Таким чином, наше завдання — зв'язати воєдино 6 різних технологій. Поїхали!
Відразу невеликий дисклеймер:
  1. Поточна конфігурація збиралася під Debian, але загальна логіка складання однакова під все сімейство.
  2. У даній статті я не буду розповідати про установці і налаштуванні самого Nagios-а, так як в мережі повно мануалів (про те, як якісно налаштувати Nagios — напишу окремо). Мова піде саме про зв'язці серії технологій між собою — ніякої лірики, чистий кардкор.
Carbon
Ставимо і налаштовуємо Carbon:
apt-get install graphite-carbon
sudo nano /etc/default/graphite-carbon

Проставляємо значення параметра в true:
CARBON_CACHE_ENABLED=true

Зберігаємо, виходимо.
Редагуємо файл схем
sudo nano /etc/carbon/storage-schemas.conf

У цьому файлі представлені директиви, в яких вказані параметри зберігання стат. даних: як часто зберігаються і як довго зберігаються. Для себе ми використовуємо приблизно наступну директиву:
[atlas]
pattern = .*
retentions = 60s:1y

Це означає, що дані будуть надходити в базу кожну хвилину і зберігатися протягом року. Поправте значення під свої потреби.
Також, важливо розуміти, що частота збереження даних у базі не повинна перевищувати частоту віддачі даних самим Nagios-му — інакше ми будемо складати в базу дублікати значень. З коробки Nagios прослуховує всі сервіси та хости раз в 10 хвилин, так що якщо хочеться досягти максимального real-time-а — потрібно також змінити інтервали обробки на стороні Nagios-а.
Підключаємо останній конфіг і стартуємо Carbon:
sudo cp /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example /etc/carbon/storage-aggregation.conf
sudo service carbon-cache start

Database
Готуємо базу для подальших програм. Ми воліємо PostgreSQL, але Graphite підтримує різні бази.
apt-get install postgresql libpq-dev python-psycopg2
sudo -u postgres psql

Налаштовуємо нового користувача і базу:
CREATE USER graphite WITH PASSWORD 'password';
CREATE DATABASE graphite WITH OWNER graphite;
\q

Пароль від БД потрібно зберегти — він нам ще знадобиться.
Graphios
Встановлюємо Python, Django і далі — сам graphios:
apt-get install -y python2.6 python-pip python-cairo python-django python-django-tagging
pip install graphios

Редагуємо файл /etc/graphios/graphios.cfg:
debug = False
enable_carbon = True

Створюємо папку для зберігання статистичних выгрузок:
mkdir /var/spool/nagios/graphios/
chown -R nagios:nagios /var/spool/nagios

Тестування:
Додаємо тестову рядок у визначення сервісу Nagios:
define service {
use generic-service
host_name DB
service_description PING
check_command check_ping!100.0,20%!500.0,60%
_graphiteprefix monitoring.nagios01.pingto
}

Викликаємо Graphios в тестовому режимі:
/usr/local/bin/graphios.py --spool-directory /var/spool/nagios/graphios --log-file /tmp/graphios.log --backend carbon --server 127.0.0.1:2004 --test

На виході повинні з'являтися записи типу:
monitoring.nagios01.pingto.DB.rta 0.248000 1461427743
monitoring.nagios01.pingto.DB.pl 0 1461427743

Якщо все в нормі — запускаємо демона graphios:
service graphios start

Graphite

Graphite потрібно ставити строго після установки Carbon, інакше Nagios/Graphios не зможуть правильно відправляти дані

Встановлюємо основні залежності
apt-get install -y libapache2-mod-wsgi python-twisted python-memcache python-pysqlite2 python-simplejson 
pip install whisper
pip install carbon
pip install graphite-web
pip install pytz
pip install pyparsing

wget https://raw.github.com/tmm1/graphite/master/examples/example-graphite-vhost.conf -O /etc/apache2/sites-available/graphite

Далі, треба трохи поправити новий конфіг Apache2:
nano /etc/apache2/sites-available/graphite

Міняємо "WSGISocketPrefix /etc/httpd/wsgi/" на:
WSGISocketPrefix /var/run/apache2/wsgi

Додаємо ще один псевдонім після рядка "Alias /content/ /opt/graphite/webapp/content/":
Alias /static/ "/opt/graphite/static/"

Зберігаємо, виходимо.
Налаштовуємо local_settings.py
cd /opt/graphite/webapp/graphite
cp local_settings.py.example local_settings.py
nano local_settings.py

У відкритому файлі включаємо рядки та проставляємо значення:
SECRET_KEY потрібно придумати, а значення для директиви DATABASE беремо з раніше створеної бази.
Значення WHISPER_DIR можна знайти через команду "locate whisper".
Значення директиви CARBONLINK_HOSTS потрібно проставити згідно з висновком команди "lsof -i -P | grep carbon".
SECRET_KEY = 'some_secret_key'
TIME_ZONE = 'Europe/Moscow'
WHISPER_DIR = '/var/lib/graphite/whisper'
USE_REMOTE_USER_AUTHENTICATION = True
DATABASES = {
'default': {
'NAME': 'graphite',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'graphite',
'PASSWORD': 'password',
'HOST': '127.0.0.1',
'PORT': "
}
}
CARBONLINK_HOSTS = ["127.0.0.1:2003","127.0.0.1:2004","127.0.0.1:7002"]

Налаштовуємо Graphite
У процесі конфігурації, система попросить завести супер-користувача. Потрібно проставити нові значення і запам'ятати їх.
cd /opt/graphite/conf/
cp graphite.wsgi.example graphite.wsgi
cd /opt/graphite/webapp/graphite
python manage.py syncdb
chown -R www-data:www-data /opt/graphite/storage/
a2enmod wsgi
a2ensite graphite
python manage.py collectstatic --pythonpath=/opt/graphite/webapp
chown -R www-data:www-data /opt/graphite/static
/etc/init.d/apache2 restart

Grafana
найпростіша частина — якщо Graphite/Carbon налаштовані правильно — досить підключити новий ресурс типу Graphite і налаштувати дашборд для виведення даних — Grafana сама зробить все інше!
wget https://grafanarel.s3.amazonaws.com/builds/grafana_3.0.0-beta51460725904_amd64.deb
sudo apt-get install -y adduser libfontconfig
sudo dpkg -i grafana_3.0.0-beta51460725904_amd64.deb
sudo service grafana-start server
sudo update-rc.d grafana-server defaults 95 10

Інтерфейс буде доступний 3000 порту. Дефолтні логін/пароль — admin.
Бонус: Slack Nagios App
Як альтернатива прямої візуалізації і пасивним листів — підключимо також висновок сповіщень з Nagios в Slack.
1) Створюємо новий канал в Slack, наприклад #alerts
2) Йдемо на сторінку додатків Slack-а
image
3) Знаходимо додаток Nagios
image
4) Слідуємо інструкціям по завантаженню конфига
wget https://raw.github.com/tinyspeck/services-examples/master/nagios.pl
cp nagios.pl /usr/local/bin/slack_nagios.pl
chmod 755 /usr/local/bin/slack_nagios.pl

5) Копіюємо токен і домен Slack і вставляємо їх у новий конфіг /usr/local/bin/slack_nagios.pl
image
6) Копіюємо директиви Nagios і вставляємо у відповідні місця (команди і новий контакт)
define contactgroup {
contactgroup_name admins
alias Nagios Administrators
members root,slack
}

define contact {
contact_name slack
alias Slack
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,r
service_notification_commands notify-service-by-slack
host_notification_commands notify-host-by-slack
}

define command {
command_name notify-service-by-slack
command_line /usr/local/bin/slack_nagios.pl -field slack_channel=#alerts -field HOSTALIAS="$HOSTADDRESS$" -field SERVICEDESC="$SERVICEDESC$" -field SERVICESTATE="$SERVICESTATE$" -field SERVICEOUTPUT="$SERVICEOUTPUT$ ($LONGDATETIME$)" -field NOTIFICATIONTYPE="$NOTIFICATIONTYPE$"
}
define command {
command_name notify-host-by-slack
command_line /usr/local/bin/slack_nagios.pl -field slack_channel=#alerts -field HOSTALIAS="$HOSTADDRESS$" -field HOSTSTATE="$HOSTSTATE$" -field HOSTOUTPUT="$HOSTOUTPUT$ ($LONGDATETIME$)" -field NOTIFICATIONTYPE="$NOTIFICATIONTYPE$"
}

7) Зберігаємо, перевантажуємо Nagios, перевіряємо.
Корисні матеріали:
» How To Configure StatsD to Collect Arbitrary Stats for Graphite on Ubuntu 14.04
» How To Install and Use Graphite on an Ubuntu 14.04 Server
» https://github.com/shawn-sterling/graphios
» http://grafana.org/features/#graphite
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.