Развёртывание Icinga 2 на базе Debian 12. Часть 5. Установка InfluxDB 2 и Grafana

Deploying Icinga 2 on Debian 12. Part 5. Installing InfluxDB 2 and GrafanaПродолжая двигаться по ранее намеченному плану развёртывания нового сервера мониторинга Icinga 2 на базе ОС Debian GNU/Linux 12, в этой части мы рассмотрим установку хранилища метрик InfluxDB 2 и его интеграцию с Icinga, а также рассмотрим особенности установки системы визуализации Grafana и интеграции Grafana с актуальными версиями InfluxDB 2 и Icinga Web 2.

В прошлом цикле заметок про развёртывание Icinga в качестве хранилища метрик производительности мы рассматривали Graphite, работающий на базе Carbon и Whisper. С тех пор прошло немало времени и практическая эксплуатация Graphite выявила как положительные стороны этого продукта, так и его недостатки. Из положительных моментов можно отметить простоту работы с хранимыми данными на файловой системе. Например, в любой момент можно быстро по маске файлов найти и удалить данные по одному или нескольким хостам, по отдельной службе или даже по отдельной метрике, легко анализировать "жирные" метрики и т.п.. Но эта же особенность хранения данных метрик в виде множества файлов является недостатком, так как накладывает ряд ограничений по именованию метрик, вынуждая заниматься нормализацией имён метрик, получаемых из разных плагинов мониторинга. Однако более серьёзной проблемой, с которой пришлось столкнуться – это крайне высокая процессорная нагрузка на сервер Icinga при большом количестве собираемых метрик. В своё время это даже вынудило нас перейти с использования поставляемого в составе Graphite модуля carbon-cache на альтернативный вариант go-carbon, что позволило снизить нагрузку на сервер и по ходу дальнейшей эксплуатации дало возможность расширять объём накопления метрик. Но это, как говорится, уже совсем другая история и на новом развёртывании сервера Icinga мы будем использовать более "модное и молодёжное" хранилище метрик на базе InfluxDB 2 с использованием встроенного языка запросов Flux.

 

Установка InfluxDB 2 и интеграция с Icinga

В актуальной версии Icinga поддерживается работа как с первой, так и со второй версией InfluxDB. При этом, в стандартных репозиториях Debian Bookworm имеется пакет influxdb лишь первой версионной ветки:

# apt-cache show influxdb | grep Version

Version: 1.6.7~rc0-1+b13

Чтобы получить вторую версию InfluxDB, нам потребуется подключить репозиторий repos.influxdata.com.

Скачиваем в систему ключ репозитория:

# wget -O - https://repos.influxdata.com/influxdata-archive_compat.key | gpg --dearmor -o /etc/apt/keyrings/influxdata-archive_compat.gpg

Подключаем репозиторий со ссылкой на ключ и выполняем обновление кэша менеджера пакетов:

# echo 'deb [signed-by=/etc/apt/keyrings/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list
# apt-get update

Проверим доступность пакета второй версии influxdb2:

# apt-cache show influxdb2

Package: influxdb2
Version: 2.7.6-1
Architecture: amd64
Maintainer: support@influxdb.com
Installed-Size: 104339
Depends: curl
Recommends: influxdb2-cli
Conflicts: influxdb
Filename: packages/influxdb2_2.7.6-1_amd64.deb
Size: 47145522
MD5sum: 67e5482a5876192e68623c956345e815
SHA1: 79c32d77c8716898823395d058bda6e81f932b82
SHA256: 936625a618c39fa83b96416d02658e4fa1bf4f717de1a58eef3459208bd3afda
Section: default
Priority: optional
Homepage: https://influxdata.com
Description: Distributed time-series database.
Description-md5: 0b6beb0ca2e0701d5fa9dd4f80fb60f3
License: MIT
Vendor: InfluxData

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

# apt-get install influxdb2

После установки в системе появится новая служба influxd.service. Запустим эту службу и убедимся в том, что в системе появился TCP прослушиватель на порту 8086.

# systemctl start influxd.service
# ss -tunlp | grep influx

tcp  LISTEN  0  4096  *:8086  *:*  users:(("influxd",pid=365871,fd=9))

Для доступа к встроенному в InfluxDB веб-интерфейсу добавим в nftables правило разрешающее входящий трафик на порт TCP 8086 из подсети администраторов.

Перейдём по ссылке:

http://{servername}:8086/

При первом переходе на эту ссылку будет запущен мастер первичной настройки InfluxDB.

InfluxDB Configuration Wizard - Welcome

Нам будет предложено создать новое "Ведро" (Bucket) для хранения метрик. Укажем имя нового пользователя InfluxDB, пароль, название организации и имя нового "Ведра", например, "icinga2".

