Оповещения Prometheus

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

Введение

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

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

Изучение среды оповещения

На этом этапе вы ознакомитесь с лабораторной средой. Скрипт настройки уже запустил для вас два 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 предоставляет метрики о хост-системе (нашей лабораторной виртуальной машине), а контейнер prometheus настроен на сбор (scrape) этих метрик.

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

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

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

Интерфейс целей Prometheus

Создание файла alert-rules.yml для оповещения о высокой нагрузке на CPU

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

Мы создадим файл с именем alert-rules.yml внутри вашего каталога проекта. Используйте редактор 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, которое оценивается. Если оно возвращает значение, оповещение срабатывает. Здесь мы вычисляем процент времени процессора, не находящегося в режиме ожидания (idle), за последнюю минуту. Если он превышает 10%, условие считается выполненным.
  • for: Этот параметр указывает, что условие должно быть истинным в течение определенного времени (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

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

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

На верхней панели навигации нажмите на пункт меню Alerts.

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

Неактивное оповещение Prometheus

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

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

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

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

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

Мы можем создать нагрузку на CPU с помощью простого бесконечного цикла в оболочке. В терминале выполните следующую команду. Символ & в конце запустит процесс в фоновом режиме, чтобы вы могли продолжать использовать терминал.

while true; do true; done &

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

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

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

Сработавшее оповещение Prometheus

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

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

kill $!

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

Резюме

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

В этой лабораторной работе вы узнали, как:

  • Структурировать правила оповещения в отдельном файле YAML.
  • Написать выражение PromQL для определения условия оповещения о высокой нагрузке на CPU.
  • Использовать аннотации для создания понятных сообщений об оповещениях.
  • Настроить Prometheus для загрузки файлов правил и перезапустить его для применения изменений.
  • Наблюдать за жизненным циклом оповещения в интерфейсе Prometheus: от Inactive к Pending и к Firing.
  • Смоделировать условие для запуска и тестирования вашего оповещения.

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