Продолжая двигаться по ранее намеченному плану развёртывания нового сервера мониторинга 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.
Нам будет предложено создать новое "Ведро" (Bucket) для хранения метрик. Укажем имя нового пользователя InfluxDB, пароль, название организации и имя нового "Ведра", например, "icinga2".
На следующем шаге будет сгенерирован операторский токен доступа к API, дающий полные привилегии в InfluxDB. Сохраним этот токен в надёжном защищённом месте.
Перезапустим веб-интерфейс InfluxDB, введём учётные данные ранее созданного нами пользователя и в главном меню перейдём в пункт "Load Data" – "Buckets". Найдём здесь созданное нами ранее "Ведро" с именем "icinga2" и нажмём кнопку "Settings".
В конфигурации по умолчанию созданное нами "Ведро" не имеет ограничений по сроку хранения данных метрик. Выставим приемлемую для нас глубину хранения данных, например, 1 год.
На этом нехитрая базовая настройка 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 отображаются в веб-интерфейсе 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".
После первого входа нам сразу будет предложено поменять пароль администратора. Меняем. После этого учётные данные по умолчанию, определённые в grafana.ini, перестанут действовать.
Следующим шагом нужно добавить источник данных, данными их которого Grafana может оперировать для построения графиков. В главном меню переходим в "Connections" > "Data sources" > "Add new data source". В списке доступных источников данных выбираем "InfluxDB". Он установится как источник данный по умолчанию.
Откроем свойства добавленного источника данных и сконфигурируем подключение к хранилищу метрик InfluxDB. Укажем язык запросов "Flux".
Укажем адрес и порт сервера InfluxDB. В нашем случае все сервисы на одном сервере, поэтому можем указать адрес localhost.
Ниже укажем организацию, токен доступа и "Ведро" InfluxDB. После нажатия кнопки "Save & Test" будет произведена проверка подключения к источнику данных и, если всё в порядке, появится соответствующее сообщение:
Далее нам нужно подключить к Grafana пред-настроенную панель Dashboard или создать собственную панель. Для начала можно попробовать воспользоваться импортом готовой панели, ориентированной на Icinga. В качестве исходного варианта панели, ориентированной на Icinga2 и совместимой с InfluxDB2, мы будем использовать: grafana-dashboard-icinga2-influxdb2-flux.
После того, как файл панели в формате JSON загружен, в веб-интерфейсе Grafana в главном меню выберем пункт "Dashboards" и в правой части страницы выберем "New" > "Import":
В форме импорта выберем ранее загруженный JSON файл, укажем ранее созданный в Grafana источник данных influxdb и нажмём кнопку "Import":
После успешного импорта перед нами появится панель с единственным графиком, для построения которого нам нужно будет выбрать в верхней части веб-страницы значения переменных hostname, service, command.
Отталкиваясь от этой панели с графиком, как от примитивного образца, в дальнейшем можно создавать собственные панели с разными графиками, оперирующими данными их хранилища 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. Ранее мы подробно рассматривали настройки этого модуля.
На данном этапе по хорошему, интеграция 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 должен заработать:
На этом базовую интеграцию Grafana с Icinga Web 2 можно считать выполненной.
Добавить комментарий