Развёртывание и настройка Icinga 2 на Debian 8.6. Часть 12. Настройка интеграции Grafana в Icinga Web 2.4.1

В прошлый раз мы поговорили о развёртывании Graphite и настройки модуля интеграции с Icinga Web 2, что позволяет привнести возможности отображения графиков производительности непосредственно в веб-интерфейсе Icinga Web 2. Однако говоря о теме визуализации накопленных метрических данных, нельзя обойти вниманием такой интересный инструмент, как Grafana. В этой заметке мы рассмотрим простейший пример развёртывания фронтэнда Grafana на Debian Jessie (с подключением к данным Graphite) и посмотрим, какие у нас имеются на сегодняшний день возможности интеграции этой красоты с Icinga Web 2.

Инструкцию по установке Grafana всеми мыслимыми и немыслимыми методами можно найти по ссылке: Grafana Installation. Мы будем использовать метод установки deb-пакета из подключаемого репозитория packagecloud.io.

 

Установка и запуск Grafana

Для начала добавим менеджеру пакетов возможность работать с репозиториями по протоколу HTTPS, если это ещё не было сделано ранее:

# apt-get install apt-transport-https

Добавляем ключ репозитория packagecloud.io:

# curl -L https://packagecloud.io/grafana/stable/gpgkey | apt-key add -

Добавляем репозиторий Grafana для Debian Jessie:

# cat > /etc/apt/sources.list.d/grafana.list << EOF 

deb https://packagecloud.io/grafana/stable/debian/ jessie main
deb-src https://packagecloud.io/grafana/stable/debian/ jessie main

EOF

При желании создадим дополнительный конфигурационный файл apt, добавляющий в систему правила установки пакетов, чтобы из подключенного репозитория нам не "прилетело" ничего лишнего (при этом не стоит забывать про согласование этого файла с другими файлами в каталоге preferences.d, если они создавались ранее):

# cat > /etc/apt/preferences.d/99-debian-grafana.pref  << EOF

Package: grafana
Pin: origin "packagecloud.io"
Pin-Priority: 550

Package: *
Pin: origin "packagecloud.io"
Pin-Priority: -1

EOF

Обновляем кеш менеджера пакетов и смотрим, какой пакет Grafana нам доступен для установки

# apt-get update
# apt-cache show grafana

Package: grafana
Priority: extra
Section: default
Installed-Size: 131407
Maintainer: contact@grafana.com
Architecture: amd64
Version: 4.2.0
Depends: adduser, libfontconfig
Filename: pool/jessie/main/g/grafana/grafana_4.2.0_amd64.deb
Size: 45923642
...
SHA256: ab6dd9406fb6f7a807d220e1bdd9f472fad580c51fd84bcd732342dac08ad341
...
Description: Grafana
...
Homepage: https://grafana.com

Устанавливаем пакет grafana:

# apt-get install grafana

