Мониторинг поиска книг и оповещение об отказах

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

Введение

Northline Library помогает читателям находить книги, проверять наличие и просматривать бронирование. Главная страница может выглядеть исправной, когда поиск уже не работает. Ваша задача — контролировать этот результат пользователя и уведомлять команду только при длительном отказе.

Достаточно базовых навыков терминала. Библиотека, Prometheus (сбор данных и правила), Blackbox Exporter (реальные HTTP-проверки), Alertmanager (доставка уведомлений) и локальный ящик готовы. Вы изменяете два коротких YAML-файла; разработка приложения, установка, почтовый аккаунт и внешние сообщения не нужны. Все службы работают на одной учебной машине, книги вымышлены, просмотр бронирования не изменяет данные.

Используйте Library для действий читателя, Workstation для команд, Monitoring для реальных наблюдений и полученных webhook. Сайт и названия элементов остаются английскими. Каждый модуль начинается независимо.

Контроль поиска читателя

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

Пройдите путь читателя

Оставьте moon в Search the catalog и нажмите Find a book. Результаты должны содержать Moon Atlas, Available и место на полке. Откройте Moon Atlas, затем Check reservation: предварительный просмотр показывает Ready to collect: Moon Atlas. Бронирование не создаётся. Выберите Back to book, затем NORTHLINE LIBRARY. Откройте Visit, прочитайте часы работы и вернитесь через ссылку бренда.

Настоящий каталог Northline Library

Разберитесь в проверке

Перейдите в Workstation, уже находящийся в /home/labex/project/library-watch. Путь указывает на файл или каталог; этот абсолютный путь начинается с корня системы. pwd показывает текущий каталог, ls перечисляет имена, cat выводит файл:

pwd
ls
cat prometheus.yml

Здесь есть prometheus.yml, alerts.yml и watch.sh. Конфигурация описывает поведение программы. YAML использует отступы пробелами, пары key: value и дефис для элемента списка. Сохраните показанные отступы. Редактор не требуется: небольшой файл будет заменён целым блоком текста.

HTTP — протокол запросов и ответов браузера. URL содержит адрес, порт службы и путь. В Workstation 127.0.0.1 означает эту учебную машину. Порт 8081 обслуживает библиотеку; /search?q=moon запрашивает поиск с параметром q, равным moon. Оставляйте URL в кавычках в терминале, чтобы оболочка считала его одним аргументом.

Подготовленное задание library пока проверяет только главную страницу. job — именованная группа целей сбора данных. Экспортер на порту 9115 выполняет реальный запрос и возвращает probe_success: 1 при успехе, 0 при отказе. Модуль search требует содержимое Moon Atlas и Available, а не только статус HTTP 200. Prometheus собирает результат каждые 2 секунды. Отдельная метрика up говорит лишь о возможности опросить экспортер, но не доказывает успех читателя.

Выберите пользовательский путь

cat > prometheus.yml заменяет файл. <<'YAML' начинает here-document с буквальным содержимым: вставьте блок целиком, включая заключительный YAML на отдельной строке. global задаёт интервалы, rule_files указывает правила, alerting подключает подготовленную службу доставки. Сохраните эти параметры и измените модуль и цель на поиск. Метка journey: search обозначает бизнес-область.

cat > prometheus.yml <<'YAML'
global:
  scrape_interval: 2s
  evaluation_interval: 2s
rule_files:
- /home/labex/project/library-watch/alerts.yml
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['127.0.0.1:9093']
scrape_configs:
- job_name: library
  metrics_path: /probe
  params:
    module: [search]
    target: ['http://127.0.0.1:8081/search?q=moon']
  static_configs:
  - targets: ['127.0.0.1:9115']
    labels:
      journey: search
YAML

bash watch.sh reload запускает подготовленную утилиту: она проверяет синтаксис, затем просит Prometheus перечитать конфигурацию. Она не изменяет библиотеку и не подделывает наблюдения.

bash watch.sh reload

Ожидайте Configuration accepted. Через примерно 4 секунды перейдите в Monitoring. В Business probes должно быть search: healthy. При ошибке YAML вернитесь в Workstation, замените файл полным блоком и повторите загрузку. Если данные unavailable, подождите и повторите: отсутствие данных никогда не означает healthy. Не направляйте проверку на сам Monitoring.

Сравните доступность и результат

Перейдите в Workstation. fault search seconds 6 отключает только поиск на 6 реальных секунд, затем автоматически восстанавливает его. Состояние оповещения эта команда не задаёт. curl отправляет HTTP-запросы; -sS скрывает прогресс, но показывает ошибки соединения. Выполните:

bash watch.sh fault search seconds 6
curl -sS 'http://127.0.0.1:8081/search?q=moon'

В ответе появится Search is taking a break. Сервер намеренно возвращает HTTP 200: проверка только статуса пропустила бы бизнес-отказ. Сразу перейдите в Monitoring: за один интервал поиск должен стать failed, затем вернуться в healthy после восстановления. Если пропустили короткий момент, повторите те же 6 секунд. Оповещение ещё не настроено. Дождитесь healthy перед проверкой шага.