InfluxDB Configuration Wizard - Creating a New Bucket

На следующем шаге будет сгенерирован операторский токен доступа к API, дающий полные привилегии в InfluxDB. Сохраним этот токен в надёжном защищённом месте.

InfluxDB Configuration Wizard - API Token

Перезапустим веб-интерфейс InfluxDB, введём учётные данные ранее созданного нами пользователя и в главном меню перейдём в пункт "Load Data" – "Buckets". Найдём здесь созданное нами ранее "Ведро" с именем "icinga2" и нажмём кнопку "Settings".

InfluxDB - change Bucket settings

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

InfluxDB - period of data storage in the Bucket

На этом нехитрая базовая настройка InfluxDB закончена.

Переходим на консоль сервера и, согласно документа "Icinga 2 Features" , активируем в Icinga фичу InfluxDB Writer:

# icinga2 feature enable influxdb2

Enabling feature influxdb2. Make sure to restart Icinga 2 for these changes to take effect.

Появится сообщение о необходимости перезагрузки службы icinga2, но не спешим это делать, пока нами ещё не настроена конфигурация фичи influxdb2:

# nano /etc/icinga2/features-enabled/influxdb2.conf

Раскомментируем все параметры конфигурации и настроим их. Укажем имя организации, имя "Ведра" и токен, которые были нами заданы ранее:

/**
 * The Influxdb2Writer type writes check result metrics and
 * performance data to an InfluxDB v2 HTTP API
 */

object Influxdb2Writer "influxdb2" {
  host = "127.0.0.1"
  port = 8086
  organization = "IT Komi"
  bucket = "icinga2"
  auth_token = "WW21 ... 2a-VQ=="
  flush_threshold = 1024
  flush_interval = 10s
  enable_send_thresholds = true
  host_template = {
    measurement = "$host.check_command$"
    tags = {
      hostname = "$host.name$"
    }
  }
  service_template = {
    measurement = "$service.check_command$"
    tags = {
      hostname = "$host.name$"
      service = "$service.name$"
    }
  }
}

Описание параметров этого конфигурационного файла можно найти в документе "Icinga 2 Object Types".

Сохраним конфигурацию influxdb2.conf и выполним перезапуск служб:

# systemctl restart icinga2.service
# systemctl restart icingadb.service

Теперь в веб-интерфейсе Icinga Web для Служб, имеющих данные Performance Data, появится информация о метриках:

Performance Data Metrics in Icinga Web 2

Стоит отметить то, что в некоторых случаях не все данные Performance Data отображаются в веб-интерфейсе Icinga Web 2 с модулем Icinga DB Web. Например, мы можем видеть значение в столбце VALUE, но не видеть при этом пороговых значений в столбцах MIN, MAX, WARNING, CRITICAL. Как я понял, это давняя проблема, которая в рассматриваемой нами версии Icinga не имеет исправления.

Теперь мы можем переходить к настройке визуализации сохраняемых в InfluxDB данных Performance Data с помощью графических возможностей Grafana.

 

Установка Grafana и интеграция с InfluxDB и Icinga

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

Согласно документа "Grafana Integration"  для возможности интеграции современной версии Icinga Web с Grafana нам потребуется:

  • Развёрнутый экземпляр InfluxDB 2;
  • Активированная в icinga фича InfluxDB 2 Writer;
  • Развёрнутый экземпляр Grafana 9.x (или новей);
  • Модуль Grafana для Icinga Web;

Первый и второй пункты у нас выполнены, поэтому переходим к установке Grafanа

Для получения базовых инструкций по установке Grafana на Debian 12 воспользуемся документом
"Install Grafana on Debian or Ubuntu".

Перед установкой Grafana установим из репозиториев Debian Bookworm необходимые пакеты:

# apt-get install -y apt-transport-https software-properties-common wget adduser libfontconfig1 musl

Если говорить об установке Grafana из официального репозитория, то предварительно нам потребуется скачать в систему ключ репозитория Grafana.
Но с этим могут возникнуть проблемы, так как скачивание из России может не сработать. При попытке загрузки ключа, мы можем получить ошибки "403 Access Denied" и "Sorry, the provided token is not valid", что подтверждают коллеги по цеху.

Для получения ключа можно воспользоваться альтернативным вариантом с помощью сервера ключей keyserver.ubuntu.com, с которого нам нужно будет скачать ключ "225E6A9BBB15A37E95EB6312C66A51CCB44C27E0":

# wget -qO - "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x225E6A9BBB15A37E95EB6312C66A51CCB44C27E0" | gpg --dearmor -o /etc/apt/keyrings/grafana.gpg

Официальный способ подключения репозитория от Grafana такой:

# echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

