Netdata, graphite и grafana

 

В этой заметке я хочу рассмотреть установку и базовую настройку системы мониторинга в режиме реального времени Netdata и сбор данных, а также их последующую визуализацию с помощью graphite и grafana.

Для начала определим узлы для мониторинга:

схема мониторинга


Итак у нас есть три узла - Rigel, Andromeda, Proxima. Снимать статистику будем с каждого из них, но хранение будет реализовано на Rigel.

В первую очередь организуем связь между узлами. Подразумевается, что все три узла находятся в сети и имеют внешний IP-адрес:
Rigel - 1.1.1.1;
Andromeda - 2.2.2.2;
Proxima - 3.3.3.3;
Следующим этапом создаем два IPIP туннеля - Rigel-Andromeda и Rigel-Proxima
Для чего добавляем в  /etc/network/interfaces следующее содержимое:
для Rigel:
auto tunnel0
iface tunnel0 inet static
  address 10.0.0.1
  netmask 255.255.255.252
  pre-up /sbin/ip tunnel add tunnel0 mode ipip remote 2.2.2.2 local 1.1.1.1
  post-down /sbin/ip tunnel del tunnel0

auto tunnel1
iface tunnel1 inet static
  address 10.0.1.1
  netmask 255.255.255.252
  pre-up /sbin/ip tunnel add tunnel1 mode ipip remote 2.2.2.2 local 1.1.1.1
  post-down /sbin/ip tunnel del tunnel1

Для Andromeda:
auto tunnel0
iface tunnel0 inet static
  address 10.0.0.2
  netmask 255.255.255.252
  pre-up /sbin/ip tunnel add tunnel0 mode ipip remote 1.1.1.1 local 2.2.2.2
  post-down /sbin/ip tunnel del tunnel0

И для Proxima:
auto tunnel0
iface tunnel0 inet static
  address 10.0.1.2
  netmask 255.255.255.252
  pre-up /sbin/ip tunnel add tunnel0 mode ipip remote 1.1.1.1 local 3.3.3.3
  post-down /sbin/ip tunnel del tunnel0

И проверяем пингуем с Andromeda и Proxima 10.0.0.1 и 10.0.1.1 соответственно.

Если на предыдущем этапе не возникло проблем устанавливаем netdata:
Устанавливаем зависимости:

# apt-get install zlib1g-dev uuid-dev libmnl-dev gcc make git autoconf autoconf-archive autogen automake pkg-config curl

 

Скачиваем и устанавливаем netdata:

cd /usr/src
git clone https://github.com/firehol/netdata.git --depth=1
cd netdata
./netdata-installer.sh

 

И стартуем:

service netdata start

проверяем:

lsof -i:19999

Должны увидеть что-то подобное:
netdata 18669 netdata    3u  IPv4 3489782059      0t0  TCP *:19999 (LISTEN)
Теперь при открытии в браузере IP-адрес:19999 мы попадем в наш netdata

 

По умолчанию сервис слушает все сетевые интерфейсы, что бы исправить это откроем /etc/netdata/netdata.conf и в секции [global] приведем строку
# bind to = *
к виду
- Для Rigel:
  bind to = 127.0.0.1
- Для Andromeda:
  bind to = 10.0.0.2
- Для Proxima:
  bind to = 10.0.1.2
Тем самым мы исключили возможность доступа к netdata извне.  И организуем доступ с авторизацией:

Считаем, что nginx у нас уже установлен, если нет - apt-get install nginx. Далее создаем в /etc/nginx/sites-available файл конфигурации netdata :
upstream backend-server1 {
   server 127.0.0.1:19999;
   keepalive 64;
}
upstream backend-server2 {
   server 10.0.0.2:19999;
   keepalive 64;
}
upstream backend-server3 {
   server 10.0.1.2:19999;
   keepalive 64;
}

server {
   listen 1.1.1.1:443;
   listen 1.1.1.1:80;
   server_name netdata.rigel;
      ssl on;
      ssl_certificate /etc/letsencrypt/live/netdata.rigel/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/netdata.rigel/privkey.pem;
      ssl_session_timeout 5m;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
      ssl_prefer_server_ciphers on;
      if ($scheme = http) {
           return 301 https://$server_name$request_uri;
       }
   location / {
       root /var/www/netdata-ssl;
   }
   location ~ /(?<behost>.*)/(?<ndpath>.*) {
       auth_basic "Protected netdata";
       auth_basic_user_file passwords;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_http_version 1.1;
       proxy_pass_request_headers on;
       proxy_set_header Connection "keep-alive";
       proxy_store off;
       proxy_pass http://backend-$behost/$ndpath$is_args$args;
       gzip on;
       gzip_proxied any;
       gzip_types *;
   }
location ~ /(?<behost>.*) {
       return 301 /$behost/;
   }
}

