Введение
Эффективный мониторинг — это не просто сбор метрик; это получение уведомлений, когда что-то идет не так. 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). Чтобы получить к нему доступ:
- В интерфейсе LabEx нажмите кнопку
+(New Tab / Новая вкладка) на верхней панели навигации. - Выберите Web Service из выпадающего меню.
- Введите
9090в качестве номера порта. - Нажмите Open (Открыть), чтобы запустить веб-интерфейс Prometheus.
Когда откроется новая вкладка, вы должны увидеть стартовую страницу браузера выражений Prometheus (Prometheus Expression Browser). Перейдите в Status (Состояние) -> Targets (Цели) в верхнем меню навигации. Вы должны увидеть, что у задания (job) node_exporter отображается зеленый статус "UP", что подтверждает успешный сбор данных Prometheus с него. Эта связь является основой для нашего правила оповещения.

Создание файла 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) оценивается как ложное.

Важно понимать три состояния оповещения:
- Inactive (Зеленый): Условие оповещения ложно.
- Pending (Желтый): Условие оповещения стало истинным, но продолжительность, указанная в
for, еще не прошла. Prometheus ожидает, сохранится ли условие. - Firing (Красный): Условие оповещения было истинным в течение всего времени, указанного в
for. В производственной среде именно в этот момент Prometheus отправит оповещение в Alertmanager.
Ваше оповещение в настоящее время неактивно, что является правильным. На следующем шаге мы заставим его сработать (перейти в состояние Firing).
Имитация нагрузки для проверки срабатывания оповещения
На этом заключительном шаге вы намеренно увеличите нагрузку на ЦП системы, чтобы проверить, правильно ли срабатывает ваше оповещение.
Мы можем сгенерировать нагрузку на ЦП с помощью простого бесконечного цикла оболочки (shell loop). В вашем терминале выполните следующую команду. Символ & в конце запустит процесс в фоновом режиме, позволяя вам продолжать использовать терминал.
while true; do true; done &
Эта команда запускает процесс, который потребляет 100% одного ядра ЦП. Теперь быстро переключитесь обратно на страницу Alerts (Оповещения) в Prometheus UI (доступна через вкладку Web Service на порту 9090).
Вы увидите, как изменится состояние оповещения HighCpuLoad:
- Примерно через 15–30 секунд выражение оповещения станет истинным. Оповещение переместится в раздел Pending (Ожидание) и станет желтым. Это означает, что Prometheus обнаружил высокую нагрузку на ЦП, но ожидает истечения продолжительности
1m, указанной в условииfor. - После того как оповещение пробудет в состоянии Pending в течение одной минуты, оно переместится в раздел Firing (Срабатывание) и станет красным. Это подтверждает, что ваше правило оповещения работает как ожидалось! Вы можете развернуть оповещение, чтобы увидеть определенные вами аннотации, включая текущее значение.

Как только вы увидите срабатывание оповещения, вы можете остановить генерацию нагрузки. Вернитесь в терминал и выполните следующую команду, чтобы завершить фоновый процесс цикла:
Важно: Чтобы сохранить ресурсы сервера LabEx VM, обязательно выполните следующую команду для остановки генерации нагрузки.
kill $!
После остановки нагрузки снова посмотрите на Prometheus UI. Вскоре оповещение вернется в состояние Inactive (зеленый), завершая цикл тестирования.
Резюме
Поздравляем! Вы успешно настроили и протестировали оповещение Prometheus.
В этой лабораторной работе вы научились:
- Структурировать правила оповещения в отдельном YAML-файле.
- Писать выражение PromQL для определения условия оповещения о высокой загрузке ЦП.
- Использовать аннотации (
annotations) для создания информативных, удобочитаемых сообщений об оповещениях. - Настраивать Prometheus для загрузки файлов с правилами и перезапускать его для применения изменений.
- Наблюдать жизненный цикл оповещения в Prometheus UI: от Inactive (Неактивно) до Pending (Ожидание) и Firing (Срабатывание).
- Имитировать условие для срабатывания и тестирования вашего оповещения.
Это первая половина картины, связанной с оповещениями. Следующим логическим шагом, который выходит за рамки данной лабораторной работы, была бы настройка экземпляра Alertmanager. Prometheus отправлял бы срабатывающие оповещения в Alertmanager, который затем отвечал бы за дедупликацию, группировку и маршрутизацию этих оповещений в реальные каналы уведомлений, такие как электронная почта, Slack или PagerDuty.



