Как настроить мониторинг и алертинг DBaaS в Prometheus
В этой инструкции рассказываем, как настроить мониторинг и алертинг для DBaaS с помощью Prometheus — популярного инструмента для сбора аналитики и анализа метрик систем.
Введение
При организации IT-инфраструктуры все больше компаний предпочитают облачные решения. Это касается и DBaaS (Database-as-a-service) — баз данных, созданных и развернутых в облаке. С ростом количества управляемых СУБД, возникает необходимость в мониторинге и алертинге их состояния, чтобы быстро выявить проблемы и своевременно на них отреагировать.
В материале подробно описали, как установить и настроить сервис Prometheus и его компонент Alertmanager, которые помогут собирать информацию о состоянии баз данных, и получать предупреждения о проблемах.
Подготовка сервера
Прежде чем установить систему мониторинга, настроим некоторые параметры сервера.
Настройка времени
Чтобы события отображались в правильное время, на сервере нужно настроить NTP. Для этого установим chrony. Сделать это можно, выполнив команды:
Для CentOS/Red Hat/Fedora:
sudo yum install chrony -y
sudo systemctl enable chronyd
sudo systemctl start chronyd
Для Ubuntu и других Debian-based дистрибутивов:
sudo apt-get install chrony -y
sudo systemctl enable chrony
sudo systemctl start chrony
Настройка брандмауэра
Для успешной работы Prometheus и Alertmanager, на фаерволе необходимо открыть порты:
- TCP 9090: порт для HTTP-сервера Prometheus.
- TCP 9093: порт для HTTP-сервера Alertmanager.
- TCP и UDP 9094: порт для взаимодействия с Alertmanager.
Вот команды, которые нужно выполнить:
Для iptables:
iptables -A INPUT -p tcp --dport 9090 -j ACCEPT
iptables -A INPUT -p tcp --dport 9093 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 9094 -j ACCEPT
iptables -A INPUT -p udp --dport 9094 -j ACCEPT
Для ufw:
ufw allow 9090/tcp
ufw allow 9093/tcp
ufw allow 9094/tcp
ufw allow 9094/udp
Для firewalld:
firewall-cmd --add-port=9090/tcp --permanent
firewall-cmd --add-port=9093/tcp --permanent
firewall-cmd --add-port=9094/tcp --permanent
firewall-cmd --add-port=9094/udp --permanent
firewall-cmd --reload
Отдельно отметим, что при установке Prometheus средствами Docker, правила фаервола обновляются и настраиваются автоматически.
Создание кластера БД
Дальше нам потребуется создать саму базу. В нашем примере будем использовать кластер PostgreSQL. Подробнее о том, как его создать вы можете узнать в официальной документации.
После того как кластер создан, перейдем в его карточку и создадим токен мониторинга. Он понадобится после настройки Prometheus. Для этого:
- В панели управления перейдем в раздел Мониторинг → вкладка Метрики в формате Prometheus.
- Нажмем Управлять токенами → Создать.
- Введем имя токена.
- Нажмем Создать. Токен будет сгенерирован автоматически.
Установка и настройка Prometheus
Следующим шагом установим сервис Prometheus и его основные компоненты с помощью Docker.
Установка Docker
Чтобы установить Docker на сервер, рекомендуем использовать официальную документацию разработчика. Для примера будем использовать операционную систему Ubuntu.
Сначала установим официальный репозиторий Docker. Сделать это можно, выполнив команды:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
После этого выполняем команду:
sudo apt-get update
И устанавливаем компоненты:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Проверить корректность установки Docker можно командой:
sudo docker run hello-world
Развертывание Prometheus в Docker
Теперь настроим и развернем Prometheus в контейнере Docker. Но сначала создадим директорию для хранения данных Prometheus. Это важно, чтобы информация сохранялась между запусками контейнера. Создать директорию можно, используя команду:
mkdir /srv/prometheus
Затем изменим права для этой директории, чтобы системный пользователь Prometheus мог читать и изменять файлы и директорию. Для этого выполним команду:
chown -R 65534:65534 /srv/prometheus/
После этого создадим файл docker-compose.yml в директории, где будет развернут Prometheus и добавим код:
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- /srv/prometheus/promdata:/prometheus/data
- /srv/prometheus/promconfig:/etc/prometheus/
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus/data'
- '--web.enable-lifecycle'
ports:
- 9090:9090
Этот код определяет контейнер Docker для Prometheus и настраивает его для работы с вашим конфигурационным файлом и директорией.
Далее нам потребуется создать файл конфигурации Prometheus — prometheus.yml. Он содержит настройки мониторинга вашего кластера баз данных и алертинг. Для этого создадим файл в директории /srv/prometheus/promconfig и добавим следующий код:
global:
scrape_interval: 15s
external_labels:
monitor: 'dbaas-monitor'
scrape_configs:
- job_name: 'get-metrics-from-dbaas'
scrape_interval: 1m
static_configs:
- targets:
- '<pool>.dbaas.selcloud.ru'
scheme: https
authorization:
type: Bearer
credentials: '<monitoring_token>'
rule_files:
- rules.yaml
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
В этом коде нужно заменить:
- <pool> на пул, в котором развернут ваш кластер. В нашем случае это будет пул ru-3.
- <monitoring_token> на токен, который у нас получился на этапе создания и настройки кластера БД.
После замены этих данных файл будет выглядеть так:
Сохраняем его и выполняем тестовый запуск Prometheus. Находясь в директории с файлом docker-compose.yml, выполним команду:
docker-compose up -d
Если все сконфигурировано правильно, ответ после команды docker ps будет выглядеть так:
Чтобы убедиться в том, что веб-интерфейс работает корректно, перейдем на http://<ip-вашего-сервера>:9090/targets. В случае, если все сконфигурировано верно, все таргеты мониторинга будут в состоянии UP:
Экспортер, который мы подключили, собирает следующие метрики:
- dbaas_cpu — нагрузка на CPU в процентах;
- dbaas_disk_bytes — количество данных в байтах, занятых базой данных;
- dbaas disk percent — то же количество, но в процентном соотношении;
- dbaas_memory_bytes — количество используемой RAM в байтах;
- dbaas_memory_percent — количество используемой RAM в процентах от общего количества памяти;
- dbaas_node_load1 — средний load average за последнюю минуту;
- dbaas_node_load5 — средний load average за последние 5 минут;
- dbaas_node_load15 — средний load average за последние 15 минут;
- dbaas_role — роль ноды в кластере.
Установка и настройка Alertmanager
Alertmanager — это компонент системы мониторинга Prometheus, который обрабатывает оповещения, группирует их и отправляет получателю на электронную почту, в Telegram или Slack.
Компонент формирует уведомления на основе правил, которые заданы в конфигурационном файле. В этой части статьи мы создадим этот файл, установим для него правила и настроим так, чтобы Alertmanager отправлял оповещения в Telegram.
Конфигурирование Alertmanager
На старте создадим новый контейнер для Docker-Compose. Чтобы это сделать, добавим в файл docker-compose.yml следующие строки:
alertmanager:
image: prom/alertmanager
container_name: alertmanager
volumes:
- /srv/alertmanager:/alertmanager/data
- /srv/alertmanager/config:/etc/alertmanager/
command:
- '--config.file=/etc/alertmanager/alertmanager.yaml'
ports:
- 9093:9093
Далее создадим файл конфигурации Alertmanager. Он определяет, как компонент будет обрабатывать и отправлять предупреждения. Чтобы настроить конфигурацию Alertmanager, создадим файл alertmanager.yml в папке /srv/alertmanager/config.
После этого создадим директорию и настроим права доступа:
mkdir /srv/alertmanager
mkdir /srv/alertmanager/config
chown -R 65534:65534 /srv/prometheus/
Чтобы AlertManager отправлял оповещения в Telegram, создадим Telegram-бота. API-ключ для Telegram можно получить у @BotFather. Для этого введем команду, которая создает и регистрирует нового бота — /newbot и дадим ему имя:
После этого создадим канал в Telegram, куда будут приходить алерты. Добавляем бота в этот канал и выдаем ему права администратора.
Теперь отправляем в канал любое сообщение и переходим по ссылке https://api.telegram.org/bot<ВАШ_ТОКЕН>/getUpdates и ищем поле id:
Значение у этого поля обязательно должно быть отрицательным. Это будет ID вашего канала, который потребуется нам на следующем шаге.
Теперь заполним созданный ранее файл alertmanager.yml следующими значениями:
global:
resolve_timeout: 5m
telegram_api_url: "https://api.telegram.org"
templates:
- '/etc/alertmanager/*.tmpl'
receivers:
- name: blackhole
- name: telegram-test
telegram_configs:
- chat_id: "ID вашего чата без кавычек"
bot_token: "Ваш токен без кавычек"
api_url: "https://api.telegram.org"
send_resolved: true
parse_mode: HTML
message: '{{ template "telegram.default" . }}'
route:
group_by: ['ds_id'] # Алерты группируются по UUID кластера.
group_wait: 15s
group_interval: 30s
repeat_interval: 12h
receiver: telegram-test
routes:
- receiver: telegram-test
continue: true
matchers:
- severity="critical"
- receiver: blackhole
matchers:
- alertname="Watchdog"
В этом файле — глобальные настройки, шаблоны для форматирования сообщений, конфигурация получателей и правила маршрутизации алертов. Рассмотрим подробнее некоторые из разделов.
За разделом с глобальными настройками (global) следует templates — в нем задаются шаблоны для форматирования сообщений. В данном случае используется шаблон /etc/alertmanager/*.tmpl, то есть все шаблоны из директории /etc/alertmanager/.
В разделе receivers описаны получатели сообщений:
- blackhole — пустой получатель, который игнорирует все сообщения;
- telegram-test — получатель, который отправляет сообщения в Telegram.
Чтобы отправлять сообщения в Telegram, используется конфигурация telegram_configs, которая содержит следующие параметры:
- chat_id — ID чата в Telegram, куда будут отправляться сообщения. Здесь нужно указать свой ID чата.
- bot_token — токен бота в Telegram. Здесь нужно указать свой токен.
- api_url — URL API Telegram.
- send_resolved — отвечает за отправку уведомлений при восстановлении.
- parse_mode — режим парсинга сообщений (HTML, Markdown и т. д.).
- message — содержание сообщения. В нашем примере используется шаблон telegram.default, который определен в файле telegram.tmpl.
В разделе route задаются правила маршрутизации алертов. Алерты группируются по UUID кластера (group_by: [‘ds_id’]). После группировки они ожидают 15 секунд (group_wait) и далее приходят, как уведомление каждому получателю. Если в течение 12 часов алерт не перейдет в статус Resolved, он будет отправлен повторно (repeat_interval).
Правила маршрутизации для каждого получателя (receivers) задаются в этом же разделе. В нашем примере, если алерт имеет severity со значением critical, то он будет отправлен на получателя telegram-test.
Чтобы контейнер работал корректно, назначим права владения директориями сразу после того, как создали файл:
chown -R 65534:65534 /srv/alertmanager/
Далее создадим файл шаблона — по нему будут заполняться сообщения от системы мониторинга. Для этого переходим в директорию с файлом конфигурации alertmanager и создаем файл telegram.tmpl:
cd /srv/alertmanager/config
nano telegram.tmpl
Добавляем в файл следующий текст:
{{ define "telegram.default" }}
{{ range .Alerts }}
{{ if eq .Status "firing"}}🔥<b>{{ .Status | toUpper }}</b>🔥{{ else }}✅<b>{{ .Status | toUpper }}</b>✅{{ end }}
<b>{{ .Labels.alertname }}</b>
{{- if .Labels.severity }}
<b>Severity:</b> {{ .Labels.severity }}
{{- end }}
{{- if .Labels.ds_name }}
<b>Database:</b> {{ .Labels.ds_name }}
{{- if .Labels.ds_group }}
<b>Database group:</b> {{ .Labels.ds_group }}
{{- end }}
{{- end }}
{{- if .Labels.ds_id }}
<b>Cluster UUID: </b>
<code>{{ .Labels.ds_id }}</code>
{{- end }}
{{- if .Labels.instance }}
<b>DBaaS region:</b> {{ .Labels.instance }}
{{- end }}
{{- if .Annotations.message }}
{{ .Annotations.message }}
{{- end }}
{{- if .Annotations.summary }}
{{ .Annotations.summary }}
{{- end }}
{{- if .Annotations.description }}
{{ .Annotations.description }}
{{- end }}
{{ end }}
{{ end }}
Сохраняем файл и выполняем тестовый запуск контейнера:
docker-compose up -d
Если конфигурирование Alertmanager было проведено корректно, после команды docker ps появится такой вывод:
Настройка правил алертинга в Prometheus
Чтобы Alertmanager мог отправлять оповещения о проблемах в системе, настроим правила алертинга в Prometheus. Эти правила определяют условия, при которых генерируется оповещение, и содержат информацию о том, как это оповещение должно быть отправлено в Alertmanager.
Сначала создадим новый файл rules.yaml в директории с конфигурационным файлом prometheus:
nano /srv/prometheus/promconfig/rules.yaml
Теперь в этом файле создадим правила для алертинга. Для этого заполним его следующими значениями:
groups:
- name: dbaas
rules:
- alert: DBaaS down
expr: up = 0
for: 1m
labels:
severity: critical
annotations:
summary: "DBaaS down in {{ $labels.instance }}"
description: "DBaas cluster {{ $labels.ds_id }} is down. Please check your cluster or write a ticket to the support team."
- alert: High CPU usage
expr: dbaas_cpu > 90
for: 5m
labels:
severity: critical
annotations:
summary: "High CPU usage on DB instance {{ $labels.ds_id }}"
description: "The CPU usage on the DB instance {{ $labels.ds_id }} has been above 90% for more than 5 minutes.\n Current value: {{ $value }}"
- alert: High memory usage
expr: dbaas_memory_percent > 90
for: 5m
labels:
severity: critical
annotations:
summary: "High memory usage on DB instance {{ $labels.ds_id }}"
description: "The memory usage on the DB instance {{ $labels.ds_id }} has been above 90% for more than 5 minutes.\n Current value: {{ $value }}"
- alert: Disk space usage is High
expr: dbaas_disk_percent >= 80
for: 15m
labels:
severity: critical
annotations:
summary: "Disk space usage on DB instance {{ $labels.ds_id }}"
description: "The disk space usage on the DB instance {{ $labels.ds_id }} reached high level.\n Current value: {{ $value }}. Please check your cluster configuration."
После того как внесены все дополнительные значения, сохраним созданный файл.
В итоге мы собрали в файле основные метрики кластера баз данных, которые помогут вовремя отреагировать на инцидент и предотвратить возможные проблемы.
Еще файл содержит несколько правил и оповещений для мониторинга кластера DBaaS. Эти правила проверяют доступность кластера, а также использование CPU, памяти и дискового пространства. Если какое-то из этих значений превышает установленные пороги, то будет создано соответствующее оповещение.
Обращаем отдельное внимание на правило Disk space usage is High: в случае, если диск кластера будет заполнен на 95%, кластер перейдет в режим «Только для чтения», что повлияет на работу ваших сервисов. Подробнее об этом механизме вы можете узнать в официальной документации.
Теперь, чтобы правила алертинга сработали в нашей инсталляции Prometheus, добавим две строки в конфигурационный файл Prometheus. Для этого сначала откроем файл:
nano /srv/prometheus/promconfig/prometheus.yml
Внесем в него следующие строки:
rule_files:
- rules.yaml
После чего сохраним файл и выполним рестарт контейнеров:
docker-compose restart
В конце убедимся, что все контейнеры запущены успешно:
docker ps
Как только мы убедились, что все работает без ошибок, переходим на http://<адрес вашего сервера>:9090/rules и видим, что все правила добавились корректно:
На скриншоте у правила DBaaS down другое условие, которое отличается от приведенного нами примера правил алертинга. Это сделано намеренно для проверки корректности отправляемых алертов
После этого переходим в Telegram, чтобы убедиться, что все работает правильно:
Заключение
В этой инструкции мы рассказали, как настроить мониторинг для DBaaS с помощью системы Prometheus и ее компонента Alertmanager. Также описали шаги, которые помогут создать правила в Prometheus, и настроить уведомления в Telegram на случай, если возникнут проблемы.