Оповещать только о длительном отказе

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

Прочитайте условие

Prometheus вычисляет правила каждые 2 секунды. probe_success{job="library",journey="search"} == 0 выбирает неудачные проверки поиска из задания library. В фигурных скобках находятся фильтры меток; == 0 выбирает отказ, а не успех. Только up контролировало бы сбор, а не читателей. Без меток могут попасть посторонние сервисы.

for: 20s требует непрерывного выполнения условия 20 секунд. pending означает, что условие есть, но ожидание ещё продолжается; firing — что нужная длительность достигнута; inactive — что условия нет. 20 секунд выбраны для короткого упражнения, а не как универсальная рекомендация для эксплуатации. Отсутствующие данные показаны в Monitoring как unavailable: это не доказательство исправности и не измеренный отказ бизнеса.

alert задаёт имя правила. severity — метка маршрутизации, annotations.summary описывает последствия для клиента. Запишите полное правило:

cat > alerts.yml <<'YAML'
groups:
- name: readers
  rules:
  - alert: CustomerJourneyFailed
    expr: probe_success{job="library",journey="search"} == 0
    for: 20s
    labels:
      severity: page
    annotations:
      summary: Readers cannot complete search
YAML
bash watch.sh reload

Ожидайте Configuration accepted. Если проверка не прошла, исправьте пробелы или знаки и перезагрузите. Последняя корректная конфигурация действует, пока новая не принята.

Перейдите в Monitoring. При исправном поиске правило должно показывать CustomerJourneyFailed: inactive (20 seconds). Локальный ящик пока должен быть пуст.

Докажите, что краткий сбой не беспокоит

Перейдите в Workstation и повторите тот же краткий отказ:

bash watch.sh fault search seconds 6

Сразу перейдите в Monitoring. Поиск отказывает, правило может ненадолго стать pending. После автоматического восстановления проверка и правило возвращаются в healthy/inactive. Ящик остаётся пустым. Полный цикл занимает около 12 секунд. Если вы уже запускали длительный отказ, старые сообщения сохранятся: сравнивайте новые события, не удаляя доказательства.

Правило firing и доставленное сообщение — разные факты. Alertmanager получает firing-оповещения, группирует их, ждёт 1 секунду для новой группы и доставляет в локальный webhook-ящик. Сбор, вычисление и доставка добавляют небольшие задержки. Не убирайте for и не снижайте все пороги лишь потому, что сообщение не мгновенное.

Получите уведомления об отказе и восстановлении

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

Наблюдайте длительный отказ

Следующий отказ длится 60 реальных секунд, оставляя время увидеть состояния. Не работает только поиск, главная страница остаётся доступной.

bash watch.sh fault search seconds 60

Перейдите в Library. Вернитесь на главную через бренд: всё выглядит нормально. Снова найдите moon. Ошибка показывает, что читатель не может пользоваться каталогом. Перейдите в Monitoring. Поиск показывает failed, правило сначала pending. Примерно через 20 секунд после первой неудачной проверки оно станет firing; затем в ящике должно появиться FIRING · CustomerJourneyFailed · search. От начала отказа отведите до 35 секунд на сбор, вычисление и доставку. Это реальные наблюдения, а не анимация прогресса.

Настоящее уведомление о длительном отказе

Если через 35 секунд ящик пуст, перейдите в Workstation и используйте команду состояния, которая ничего не изменяет:

bash watch.sh status

Посмотрите checks и alerts: unavailable означает отсутствие сбора; pending — недостаточную длительность; firing без события в ящике указывает на доставку. Перечитайте конфигурацию и перезагрузите её после исправления. Завершившийся 60-секундный отказ можно повторить. Не создавайте поддельные сообщения и не отключайте мониторинг.

Восстановите и подтвердите разрешение

Перейдите в Workstation. Ноль секунд восстанавливает поиск сразу, даже до автоматического завершения:

bash watch.sh fault search seconds 0

Перейдите в Library и повторите поиск moon с главной. Moon Atlas и Available должны вернуться. Снова откройте книгу и просмотр бронирования; Visit также должен работать.

Перейдите в Monitoring. Примерно за 10 секунд поиск станет healthy, оповещение inactive, а в ящике появится RESOLVED · CustomerJourneyFailed · search. Исходное firing-сообщение останется. resolved означает устранение этого отказа, но не гарантирует отсутствие будущих.

Восстановленная проверка и настоящее разрешение

Шаг проверяет реально доставленную пару firing/resolved и текущую работоспособность библиотеки. Также он проверяет загруженное правило на изолированных данных: исправность, краткий и длительный отказ, восстановление, отсутствие данных и посторонний отказ. Оценивание не создаёт отказов, не восстанавливает сервис и не меняет конфигурацию. Оставьте библиотеку исправной, а правило готовым к будущим сбоям.

Резюме

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