Оповещения Prometheus

DockerBeginner
Практиковаться сейчас

Введение

Эффективный мониторинг — это не просто сбор метрик; это получение уведомлений, когда что-то идет не так. Prometheus имеет мощную встроенную систему оповещений (alerting system), которая позволяет определять условия оповещения, используя тот же язык запросов PromQL, который вы используете для построения графиков. Когда условие оповещения выполняется, оно переходит в состояние "срабатывания" (firing).

В этой лабораторной работе вы изучите основы оповещений Prometheus. Вы начнете с предварительно настроенной среды, в которой запущены Prometheus и Node Exporter. Ваша задача будет заключаться в создании отдельного файла правил оповещения, определении правила для обнаружения высокой загрузки ЦП (CPU usage), настройке Prometheus для загрузки этого файла и, наконец, симуляции высокой нагрузки на ЦП, чтобы увидеть, как ваше оповещение срабатывает в интерфейсе Prometheus UI.

Понимание среды оповещения

На этом шаге вы ознакомитесь с лабораторной средой. Скрипт настройки уже запустил для вас два Docker-контейнера: один для Prometheus и один для Node Exporter.

Сначала давайте убедимся, что оба контейнера запущены. Откройте терминал и выполните команду docker ps:

docker ps

Вы должны увидеть вывод, похожий на следующий, где контейнеры prometheus и node-exporter находятся в состоянии "Up" (Запущен).

CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                       NAMES
...            prom/prometheus                 "/bin/prometheus --c…"   15 seconds ago   Up 14 seconds   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus
...            prom/node-exporter               "/bin/node_exporter …"   16 seconds ago   Up 15 seconds   0.0.0.0:9100->9100/tcp, :::9100->9100/tcp   node-exporter

Контейнер node-exporter предоставляет метрики о хостовой системе (нашей лабораторной VM), а контейнер prometheus настроен на сбор (scraping) этих метрик.

Теперь давайте проверим веб-интерфейс Prometheus (Prometheus UI). Чтобы получить к нему доступ:

  1. В интерфейсе LabEx нажмите кнопку + (New Tab / Новая вкладка) на верхней панели навигации.
  2. Выберите Web Service из выпадающего меню.
  3. Введите 9090 в качестве номера порта.
  4. Нажмите Open (Открыть), чтобы запустить веб-интерфейс Prometheus.

Когда откроется новая вкладка, вы должны увидеть стартовую страницу браузера выражений Prometheus (Prometheus Expression Browser). Перейдите в Status (Состояние) -> Targets (Цели) в верхнем меню навигации. Вы должны увидеть, что у задания (job) node_exporter отображается зеленый статус "UP", что подтверждает успешный сбор данных Prometheus с него. Эта связь является основой для нашего правила оповещения.

Prometheus Targets UI

Создание файла alert-rules.yml для оповещения о высоком использовании ЦП

На этом шаге вы создадите выделенный файл для ваших правил оповещения. Лучшей практикой считается хранение правил отдельно от основной конфигурации Prometheus для лучшей организации.

Мы создадим файл с именем alert-rules.yml в вашем рабочем каталоге (project directory). Используйте редактор nano для создания и редактирования файла:

nano ~/project/alert-rules.yml

Теперь скопируйте и вставьте следующее YAML-содержимое в редактор nano. Это определяет группу правил, содержащую одно оповещение, которое срабатывает при высокой загрузке ЦП.

groups:
  - name: node_alerts
    rules:
      - alert: HighCpuLoad
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 10
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "High CPU load on {{ $labels.instance }}"
          description: "CPU load is > 10% (current value: {{ $value }}%)"

Давайте разберем это правило:

  • groups: Правила организуются в группы. Все правила в группе оцениваются последовательно.
  • alert: Имя нашего оповещения, HighCpuLoad.
  • expr: Выражение PromQL, которое оценивается. Если оно возвращает значение, оповещение срабатывает. Здесь мы вычисляем процент нехолостого времени ЦП за последнюю минуту. Если он превышает 10%, условие выполняется.
  • for: Этот раздел (clause) указывает, что условие должно быть истинным в течение непрерывного периода времени (1 минута), прежде чем оповещение перейдет в состояние "Firing" (Срабатывание). Это предотвращает срабатывание оповещений из-за кратковременных всплесков.
  • annotations: Они добавляют информацию, удобную для чтения человеком, к оповещению. summary (сводка) и description (описание) являются стандартными аннотациями. Вы можете использовать шаблонные переменные, такие как {{ $labels.instance }} и {{ $value }}, чтобы включить динамические данные в сообщения о ваших оповещениях.

После вставки содержимого сохраните файл и выйдите из nano, нажав Ctrl+X, затем Y и затем Enter.

Запуск контейнера Prometheus с подключенным файлом правил

На этом шаге вы укажете Prometheus загрузить новый файл правил и перезапустите контейнер с обновленной конфигурацией.

Сначала вам необходимо отредактировать основной конфигурационный файл, prometheus.yml, чтобы включить ссылку на ваш файл правил. Откройте его с помощью nano:

nano ~/project/prometheus.yml

Добавьте директиву rule_files в раздел global. После внесения изменений файл должен выглядеть следующим образом:

global:
  scrape_interval: 15s
  rule_files:
    - "alert-rules.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["prometheus:9090"]
  - job_name: "node_exporter"
    static_configs:
      - targets: ["node-exporter:9100"]

Сохраните файл и выйдите из nano (Ctrl+X, Y, Enter).

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

docker stop prometheus
docker rm prometheus

Наконец, запустите новый контейнер Prometheus. Эта команда аналогична той, что использовалась в установочном скрипте, но включает второй флаг -v для монтирования вашего файла alert-rules.yml внутрь контейнера.

docker run -d --name prometheus -p 9090:9090 \
  --network monitoring \
  -v /home/labex/project/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /home/labex/project/alert-rules.yml:/etc/prometheus/alert-rules.yml \
  prom/prometheus

Эта команда гарантирует, что как основная конфигурация, так и правила оповещения будут доступны внутри контейнера Prometheus.

Проверка загрузки правил оповещения в интерфейсе Prometheus UI

На этом шаге вы убедитесь, что Prometheus успешно загрузил ваше новое правило оповещения.

Вернитесь на вкладку Prometheus UI в вашем браузере (или откройте новую вкладку Web Service на порту 9090, если это необходимо). Если страница не загружается, подождите несколько секунд, пока новый контейнер запустится, а затем обновите страницу.

В верхней панели навигации нажмите на пункт меню Alerts (Оповещения).

Теперь вы должны увидеть в списке ваше оповещение HighCpuLoad. Оповещение будет находиться в разделе Inactive (Неактивные), обозначенном зеленым фоном. Это ожидаемое состояние, поскольку текущая загрузка ЦП в системе низкая, и выражение оповещения (expr) оценивается как ложное.

Prometheus Inactive Alert

Важно понимать три состояния оповещения:

  • Inactive (Зеленый): Условие оповещения ложно.
  • Pending (Желтый): Условие оповещения стало истинным, но продолжительность, указанная в for, еще не прошла. Prometheus ожидает, сохранится ли условие.
  • Firing (Красный): Условие оповещения было истинным в течение всего времени, указанного в for. В производственной среде именно в этот момент Prometheus отправит оповещение в Alertmanager.

Ваше оповещение в настоящее время неактивно, что является правильным. На следующем шаге мы заставим его сработать (перейти в состояние Firing).

Имитация нагрузки для проверки срабатывания оповещения

На этом заключительном шаге вы намеренно увеличите нагрузку на ЦП системы, чтобы проверить, правильно ли срабатывает ваше оповещение.

Мы можем сгенерировать нагрузку на ЦП с помощью простого бесконечного цикла оболочки (shell loop). В вашем терминале выполните следующую команду. Символ & в конце запустит процесс в фоновом режиме, позволяя вам продолжать использовать терминал.

while true; do true; done &

Эта команда запускает процесс, который потребляет 100% одного ядра ЦП. Теперь быстро переключитесь обратно на страницу Alerts (Оповещения) в Prometheus UI (доступна через вкладку Web Service на порту 9090).

Вы увидите, как изменится состояние оповещения HighCpuLoad:

  1. Примерно через 15–30 секунд выражение оповещения станет истинным. Оповещение переместится в раздел Pending (Ожидание) и станет желтым. Это означает, что Prometheus обнаружил высокую нагрузку на ЦП, но ожидает истечения продолжительности 1m, указанной в условии for.
  2. После того как оповещение пробудет в состоянии Pending в течение одной минуты, оно переместится в раздел Firing (Срабатывание) и станет красным. Это подтверждает, что ваше правило оповещения работает как ожидалось! Вы можете развернуть оповещение, чтобы увидеть определенные вами аннотации, включая текущее значение.
Prometheus Firing Alert

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

Важно: Чтобы сохранить ресурсы сервера LabEx VM, обязательно выполните следующую команду для остановки генерации нагрузки.

kill $!

После остановки нагрузки снова посмотрите на Prometheus UI. Вскоре оповещение вернется в состояние Inactive (зеленый), завершая цикл тестирования.

Резюме

Поздравляем! Вы успешно настроили и протестировали оповещение Prometheus.

В этой лабораторной работе вы научились:

  • Структурировать правила оповещения в отдельном YAML-файле.
  • Писать выражение PromQL для определения условия оповещения о высокой загрузке ЦП.
  • Использовать аннотации (annotations) для создания информативных, удобочитаемых сообщений об оповещениях.
  • Настраивать Prometheus для загрузки файлов с правилами и перезапускать его для применения изменений.
  • Наблюдать жизненный цикл оповещения в Prometheus UI: от Inactive (Неактивно) до Pending (Ожидание) и Firing (Срабатывание).
  • Имитировать условие для срабатывания и тестирования вашего оповещения.

Это первая половина картины, связанной с оповещениями. Следующим логическим шагом, который выходит за рамки данной лабораторной работы, была бы настройка экземпляра Alertmanager. Prometheus отправлял бы срабатывающие оповещения в Alertmanager, который затем отвечал бы за дедупликацию, группировку и маршрутизацию этих оповещений в реальные каналы уведомлений, такие как электронная почта, Slack или PagerDuty.