Как создать сертификат Let’s Encrypt я описывать не буду, на эту тему достаточно руководств.
Создаем файл авторизации - 

#htpasswd -bc /etc/nginx/passwords admin password   

где логин - admin, пароль - password
Теперь включаем наш конфигурационный файл - 

# ngx-conf -e netdata

и проверяем конфигурацию 

# service nginx configtest

и если все в порядке рестартуем nginx

# service nginx restart

Теперь мы можем попасть в веб-интерфейс netdata на наших серверах по адресам:
https://netdata.rigel/server1/   - Rigel
https://netdata.rigel/server2/   - Andromeda
https://netdata.rigel/server3/   - Proxima 
Если все выполнено верно мы увидим что-то похожее:
 

 

netdata

Этап с рилтайм мониторингом закончили, пора переходить к хранению и визуализации данных.

    Netdata позволяет использовать в качестве бэкэнда для хранения данных graphite и opentsdb. Я остановился на варианте с graphite. 
Устанавливаем graphite

# apt-get install graphite-web graphite-carbon

по умолчанию используется sqlite, т.к. объем данных у нас небольшой я не стал использовать ни postgresql, ни mysql. Но стоит помнить что есть возможность их использовать.
Далее редактируем  в /etc/graphite/local_settings.py  строки
SECRET_KEY = 'Uequ8aitahNgi7reesohth8'
и
TIME_ZONE = 'Europe/Kiev'
и выполняем

# graphite-manage syncdb
В новых версиях необходимо выполнить
# graphite-manage migrate

Следует проверить права доступа к graphite.db

# ls -la /var/lib/graphite/graphite.db

Возможно понадобится изменить владельца, если "graphite-manage syncdb" выполнялось с правами root

# chown _graphite:_graphite /var/lib/graphite/graphite.db

 

Настраиваем Carbon.
В первую очередь исправляем в /etc/default/graphite-carbon "CARBON_CACHE_ENABLED=false" на "CARBON_CACHE_ENABLED=true"
После включаем ротацию лог-файлов в /etc/carbon/carbon.conf :
ENABLE_LOGROTATION = True
Далее копируем файл конфигурации агрегации в рабочую директорию:

# cp /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example /etc/carbon/storage-aggregation.conf

По умолчанию данные хранятся за 24 часа. Что бы изменить интервал, следует это исправить в /etc/carbon/storage-schemas.conf 

Мы создали минимальную рабочую конфигурацию. Можно стартовать Carbon:

# service carbon-cache start

 

Настраиваем веб-интерфейс.
Устанавливаем uwsgi uwsgi-plugin-python

# apt-get install uwsgi uwsgi-plugin-python

И создаем файл /etc/uwsgi/apps-enabled/grafite.ini
[uwsgi]
processes = 2
socket = 127.0.0.1:3031
gid = _graphite
uid = _graphite
после чего рестартуем uwsgi:
# service uwsgi restart
Переходим к настройке nginx. Создаем файл конфигурации /etc/nginx/sites-available/graphite 
server {
          #listen 127.0.0.1:8081; После проверки раскоментируем эту строку
          listen 1.1.1.1:8081; # и удалим эту
          root /usr/share/graphite-web/;
          error_log  /var/log/nginx/error.log;
          location / { 
               uwsgi_pass  127.0.0.1:3031; 
               include uwsgi_params; 
          }
}      
#ngx-conf -e graphite
#service nginx configtest
#service nginx reload
Если все в порядке при обращении на порт 8081 мы увидим:
 

 

graphite-web

Теперь настраиваем graphite в качестве бэкэнда для netdata. Для чего раскоментируем и приводим в /etc/netdata/netdata.conf на всех узлах раздел [backend] к следующему виду:
[backend]
        enabled = yes
        data source = average
        type = graphite
        destination = 127.0.0.1
                            #(10.0.0.1 - для Andromeda, 10.0.1.1 - для Proxima)
        prefix = netdata
        hostname = rigel
                            #(anromeda, proxima соответственно)
        update every = 10
        buffer on failures = 10
        timeout ms = 20000

и рестартуем netdata на каждом узле:

#service netdata restart

 

 

Последний этап - это установка и настройка grafana.
Сперва надо скачать deb-пакет, для чего переходим на http://grafana.org/download/ и скачиваем последнюю версию. На момент написания статьи это была:

#wget https://grafanarel.s3.amazonaws.com/builds/grafana_4.0.2-1481203731_amd64.deb

и устанавливаем:

#dpkg -i grafana_4.0.2-1481203731_amd64.deb

Но лучше добавить в /etc/apt/sources.list :
deb https://packagecloud.io/grafana/stable/debian/ jessie main
и ключ -

# curl https://packagecloud.io/gpg.key | sudo apt-key add -

тогда установка сводится к 