Однако, опять же, в России мы не сможем установить из этого репозитория пакеты, получая от сайта apt.grafana.com ошибку всё той же блокировки по национальному признаку "403 Access Denied".
Возможно, в перспективе администрацию этого сайта "отпустит" и доступ к репозиторию заработает, но пока есть альтернативный вариант установки актуальной версии пакета через прямую загрузку по ссылке, которую можно найти на странице "Download Grafana" .

Загрузим пакет и произведём его установку:

# wget https://dl.grafana.com/oss/release/grafana_10.4.2_amd64.deb
# dpkg -i grafana_10.4.2_amd64.deb

Включим автозапуск и запустим службу grafana-server.service:

# systemctl enable grafana-server.service
# systemctl start grafana-server.service

Проверим наличие прослушивателя на порту TCP 3000:

# ss -tunlp | grep grafana

tcp  LISTEN  0  4096  *:3000  *:*  users:(("grafana",pid=52441,fd=18))

Если требуется, настроим правила nftables, чтобы ограничить доступ к серверу Grafana.

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

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

# nano /etc/grafana/grafana.ini

В нашем случае изменены лишь некоторые параметры:

...
[server]
;protocol = https
protocol = http
domain = kom-mon01.holding.com
enforce_domain = true
root_url = http://kom-mon01.holding.com:3000
;root_url = https://kom-mon01.holding.com:3000
;cert_file = /etc/grafana/KOM-MON01.pem
;cert_key = /etc/grafana/KOM-MON01.key
...
[users]
allow_sign_up = false
allow_org_create = false
default_theme = light
...
[auth.anonymous]
enabled = true
org_role = Viewer
hide_version = true
...
[plugin.grafana-image-renderer]
;rendering_ignore_https_errors = true
...

В частности, здесь определено имя веб-сервера для подключения, выключена регистрация новых пользователей и включена роль "Viewer" для пользователей, не прошедших авторизацию. Включение параметра rendering_ignore_https_errors может быть полезно для решения проблемы с работой плагина grafana-image-renderer при включённом в конфигурации Grafana SSL. Закомментированные параметры показаны на случай, если потребуется включить SSL в Grafana. В этом случае у учётной записи, от имени которой работает служба grafana-server, должен быть доступ на чтение к файлам сертификата и закрытого ключа.

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

# systemctl restart grafana-server

Откроем веб-браузер и перейдём на адрес фронтэнда, который мы ранее определили в параметре root_url в grafana.ini:

http://{server-fqdn}:3000/

В форме запроса учётных данных введём имя пользователя и пароль, используемые по умолчанию при первом запуске (определены в grafana.ini) – логин "admin" с паролем "admin".

Login to the Grafana web console for the first time

После первого входа нам сразу будет предложено поменять пароль администратора. Меняем. После этого учётные данные по умолчанию, определённые в grafana.ini, перестанут действовать.

Следующим шагом нужно добавить источник данных, данными их которого Grafana может оперировать для построения графиков. В главном меню переходим в "Connections" > "Data sources" > "Add new data source". В списке доступных источников данных выбираем "InfluxDB". Он установится как источник данный по умолчанию.

Connecting an InfluxDB source in Grafana

Откроем свойства добавленного источника данных и сконфигурируем подключение к хранилищу метрик InfluxDB. Укажем язык запросов "Flux".

Selecting the Flux query language for InfluxDB in Grafana

Укажем адрес и порт сервера InfluxDB. В нашем случае все сервисы на одном сервере, поэтому можем указать адрес localhost.

Specifying the InfluxDB API URL in Grafana

Ниже укажем организацию, токен доступа и "Ведро" InfluxDB. После нажатия кнопки "Save & Test" будет произведена проверка подключения к источнику данных и, если всё в порядке, появится соответствующее сообщение:

Connecting the InfluxDB Bucket in Grafana

Далее нам нужно подключить к Grafana пред-настроенную панель Dashboard или создать собственную панель. Для начала можно попробовать воспользоваться импортом готовой панели, ориентированной на Icinga. В качестве исходного варианта панели, ориентированной на Icinga2 и совместимой с InfluxDB2, мы будем использовать: grafana-dashboard-icinga2-influxdb2-flux.

После того, как файл панели в формате JSON загружен, в веб-интерфейсе Grafana в главном меню выберем пункт "Dashboards" и в правой части страницы выберем  "New" > "Import":

Importing a dashboard from a JSON file into Grafana

В форме импорта выберем ранее загруженный JSON файл, укажем ранее созданный в Grafana источник данных influxdb и нажмём кнопку "Import":

Selecting the InfluxDB data source when importing a dashboard into Grafana

