Настройка правил алертинга (Alertmanager) и мониторинга DBaaS в Prometheus
В панель

Как настроить мониторинг и алертинг 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. Для этого:

  1. В панели управления перейдем в раздел Мониторинг → вкладка Метрики в формате Prometheus.
  2. Нажмем Управлять токенами Создать.
  3. Введем имя токена.
  4. Нажмем Создать. Токен будет сгенерирован автоматически.

Установка и настройка 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 будет выглядеть так:

Ответ после docker ps

Чтобы убедиться в том, что веб-интерфейс работает корректно, перейдем на http://<ip-вашего-сервера>:9090/targets. В случае, если все сконфигурировано верно, все таргеты мониторинга будут в состоянии UP:

Таргеты монитора в состоянии 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"}}&#x1F525<b>{{ .Status | toUpper }}</b>&#x1F525{{ else }}&#x2705<b>{{ .Status | toUpper }}</b>&#x2705{{ 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 появится такой вывод:

Вывод после команды 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 на случай, если возникнут проблемы.

Читайте также:

Инструкция
Инструкция
Инструкция