# sudo apt-get update
# sudo apt-get install grafana


Файл конфигурации grafana.ini находится в /etc/grafana  
Находим в нем строку ";http_addr =" и приводим ее к виду "http_addr = 127.0.0.1"
Также отключим авторизацию, за авторизацию у нас будет отвечать nginx:
[auth.basic]
enabled = false
[auth.anonymous]
# enable anonymous access 
enabled = true
org_role = Admin

Создаем файл конфигурации для nginx grafana:
server {
          listen 1.1.1.1:80;
          #listen 127.0.0.1:8081;
          server_name grafana.rigel;
          root /usr/share/graphite-web/;
          error_log  /var/log/nginx/error.log;

    location / {
       auth_basic "Protected netdata";
       auth_basic_user_file passwords;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Forwarded-Server $host;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_http_version 1.1;
       proxy_pass_request_headers on;
       proxy_set_header Connection "keep-alive";
       proxy_store off;
       proxy_pass http://127.0.0.1:3000;
       gzip on;
       gzip_proxied any;
       gzip_types *;

  }
}

включаем и перегружаем конфигурацию nginx.  Также стартуем сам grafana:

#service grafana-server start

Проверяем:

#lsof -i:3000
COMMAND     PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
grafana-s 15719 grafana    7u  IPv4 508684216      0t0  TCP localhost:3000 (LISTEN)

Если все в порядке можем открыть наш grafana с логином-паролем таким же как и у netdata:

 

grafana

Далее добавляем источник данных:

Data source

Data source

Со следующими параметрами:
 

Data source

Создаем новую панель:
 

Create New dashboard

Выбираем Graph , далее редактируем свойства графика:
 

Graph

Выбираем источники для графика:
 

Graph

отдельно хочется отметить функции для работы с данными, например alias позволяет изменить подпись для графика:
 

alias

В итоге у нас получится что-то похожее на:
 

grafana

Как Netdata, так и grafana поддерживают оповещения. В Netdata с помощью браузера, почты, Pushbullet.com push уведомления, Slack.com, pushover.net push, Telegram. Grafana c помощью почты, slack, Webhook, PagerDuty, в версию для разработчиков был добавлен telegram.  Я для уведомлений использую netdata и telegram.

Настройка оповещений в Netdata.
Включить отправку оповещений совсем не трудно. Для этого открываем health_alarm_notify.conf ищем свой метод уведомлений и заполняем данные. Настроим уведомления для Telegram:
1. Отправляем контакту @BotFather команду /newbot . Далее следуя инструкциям выбираем боту имя. Если все прошло успешно мы получим "token to access the HTTP API" Прописываем эти данные в наш конфигурационный файл.
2. Определяем кому отправляем сообщения. Контакту @myidbot  отправляем команду /getid и полученные данные прописываем в DEFAULT_RECIPIENT_TELEGRAM. Если получателей несколько они указываются через пробел. Но удобнее, как мне кажется, отправлять уведомления в групповой чат. Для этого создаем чат, далее нам необходимо получить id чата . Добавляем бота в группу,  и отправляем сообщение в группу, боту.  После посматриваем https://api.telegram.org/bot<ID нашего бота>/getUpdates  Нас интересует id чата, он всегда со знаком "-"

Настройка оповещений в Grafana
   Оповещения с помощью Telegram в grafana реализованы лишь в разрабатываемой ветке 4.2, но имеется множество других методов - Email, Slack, Webhook, Pagerduty, VictorOps, OpsGenie.
   Но если вам все же необходим телеграм и вы не хотите использовать ветку 4.2. Можно использовать переадресацию в telegram с помощью почты. 
- создаем alias почтового ящика:
    /etc/aliases:
     telegram: "|/path_to_scripts/telegram.sh"
    ​​​​​​ выполняем newaliases и релоад почтового сервера
- создаем сам скрипт и размещаем его по адресу указанным в псевдониме:

#!/bin/bash
BOT_TOKEN="Токен вашего бота"
CHAT_ID="-ID-чата"
URL='https://api.telegram.org/bot'${BOT_TOKEN} 
MSG_URL=$URL'/sendMessage?chat_id='
send_message (){
 curl --data-urlencode "text=$2" "${MSG_URL}$1&"                                                                   }
content=$(echo -e  "$(cat $1|grep  "Subject"|awk -F: {'print $2'})") 
send_message ${CHAT_ID} "${content[@]}" 

И указываем в настройках оповещений метод Email и почтовые адреса telegram@localhost; ваш@email
В этом случае в телеграм будет приходить тема сообщения, а на ваш почтовый адрес уже ​​​​полное сообщение.
Естественно, что localhost используется только в том случае, если grafana и почтовый сервер находятся на одном узле.


Как всегда - это не окончательный вариант заметки.

P.S. В последних версиях grafana работает с telegram "из коробки"