...
Setting up grafana (4.2.0) ...
Adding system user `grafana' (UID 112) ...
Adding new user `grafana' (UID 112) with group `grafana' ...
Not creating home directory `/usr/share/grafana'.
### NOT starting on installation, please execute the following statements to configure grafana to start automatically using systemd
 sudo /bin/systemctl daemon-reload
 sudo /bin/systemctl enable grafana-server
### You can start grafana-server by executing
 sudo /bin/systemctl start grafana-server
Processing triggers for systemd (215-17+deb8u6) ...

В процессе установки мы увидим предупреждения о том, что автозапуск службы нужно настроить самостоятельно. Проверяем статус службы после установки:

# service grafana-server status

● grafana-server.service - Grafana instance
   Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; disabled)
   Active: inactive (dead)
     Docs: http://docs.grafana.org

Как видим служба неактивна, хотя как Unit systemd присутствует. Настроим автоматический запуск службы и запустим её:

# systemctl enable grafana-server
# systemctl start grafana-server

По умолчанию служба запускает собственный HTTP-сервер на порту TCP 3000. Откроем доступ к серверу на данный порт в iptables, если требуется:

# iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3000 -m comment --comment "Grafana HTTP" -j ACCEPT

 

Первичная настройка Grafana

Если нужно изменить номер порта, или какие-то другие параметры работы Grafana, сделать это можно через основной конфигурационный файл /etc/grafana/grafana.ini. Файл имеет множество параметров, разделённых на секции и снабжённых комментариями, поэтому их настройка под свои нужны не должна вызвать затруднений. Чтобы изменить тот или иной параметр, достаточно просто раскоментировать его (убрать символ ; в начале строки) и задать нужно значение. В моём случае были изменены лишь некоторые параметры:

...
[server]
protocol = http
domain = kom-ad01-mon20.holding.com
enforce_domain = true
root_url = http://kom-ad01-mon20.holding.com:3000
...
[users]
allow_sign_up = false
default_theme = light
...
[auth.anonymous]
enabled = false
...
[auth.basic]
enabled = true
...

В частности здесь определено имя веб-сервера для подключения, выключена регистрация новых пользователей и анонимная аутентификация и включена поддержка Basic-аутентификации для ограничения доступа к веб-узлу Grafana.

После изменения конфигурации перезапустим службу:

# systemctl restart grafana-server

Откроем веб-браузер и перейдём на адрес фронтэнда, который мы ранее определили в параметре root_url в grafana.ini. В форме запроса учётных данных введём имя пользователя и пароль, используемые по умолчанию при первом запуске (определены в grafana.ini) – admin/admin

После входа в систему первым делом переходим в профиль пользователя admin > Profile и меняем логин/пароль администратора

После этого учётные данные admin/admin, определённые в grafana.ini перестанут действовать.

***

Следующим шагом нужно добавить источник данных, данными их которого Grafana может оперировать для построения графиков: Data Sources > Add data source.

На закладке Config определим произвольное имя источника данных, например Graphite-DC, включим его, как основной источник и выберем соответствующий тип Graphite.

В качестве Url укажем адрес и порт хоста, на котором у нас расположен веб-узел Graphite-Web. Установленный в рассмотренном ранее примере Graphite-Web расположен на том же сервере, что и Grafana на порту 8000. Так как ранее для веб-узла Graphite-Web мы настроили в веб-сервере Apache Basic-аутентификацию, включим в создаваемом источнике данных соответствующую опцию Basic Auth и укажем имя пользователя и пароль для подключения к Graphite-Web.

После нажатия кнопки Add Grafana выполнит проверку подключения к источнику данных и, если всё в порядке, выведет соответствующее сообщение

***

Далее нам нужно подключить к Grafana пред-настроенную панель Dashboard или создать собственную панель. Давайте попробуем для начала воспользоваться импортом готовой панели, ориентированной на Icinga. Скачать пример такой панели можно здесь: grafana-dashboards или здесь: Icinga2 with Graphite. После того, как файл панели в формате JSON загружен, в веб-интерфейсе Grafana перейдём в Dashboard > Import

Вставим содержимое json-файла и нажмём Load

В следующей форме выберем созданным нами ранее источник данных и нажмём Import

В моём случае импортированная панель выглядит совсем безрадостно, так как ни один из графиков не отображает никаких данных и в левом верхнем углу каждого графика красуется ссылка на сообщение об ошибке.

Ничего удивительного в таком поведении нет, так как данная панель, во первых, использует для своей работы метаданные, отправленные из Icinga в Graphite (а чтобы эти метаданные в Graphite появились, нужно выполнить дополнительную настройку модуля graphite в Icinga), а во вторых, если мы заглянем в свойства любого графика, то скорее всего увидим, что имена указанных там метрик не соответствуют именам метрик, которые мы видим в интерфейсе Graphite-Web.

Выберем любой график на панели, щелкнем по заголовку графика и в открывшемся меню управления графиком выберем пункт правки Edit 

В нижней части формы редактирования графика обратим внимание на то, как на закладке Metrics заданы метрики, которые используется для визуализации данным графиком.

Как минимум, здесь необходимо прощёлкать все поля для каждой метрики и убедиться в том, что выбраны правильные значения. Например, в моём случае имя службы, используемое в Icinga, и как следствие, попавшее в метрики Graphite, не ping4, а Ping_v4. То есть описанные в свойствах графика Grafana метрики должны быть сопоставимы с тем, что мы видим в Graphite-Web.

Соответственно, для того чтобы привести рассматриваемый нами график Grafana в работоспособное состояние, достаточно в соответствующих полях настройки получения метрик выбрать из выпадающего списка правильные значения, то есть, в моём случае это будет имя службы Ping_v4 и само значение value/warn/crit.

Обратите внимание на то, что значения warn и crit для метрик полученных из Icinga будут присутствовать в Graphite только в том случае, если в процессе ранее описанной настройки, в конфигурационном файле /etc/icinga2/features-available/graphite.conf был добавлен параметр enable_send_thresholds = true.

Не интересующие нас метрики, имеющиеся в рассматриваемом графике Grafana можно попросту исключить из визуализации (кнопка с изображением глаза в правой панели кнопок для каждой отдельно взятой метрики). В данном случае я отключил не интересующие меня значения порогов warn и crit, а также нижнюю позицию, которая оперирует метаданными, которых в моём Graphite попросту нет (их сбор не был мной ранее включен).

В верхнем правом углу можем задать период, за который в данным момент должен отображаться график, после чего наш график "оживёт" и станет показывать данные метрик.

После внесения изменений в графики панели, не забываем сохранять изменения кнопкой с изображением дискеты в верхней части экрана возле названия панели.

***

Вообще вопрос о реальной необходимости сбора метаданных Icinga по каждой Службе и отправке их в Graphite для меня остаётся открытым, так как какой-то полезности в этом я пока для себя не узрел. К тому же нужно понимать то, что хранение метаданных Icinga в Graphite потребует дополнительного дискового пространства, даже учитывая то, что Graphite нам позволяет через storage-schemas.conf гибко настроить сроки хранения таких метрик.

Если же вы всё-же захотите включить сбор метаданных Icinga для последующего их использования в графиках Graphite/Grafana, то сделать это можно, добавив параметр enable_send_metadata = true в конфигурационный файл расширения Icinga graphite - /etc/icinga2/features-enabled/graphite.conf

library "perfdata"

object GraphiteWriter "graphite" {
  host = "127.0.0.1"
  port = 2003
  enable_send_thresholds = true
  enable_send_metadata = true
}

После такой правки нужно выполнить перезапуск службы Icinga, чтобы метаданные начали отправляться в Graphite:

# service icinga2 restart

***

Итак, по описанному ранее примеру правки одного из графиков, настроим все графики панели под свои нужны и предпочтения. В случае необходимости создания новых панелей или новых графиков на панелях, можно использовать удобные функции копирования/клонирования в интерфейсе Grafana.

Если для создания панелей, которые мы планируем в дальнейшем использовать в Icinga Web 2, используется не функция клонирования из обозначенной ранее панели, а функция создания новой панели, то нам потребуется самостоятельно настроить набор переменных, которые используются в определении метрик в графиках создаваемой панели. Задаются эти переменные в свойствах панели через пункт Templating

Таким образом, после некоторого изучения имеющихся в Graphite метрик, поступающих из Icinga, и ряда экспериментов с панелями Grafana у меня получилась примерно такая панель, отображающая информацию по любому отдельно взятому Хосту Icinga (в теме оформления Light):

И тоже самое, только в теме оформления Dark, для любителей мрачных интерфейсов:

Самым сложным в процессе создания собственных графиков в показанном примере для меня, как для абсолютного новичка в Grafana, стала задача отображения вычисляемых значений. Например, вместо мало наглядного графика использования swap-файла, по умолчанию отображающего размер свободного места  в байтах/килобайтах и т.п., по неопытности пришлось потратить некоторое время, чтобы понять то, как сделать график, отображающий размер использования swap в процентном отношении от его величины. Пример настроек такого графика приведу далее.

Здесь становится очевидно, что мы можем использовать Grafana, как самостоятельный инструмент для визуализации текущего состояния и исторических данных производительности любых объектов мониторинга Icinga. Однако, учитывая то, что мы рассматриваем Grafana через призму Icinga, нам интересно иметь какой-то единый интерфейс для управления нашей инфраструктурой мониторинга Icinga и прелестями визуализации накопленных этой системой мониторинга метрических данных. Поэтому давайте посмотрим, какие на сегодняшний день есть варианты интеграции Grafana с интерфейсом Icinga Web 2. 

 

Интеграция Grafana в Icinga Web 2

В открытом доступе мне удалось найти только два модуля к Icinga Web 2, использующие возможности визуализации Grafana:

Оба модуля имеют одинаковое название, поэтому их совместное использование в Icinga Web 2 исключено. Второй модуль, как я понял, имеет более серьёзную проработку и представляет более широкие возможности, чем первый модуль. Давайте попробуем произвести его установку и настройку.

Клонируем модуль с GitHub:

# apt-get install git -y
# mkdir /usr/share/icingaweb2/modules/grafana    
# git clone --depth=1 https://github.com/Mikesch-mp/icingaweb2-module-grafana.git /usr/share/icingaweb2/modules/grafana

Создаём каталог для хранения конфигурационных файлов модуля:

# mkdir /etc/icingaweb2/modules/grafana

Переписываем права доступа на каталог с конфигурационными файлами:

# chown -R www-data:icingaweb2 /etc/icingaweb2/modules/grafana
# chmod -R 2750 /etc/icingaweb2/modules/grafana

***

Проверим то, что в конфигурационном файле Grafana (/etc/grafana/grafana.ini) для работы модуля, включена Basic-аутентификация:

...
#################################### Basic Auth ##########################
[auth.basic]
enabled = true
...

В случае внесения изменений в grafana.ini, перезапустим службу grafana-server:

# systemctl restart grafana-server

Зайдём в веб-интерфейс Grafana в меню Admin > Global Users и создадим пользователя с ролью Viewer, например с именем icinga2. От имени этого пользователя модуль Icinga Web 2 будет подключаться в Grafana.

Ранее описанным способом импортируем в Grafana панель, предлагаемую разработчиком модуля:  icingaweb2-module-grafana - dashboards - graphite - icinga2-default.json

***

Затем переходим в веб-консоли Icinga Web 2 в Configuration > Modules и активируем модуль (grafana > enable):

После активации модуля здесь же переходим на закладку Configuration и выполняем настройки модуля.

В полях Username и Password укажем учётные данные пользователя icinga2, которого мы ранее сделали в Grafana с ролью Viewer. В поле Host укажем URL Grafana.

Поля, определяющие размер графиков по умолчанию Graph height/width и период отображения данных в графиках Timerange заполняем, исходя из своих предпочтений, учитывая то обстоятельство, что в дальнейшем для каждой отдельно взятой Службы Icinga мы сможем задать уникальные настройки этих параметров на закладке Graphs (рассмотрим далее).

Опция Enable link определяет "кликабельность" графиков, то есть при включённой опции изображение графика будет содержать ссылку на соответствующий график в веб-интерфейсе Grafana. Однако в текущей реализации модуля, как я понял, данная ссылка является прямой и никак не использует для подключения к веб-интерфейсу Grafana учётные данные, указанные в полях Username и Password, поэтому в случае отключенной анонимной аутентификации в Grafana, при переходе по такой ссылке вместо графика мы рискуем увидеть форму запроса учётных данных. Поэтому, чтобы такие ссылки из графиков работали, придётся выбирать между такими вариантами, как включение анонимной аутентификации в Grafana или погружение в вопрос настройки дополнительных механизмов аутентификации, например Single Sign-On через Kerberos аутентификацию в Apache в связке с такой возможностью, как Grafana Auth Proxy (раздел [auth.proxy] в grafana.ini).

В поле Default dashboard определяем внутренне имя панели Grafana, которая по умолчанию будет использоваться для построения графиков для любой Службы Icinga. Данное значение может быть позже переопределено для любой Службы с помощью отдельной настройки на закладке Graphs.

В поле Datasource Backend указываем формат хранения данных в Grafana. По умолчанию Grafana хранит данные в sqlite3 (раздел [database] в grafana.ini). Смысл этой настройки, если честно, от меня ускользнул. В Datasource Type задаём тип источника данных. В нашем примере это Graphite.

***

При использовании панелей Grafana, которые мы сделали сами с какими-то хитрыми именами, возможно встанет вопрос, как выяснить внутренне имя панели, для указания его в конфигурации модуля. Это имя достаточно просто узнать в веб-интерфейсе Grafana, просто посмотрев на то, как формируется ссылка в веб-браузере при открытии интересующей нас панели.

***

После настройки конфигурации модуля, все заданные нами параметры будут записаны в конфигурационный файл /etc/icingaweb2/modules/grafana/config.ini

[grafana]
username = "icinga2"
password = "PazSw0rDicigraf"
host = "kom-ad01-mon20.ad.ies-holding.com:3000"
protocol = "http"
height = "280"
width = "640"
enableLink = "yes"
defaultdashboard = "icinga2-default"
defaultdashboardstore = "db"
datasource = "graphite"

***

Теперь в веб-интерфейсе Icinga Web 2 выберем какую-нибудь Службу у любого Хоста и убедимся в том, что на веб-странице, отображающей информацию о Службе появился график, получаемый из Grafana.  

 

Изменения графиков Grafana для разных Служб Icinga

Учитывая то, что в настроенной нами первоначальной конфигурации модуля icingaweb2-module-grafana для всех Служб Icinga используется единый шаблон, результат отображения графика для некоторых Служб может оказаться трудно воспринимаемым. В качестве примера приведу, уже полюбившийся нам, график Службы Swap

На мой взгляд, полезность такой визуализации стремится к нулю. Это можно попробовать исправить, создав в веб-консоли Grafana (на базе копии импортированной нами ранее панели icinga2-default) собственную панель.

***

Для начала откроем в веб-интерфейсе Grafana панель icinga2-default и перейдём в свойства единственного на этой панели шаблона графика. Здесь мы увидим, что в метриках описан всего один параметр, извлекающий значение value из метрики для любого хоста ($hostname) и службы ($service).

Создадим новую панель, используя функцию копирования текущей панели Save As. Присвоим новой панели имя, например icinga2-percent.

Открыв новую панель, перейдём в режим редактирования единственного имеющегося на этой панели графика. В нижней части определения свойств графика на закладке Metrics удалим имеющуюся единственную метрику и добавим две новые метрики (в нашем примере это #A и #B), определяющие максимальное пороговое значение метрики и текущее значение. При этом две созданные метрики мы исключим из визуализации.

Здесь же создадим третью метрику (#C), которая будет вычисляемой из значений первых двух метрик.

В нашем примере используется пару функций Grafana. Одна функция diffSeries(#A,#B) возвращает разницу между максимальным и текущим значением метрики. То есть, если говорить об этой функции, применительно к Службе Icinga Swap, таким образом мы вычислим абсолютное значение разницы между размером swap (max) и его свободным местом (value), хранимых в метриках Graphite. То есть, так мы узнаем размер используемого swap в абсолютной величине.

Следующей функцией asPercent() мы вычислим процентное значение ранее подсчитанного значения в функции diffSeries() относительно значения полученного из метрики max.  Говоря применительно к Службе Swap, таким образом в конечном итоге мы вычислим процент использования swap от его максимального размера.

Для того, чтобы понять, какие функции мы можем использовать для вычисляемых метрик при настройке графиков в Grafana, можно воспользоваться документацией, соответствующей нашему типу Data Source. В нашем примере в качестве источника данных используется Graphite, поэтому полезным может оказаться документ Graphite Docs - Functions

Итак, созданную нами вычисляемую третью метрику #C сделаем единственной отображаемой на графике.

 

Для улучшения визуализации процентной величины нам желательно сделать ещё ряд настроек графика. Например, переключимся на закладку Axes и выберем единицы отображения Units., а чтобы на графике координаты Y-оси отображались красиво, выставим минимальное (Y-Min) и максимальное значение оси (Y-Max). 

И так, как мы решили, чтобы Y-ось отображала полную 100% шкалу, то возможно, мы захотим дополнительно визуализировать для себя пороговые значения за рамками которых будет меняться окраска фона графика. Сделать это можно на закладке Display

Сохраняем проделанные изменения в шаблоне графика нашей новой панели Grafana и переходим в веб-интерфейс Icinga Web 2. Создадим уникальные настройки отображения графика для интересующей нас Службы Icinga Swap. Для этого перейдём в меню навигации в Configuration > Grafana Graphs и нажмём ссылку Add New Grafana Graph.

Здесь в качестве Name укажем имя Службы Icinga, для графиков, которой мы переопределяем настройки, заданные в конфигурации модуля для всех Служб.  

В поле Dashboard name укажем внутренне имя панели Grafana, которую мы подготовили специально для этого случая – icinga2-percent. О том, как выяснить это имя мы говорили чуть ранее.

В поле PanelId укажем внутренний идентификатор графика на панели Grafana. Выяснить этот идентификатор можно также подсмотрев в веб-интерфейсе Grafana гиперссылку, отображаемую в адресной строке веб-браузера при переходе на интересующий нас график. При этом если панель имеет несколько графиков, относящихся к интересующей нас Службе, здесь их можно перечислить через запятую.

Поля Graph height/width  и Timerange позволят нам настроить для Службы уникальные параметры размера выводимого графика и период, за которой должны отображаться данные. 

Сохраним заданные настройки и перейдём на веб-страницу отображения состояния Службы Swap для любого из хостов, например, через меню Overview > Services

Теперь, на мой взгляд, график стал наглядней, чем ранее.

Аналогичным образом мы можем настроить уникальное отображение графиков для любой Службы Icinga.

 

Выводы

Подводя итог, можно сказать, что Grafana, как отдельная сущность, позволяющая нам работать с метриками, отправляемыми из Icinga в Graphite, штука бесспорно мощная и приятная глазу. Однако, если говорить о рассмотренном модуле интеграции Grafana в Icinga Web 2, то по моим личным ощущениям, он хоть и интересен и заслуживает отдельного внимания, всё же имеет в своей текущей реализации ряд определённых недостатков:

  • Определённо более медленная отрисовка графиков, по сравнению с ранее рассмотренным модулем icingaweb2-module-graphite, приводит к неприятным задержкам при открытии веб-страниц свойств Служб и Хостов в веб-интерфейсе Icinga Web 2. В результате работать с некогда дивной и проворной веб-консолью становится крайне грустно вплоть до того, что появляются неприятные ассоциации с вечно-тормозящей консолью SCOM :)  
  • Отсутствие возможности исключения отображения графиков для определённых служб, что, само по себе, учитывая первый пункт, очень удручает.
  • На комплексных графиках, имеющих более одной метрики, нет возможности управлять визуализацией отображаемых метрик, как это удобно реализовано в модуле icingaweb2-module-graphite.
  • Использовать несколько настроек графиков с разными параметрами, например, с разными размерами, для одной и той же Службы у нас не получится. При этом если в описании уникальных параметров графика в опции PanelId мы укажем несколько графиков через запятую, то все эти графики будут использовать одинаковые настройки размеров, что может быть не всегда удобно.

Если автор модуля решит вопрос производительности отрисовки графиков, добавит возможность выбора отображаемых метрик, да ещё и реализует возможность изменения периода отображения с динамической перерисовкой графика, то необходимость метаться в интерфейс Grafana "по каждому чиху" у нас попросту отпадёт и наступит нескончаемое счастье. А пока этого не произошло, модуль icingaweb2-module-graphite остаётся для меня фаворитом, хотя бы потому, что работает исключительно быстро, хоть и имеет, с другой стороны, свои недостатки, например, не позволяет вытворять такие фокусы с вычисляемыми метриками, как были рассмотрены в нашей заметке применительно к модулю icingaweb2-module-grafana. Как бы там ни было, оба проекта заслуживают отдельного внимания, и мне остаётся лишь всячески поблагодарить авторов этих модулей и пожелать им продуктивного развития данных проектов.

Только один комментарий Комментировать

  1. Вячеслав /

    https://packagecloud.io/grafana/ больше не существует

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