После успешного импорта перед нами появится панель с единственным графиком, для построения которого нам нужно будет выбрать в верхней части веб-страницы значения переменных hostname, service, command.

Default dashboard for Icinga 2 with InfluxDb in Grafana

Отталкиваясь от этой панели с графиком, как от примитивного образца, в дальнейшем можно создавать собственные панели с разными графиками, оперирующими данными их хранилища InfluxDB.

Теперь перейдём к процедуре интеграции графиков Grafana в веб-интерфейс Icinga Web 2. Для этой цели, согласно рекомендации из документа "Grafana Integration", воспользуемся модулем icingaweb2-module-grafana.

Переходим на консоль сервера и клонируем модуль с 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 средство рендеринга изображений, получаемых из Grafana с помощью утилиты grafana-cli (потребуется прямой доступ к сайту grafana.com):

# grafana-cli plugins install grafana-image-renderer

✔ Downloaded and extracted grafana-image-renderer v3.10.4 zip successfully to /var/lib/grafana/plugins/grafana-image-renderer
Please restart Grafana after installing or removing plugins. Refer to Grafana documentation for instructions if necessary.

После этого перезапустим службу сервера Grafana:

# systemctl restart grafana-server

Кроме того, чтобы избежать проблем, связанных с работой этого самого grafana-image-renderer, нам потребуется доустановить в систему Debian Bookworm ряд пакетов:

# apt-get install libnss3 libxss1 libatk1.0-0 libatk-bridge2.0-0 libdrm2 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 libgbm1 libxkbcommon0 libpango-1.0-0 libcairo2 libasound2

Активируем модуль grafana в Icinga:

# icingacli module enable grafana

Перейдём в веб-консоль Icinga Web  2 и настроим подключение модуля grafana к нашему экземпляру сервера Grafana. Ранее мы подробно рассматривали настройки этого модуля.

Setting up the grafana module in Icinga Web 2

На данном этапе по хорошему, интеграция Grafana и Icinga Web должна заработать и мы должны увидеть графики.

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

Deprecated: Creation of dynamic property Icinga\Module\Grafana\ProvidedHook\Icingadb\ServiceDetailExtension::$permission is deprecated in /usr/share/icingaweb2/modules/grafana/library/Grafana/ProvidedHook/Icingadb/IcingaDbGrapher.php

Это известная проблема несовместимости текущей версии модуля grafana с php 8.2, обозначенная ещё в прошлом году.

Исправить её можно путём наложения патча на скрипты HostDetailExtension.php и ServiceDetailExtension.php в составе файлов модуля grafana. Для этого перейдём в каталог с файлами модуля:

# cd /usr/share/icingaweb2/modules/grafana

Создадим файл патча:

# nano /usr/share/icingaweb2/modules/grafana/patch-issue-325.diff

Наполним файл патча содержимым:

diff --git a/library/Grafana/ProvidedHook/Icingadb/HostDetailExtension.php b/library/Grafana/ProvidedHook/Icingadb/HostDetailExtension.php
index 85a0126..dc0ec75 100644
--- a/library/Grafana/ProvidedHook/Icingadb/HostDetailExtension.php
+++ b/library/Grafana/ProvidedHook/Icingadb/HostDetailExtension.php
@@ -8,6 +8,7 @@ use ipl\Html\Html;
 use ipl\Html\HtmlString;
 use ipl\Html\ValidHtml;

+#[\AllowDynamicProperties]
 class HostDetailExtension extends HostDetailExtensionHook
 {
     use IcingaDbGrapher;
diff --git a/library/Grafana/ProvidedHook/Icingadb/ServiceDetailExtension.php b/library/Grafana/ProvidedHook/Icingadb/ServiceDetailExtension.php
index 00fa6ed..0d4fa9c 100644
--- a/library/Grafana/ProvidedHook/Icingadb/ServiceDetailExtension.php
+++ b/library/Grafana/ProvidedHook/Icingadb/ServiceDetailExtension.php
@@ -8,6 +8,7 @@ use ipl\Html\Html;
 use ipl\Html\HtmlString;
 use ipl\Html\ValidHtml;

+#[\AllowDynamicProperties]
 class ServiceDetailExtension extends ServiceDetailExtensionHook
 {
     use IcingaDbGrapher;

Применим патч к файлам плагина:

# patch -p1 < patch-issue-325.diff

patching file library/Grafana/ProvidedHook/Icingadb/HostDetailExtension.php
patching file library/Grafana/ProvidedHook/Icingadb/ServiceDetailExtension.php

После этого проблема с возникновением ошибки должна исчезнуть, и плагин grafana должен заработать:

Perfdata graph in the grafana module in Icinga Web 2

На этом базовую интеграцию Grafana с Icinga Web 2 можно считать выполненной.

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