← КурсСамостоятельный просмотрПульт

Пара 21 / декабрь

Grafana, SLI, SLO и осмысленные алерты

Создать небольшой dashboard и объяснить порог оповещения в терминах пользователя.

Контекст

Сначала пользовательский путь, затем объясняющие ресурсы.

Создать небольшой dashboard и объяснить порог оповещения в терминах пользователя.

Dashboard — ответ на вопросы

Сначала пользовательский путь, затем объясняющие ресурсы.

01Вопрос
02Источник
03Запрос
04График / решение

Аналогия: приборная панель водителя показывает нужное для управления, не всю бухгалтерию завода.

SLI и SLO

Измерение и целевое качество формулируются отдельно.

01Пользовательский путь
02SLI: измерение
03SLO: цель + окно
04Бюджет ошибок

Аналогия: измеряем время доставки, затем договариваемся, какое время считаем приемлемым.

Алерт должен вести к действию

Уведомление требует симптома, длительности и инструкции.

01Симптом
02Условие + for
03Firing
04Runbook / действие

Аналогия: пожарная сигнализация должна вести к плану эвакуации, а не просто пищать.

Команды и наблюдения

Ubuntu / Bash, lab; затем браузер

docker compose -f compose.yaml -f compose.monitoring.yaml up -d
# Open http://127.0.0.1:3000 and the provisioned StudyPulse dashboard
python3 scripts/load.py --requests 80 --concurrency 4
docker compose stop app
# Wait for at least 30 seconds plus scrape/rule evaluation
docker compose start app

Разбор результата

Dashboard меняется; в Prometheus /alerts видны pending и firing, после запуска — восстановление.

Anonymous Viewer включён только для локального учебного Grafana. Не публикуйте этот compose в интернет. Пароль администратора задаётся локально через GRAFANA_PASSWORD.

На macOS

Grafana, SLI/SLO и алерт одинаковы. Браузер открывает localhost:3000/9090, внутренний datasource остаётся prometheus:9090.

docker compose stop app
docker compose start app
bash scripts/smoke.sh

Алерт с инструкцией

  1. Объясните четыре панели dashboard и единицы.
  2. Сформулируйте SLI predict с точным числителем/знаменателем.
  3. Остановите только app; наблюдайте переход алерта, затем восстановите.
  4. Напишите runbook из проверки target, процесса, журнала, исправления и smoke.

Что должно получиться

Определение SLI/SLO и runbook с проверенным восстановлением.

Не обещаны внешние уведомления; порог назван учебным; отсутствие данных не объявлено успехом.

Ошибка для диагностики

Dashboard показывает внутреннюю доступность, а её принимают за проверку пользовательской сети.

Симптом→Гипотеза→Проверка

Основные выводы

  1. SLI — измерение, SLO — желаемая граница на заданном окне.
  2. Чтобы условие сохранялось некоторое время перед firing.

После пары

Подготовить runbook для одного пользовательского симптома собственного проекта.

Конспект, команды и разбор →

Пара 22 / декабрь

Структурированные логи и расследование запроса

Найти событие по request_id и составить временную линию без утечки входных данных.

Контекст

Время, уровень, событие, версия и идентификатор запроса.

Найти событие по request_id и составить временную линию без утечки входных данных.

Структура события

Время, уровень, событие, версия и идентификатор запроса.

01Событие
02Контекст
03request_id
04Версия / время

Аналогия: квитанция позволяет найти заказ без фотографии всех документов клиента.

Корреляция вместо угадывания

По одному идентификатору сопоставляем ответ и запись.

01Ответ X-Request-ID
02Лог этого запроса
03Версия выпуска
04Временная линия

Аналогия: номер обращения связывает разговоры разных смен поддержки.

Конфиденциальность и сроки хранения

Больше логов не всегда означает лучшую диагностику.

01Минимальные поля
02Без секретов / payload
03Ограничение размера
04Доступ по роли

Аналогия: журнал проходной должен помогать расследованию, а не копировать содержимое всех сумок.

Команды и наблюдения

Ubuntu / Bash, lab

curl -sS -D /tmp/studypulse-headers.txt -H "Content-Type: application/json" -d '{"hours":4}' http://127.0.0.1:8000/predict
cat /tmp/studypulse-headers.txt
docker compose logs --no-log-prefix --tail 100 app > /tmp/studypulse-logs.jsonl
python3 scripts/read_logs.py /tmp/studypulse-logs.jsonl

Разбор результата

В заголовках виден X-Request-ID, в JSON-журнале — соответствующее событие, сырое hours не записано.

read_logs.py понимает только чистые JSON-строки и сообщает, если строка не подходит. Случайные секреты в вывод не копируем.

На macOS

JSON-парсер и фильтрация request_id переносимы. Не смешивайте Docker-логи приложения с macOS unified logging, это разные источники.

docker compose logs --no-log-prefix --tail 100 app > /tmp/studypulse-logs.jsonl
python3 scripts/read_logs.py /tmp/studypulse-logs.jsonl

История одного запроса

  1. Сделайте успешный и неправильный predict, сохраните два request_id.
  2. Найдите каждую запись через read_logs.py --request-id.
  3. Заполните таблицу время / версия / статус / длительность.
  4. Проверьте, не содержат ли записи тело запроса, query и лишние идентификаторы.

Что должно получиться

Две минимальные временные линии без пользовательских payload.

События сопоставлены по фактам; поля и privacy проверены.

Ошибка для диагностики

Текстовый grep по JSON используется как доказательство точного совпадения поля.

Симптом→Гипотеза→Проверка

Основные выводы

  1. Лог, потому что ID имеет высокую кардинальность.
  2. Нет; для инфраструктурной диагностики обычно достаточно минимального контекста.

После пары

Добавить к runbook перечень допустимых полей лога и правило безопасного обмена доказательствами.

Конспект, команды и разбор →