✻ Урок 13.5 · Тема 13: Финал: работа и собеседования
Пробное собеседование: инженер мониторинга
Содержание урока
Зачем это нужно
Я расскажу, как однажды на разборе меня спросили: «Алерт сработал в три ночи. Как ты поймёшь, что это не ложная тревога?» Я начал перечислять названия инструментов, а надо было идти от симптома к причине по приборам. С тех пор на такие вопросы я отвечаю маршрутом, а не списком.
Вторая роль, на которую ты можешь претендовать после курса, это инженер мониторинга (monitoring engineer, часто часть команды SRE): он настраивает сбор метрик, строит дашборды и пишет алерты, чтобы система была видна. На собеседовании на эту роль меньше говорят про генераторы нагрузки и больше про метрики, PromQL (язык запросов к метрикам, урок 7.2), алерты и чтение картины инцидента. Тебе, нагрузочнику, это пригодится: в небольших командах нагрузку и мониторинг ведёт один человек, а результат теста всё равно читают по графикам. В уроке банк из 35 вопросов (двенадцать самых быстрых вынесены в тренажёр ниже), задачи на запросы и дашборд, практическое задание вживую и самооценка.
Шаг проекта: файл ~/perf-lab/13-final/mock-monitoring.md с самооценкой и твоя шпаргалка запросов PromQL, которые ты пишешь по памяти.
Что нужно знать
- Метрики, Prometheus и модель pull: 7.1, PromQL: 7.2, Grafana: 7.3, экспортеры: 7.4, логи Loki: 7.5, алерты: 7.6.
- Теория производительности: 8.1, 8.2.
- Инцидент под нагрузкой и постмортем: 13.1.
- Техника ответа вслух, «не знаю», самооценка: 13.4: прочитай «Теорию» оттуда, она общая.
Картина целиком
Инженер мониторинга похож на диспетчера аэропорта: десятки сигналов, из которых надо быстро собрать картину. Но у диспетчера приборы готовые, а инженер сам решает, какие приборы поставить, и отвечает за то, чтобы они не врали. Главное качество здесь умение идти от симптома к причине по приборам. Интервьюер часто просит: «опиши по шагам путь от метрики до сообщения дежурному».
flowchart TD
A["Приложение<br/>отдаёт /metrics"] --> B["Prometheus<br/>забирает (scrape)"]
B --> C["Правила алертов<br/>проверяют условие"]
C --> D["Alertmanager<br/>группирует, шлёт"]
D --> E["Дежурный<br/>читает дашборд и логи"]
Метрики Prometheus забирает сам, приходя на /metrics (модель pull). Для коротких заданий, которые заканчиваются до его прихода, есть Pushgateway: приёмник, куда задание само отправляет метрики. В «Магазине» он не нужен. Пять звеньев, и каждое может сломаться. Приложение не отдаёт метрику, Prometheus не достучаться, правило ошиблось в условии, Alertmanager заглушил, человек не заметил. Хороший ответ на «что может пойти не так с алертингом» проходит по этой цепочке.
Теория
Чего ждёт интервьюер
Нанимающий проверяет три вещи. Знаешь ли ты модель метрик: типы (счётчик, измеритель, гистограмма) и метки (labels). Умеешь ли читать и писать запросы PromQL и объяснять их по частям. Способен ли рассуждать об алертах: что считать симптомом, какой порог, чтобы не будить людей зря и не пропустить беду.
Беседа идёт по плану: десять минут о тебе, двадцать вопросов по метрикам и Prometheus, десять задача на дашборд или запрос, десять про алерты и инциденты. Банк ниже следует тому же порядку. Технику ответа вслух, «не знаю» и самооценку мы разобрали в 13.4, здесь она та же.
Главное: на интервью проверяют модель метрик, PromQL и рассуждения об алертах.
Начнём с рамки, без которой дашборд читать страшно.
Как читать дашборд: RED и USE
Тебя просят «прочитай дашборд», и без рамки ты начнёшь метаться между панелями. Рамок две, и обе давно знакомы по уроку 7.3. RED для сервиса: Rate (сколько запросов), Errors (сколько ошибок), Duration (сколько времени, p95). USE для ресурсов: Utilization (занятость), Saturation (очередь, ожидание), Errors.
Порядок такой. Сначала RED верхнего уровня: болит ли пользователь, то есть растут ли ошибки и задержка. Потом USE: какой ресурс перегружен. Попробуй сам.
В сценарии «медленная оплата» по первым панелям причина не видна: p95 вырос, ошибок нет, ресурсы в норме, надо идти к панели оплаты. Переключай сценарии на странице демо виджетов и каждый раз проговаривай: что болит у пользователя, какой ресурс виноват, чем подтвердить.
Прикинь сам: p95 вырос с 0,3 до 2 с, доля ошибок 0%, CPU 30%. Что проверишь первым?
Ресурс не перегружен, пользователь страдает, а значит, система чего-то ждёт: пул соединений (shop_db_pool_waiting) или внешний вызов оплаты. Осторожно: «CPU в норме, значит, всё хорошо» неверно, бывают задержки без загрузки процессора.
Главное: сначала RED (болит ли пользователь), потом USE (какой ресурс виноват).
Рамка есть, теперь запросы, которые просят написать.
Как писать PromQL вслух
Просят «напиши запрос», и главное не молчать. Говори по шагам: «Метрика такая, это счётчик, значит, беру rate за пять минут. Нужны ошибки, фильтрую по метке status. Суммирую по маршруту». Частые ошибки: rate от гистограммы без histogram_quantile; sum до rate (после перезапуска одного экземпляра сумма «проваливается», и rate принимает это за сброс: сначала rate, потом sum); забытое by (le) в квантиле. Проговаривание показывает, что ты понимаешь, а не вспоминаешь шаблон.
Учить запросы как стихи не надо: держи в голове четыре вопроса. «Сколько запросов и куда?», «Какая доля ломается?», «Насколько медленно?», «Кто стоит в очереди?» К каждому свой шаблон:
# RPS по маршрутам
sum by (route) (rate(http_requests_total[5m]))
# Доля ошибок 5xx
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
# p95 задержки
histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
# Очередь за соединением БД
shop_db_pool_waiting
rate(...[5m]) берёт счётчик за пять минут и делает скорость в секунду. sum by (route) складывает серии, оставляя метку route. Выражение 5.. в status=~ ловит три символа, начинающиеся с пятёрки. В histogram_quantile корзины (бакеты) складываются по метке le, иначе квантиль считать не из чего.
Главное: называй метрику, тип, функцию и фильтр по очереди, а не вспоминай запрос целиком.
Запросы есть, значит, можно решать, на какие из них вешать алерты.
Алерты: симптом или причина
Тебя спросят: «Какие алерты ты поставишь на сервис?» Хороший ответ различает симптомные алерты (пользователь страдает: ошибки, задержка) и причинные (ресурс подходит к пределу: пул, диск, память). Симптомные будят человека, причинные чаще предупреждают днём. Пример на «Магазине»:
| Алерт | Тип | Условие | for | Реакция |
|---|---|---|---|---|
| Доля 5xx выше 5% | симптом | sum(rate(...{status=~"5.."}[5m])) / sum(rate(...[5m])) > 0.05 |
2 мин | Страница дежурному |
| p95 каталога выше 1 с | симптом | histogram_quantile(...) > 1 |
5 мин | Страница |
| Очередь за пулом растёт | причина | shop_db_pool_waiting > 0 |
1 мин | Сообщение в канал |
| Оплата медленнее 1 с | причина | p95 shop_payment_duration_seconds выше 1 с |
5 мин | Сообщение в канал |
Параметр for задаёт, сколько условие должно держаться, прежде чем алерт сработает. Очередь пула сама не «мигает», ей хватает минуты, а задержка и доля ошибок скачут, им нужно две-пять. Он убирает ложные срабатывания от коротких всплесков. Слишком длинный for задерживает обнаружение, слишком короткий превращает алерт в шум. Хороший алерт отвечает дежурному на четыре вопроса: что случилось, кого касается, куда смотреть, что делать (ссылка на инструкцию).
Осторожно: «много алертов значит надёжно». Много алертов дают усталость от алертов (alert fatigue): люди перестают реагировать. Пять осмысленных лучше пятидесяти шумных.
Главное: будят людей симптомами, а причины идут днём и в канал.
Остаётся ловушка, на которой проверяют опыт.
Кардинальность и три источника сигнала
Добавь метку user_id в счётчик запросов при миллионе пользователей, и Prometheus заведёт миллион серий и упрётся в память. Кардинальность (cardinality) это число уникальных сочетаний значений меток. Поэтому в метках держат ограниченные значения (route, method, status), а идентификаторы живут в логах и трассах.
Три источника дополняют друг друга. Метрики отвечают «сколько и когда» и годятся для алертов. Логи отвечают «что именно произошло» с конкретным запросом. Трассы показывают путь запроса через сервисы и время на каждом участке (урок 7.7). Хороший ответ их связывает: по метрике видишь рост ошибок, по логам с request_id находишь запросы, а по trace_id из лога открываешь трейс.
Главное: в метках только ограниченные значения, идентификаторы идут в логи и трассы.
Теперь самый частый вопрос: расскажи про инцидент.
Как рассказывать про инцидент
«Расскажи про сбой, который ты разбирал»: у тебя есть материал из урока 13.1. Схема: что видели (симптом с цифрой), как нашли причину (метрики, потом логи), что сделали (сначала смягчение, потом исправление), чему научились (действия постмортема). Рассказывай без обвинений: «замедлилась оплата», а не «кто-то сломал». Это тоже проверка зрелости.
Распродажа близко, и я прошу тебя повторить эту схему вслух на своём инциденте, пока не уложишься в две минуты. Отдельно считай блок задач: если «плывёшь» в PromQL, вернись к уроку 7.2 и напиши десять запросов руками на живом Prometheus.
Вопросы по мониторингу, таймер 40 секунд: ответы чуть длиннее, чем в нагрузочных.
Практика
1. Файл самооценки
cd ~/perf-lab/13-final
cat > mock-monitoring.md <<'EOF'
# Самооценка: собеседование по мониторингу
Шкала: 2 = уверенно за 30-90 с с цифрой, 1 = путался, 0 = не смог.
| Блок | Вопросы | Баллы | Что повторить |
| --- | --- | --- | --- |
| A. Основы метрик | 1-6 | | |
| B. Prometheus и PromQL | 7-12 | | |
| C. Grafana и экспортеры | 13-17 | | |
| D. Логи и алерты | 18-23 | | |
| E. Инциденты и процесс | 24-27 | | |
| F. Задачи | 28-34 | | |
| G. Практика работы | 35 | | |
EOF
2. Шпаргалка запросов: напиши руками
Подними стенд с мониторингом (если не поднят) и открой Prometheus по адресу http://localhost:9090. Запусти нагрузку на минуту, чтобы были данные:
cd ~/learning/load-tester/project/shop && docker compose --profile monitoring up -d --wait
source ~/perf-lab/.venv/bin/activate
locust -f ~/perf-lab/09-locust/locustfile.py --host http://localhost:8000 --headless -u 5 -r 1 -t 3m --only-summary
В это время вбей в Prometheus по очереди запросы из теории и убедись, что каждый возвращает данные. Затем без подглядывания напиши по памяти запросы для задач ниже и проверь. Сохрани рабочие в файл:
cat > ~/perf-lab/13-final/promql-cheatsheet.md <<'EOF'
# PromQL: рабочие запросы по стенду
- RPS по маршрутам: sum by (route) (rate(http_requests_total[5m]))
- Доля 5xx: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
- p95 задержки: histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
- Очередь за соединением: shop_db_pool_waiting
- Доля попаданий в кэш: sum(rate(shop_cache_requests_total{result="hit"}[5m])) / sum(rate(shop_cache_requests_total[5m]))
- Оплата, p95: histogram_quantile(0.95, sum by (le) (rate(shop_payment_duration_seconds_bucket[5m])))
EOF
Одиночные фигурные скобки в запросах Jekyll не мешают, а двойных здесь нет. Как читать: если запрос вернул «Empty query result», проверь имя метрики (автодополнение в Prometheus) и окно: за последние секунды данных может быть мало.
Типичные ошибки: parse error: unexpected значит пропущена скобка или кавычка; many-to-many matching not allowed значит при делении двух запросов метки не совпали (добавь sum с by или on(...)); квантиль выдаёт NaN, когда нет запросов в окне.
3. Практическое задание вживую: прочитай дашборд
Открой дашборд Grafana «Магазин: обзор (эталон)» (http://localhost:3000, вход без пароля). Включи вживую нагрузку и измени задержку оплаты (команда из 13.1: curl -X POST ... /admin/config с delay_ms). Затем без бумажки, вслух, как на собеседовании, проговори за 2 минуты: что болит у пользователя (RED), какой ресурс перегружен (USE), чем подтверждаешь, что сделал бы. Запиши себя на диктофон и прослушай.
# вернуть оплату в норму после упражнения
curl -s -X POST http://localhost:8001/admin/config -H 'content-type: application/json' -d '{"delay_ms": 50, "fail_rate": 0}'
4. Разбери плохой алерт
Задание: ниже описание алерта «из прошлой жизни». Найди проблемы и перепиши:
Алерт «CPU высокий»: node_cpu загружен выше 70% в течение 10 секунд. Шлёт в личку всем 12 инженерам. Описание: «CPU».
Проблемы: условие причинное, а не симптом, без for нормального (10 секунд это шум), нет понятия «что делать», описание пустое, получатели все сразу. Исправление: основной алерт на симптом (доля 5xx или p95), CPU как предупреждение с for: 15m в канал, в аннотации ссылка на инструкцию и дашборд, маршрутизация на дежурного. Напиши свою версию в mock-monitoring.md.
5. Пройди банк вопросов
Дальше идёт банк. Проговаривай вслух, потом сверяйся. Отмечай баллы. Два-три блока за сессию.
6. Итоговая сессия
Через день-два сделай сессию на время: десять случайных вопросов виджетом, по 40 секунд, и запиши итог:
echo "$(date +%F): сессия на время, мониторинг, знал 8 из 10, слабое: кардинальность" >> ~/perf-lab/13-final/mock-monitoring.md
Сломай и почини
- Молчаливый алерт. Создай правило, которое никогда не срабатывает: в запросе опечатка в имени метрики (
http_request_totalвместоhttp_requests_total). Правило в Prometheus будет «здорово», алерта нет. Урок: алерт, который не срабатывает, не отличить от здоровой системы. Лечение: тест правила на заведомо плохих данных и алерт на отсутствие метрики (absent(...)). - Ложные срабатывания. Поставь порог p95 на 100 мс с
for: 0. Запусти нагрузку: правило будет мигать при каждом всплеске. Поднимиforдо 5 минут и сравни: шум пропал, обнаружение задержалось ровно на пять минут. Это и есть компромисс. - Взрыв кардинальности. В тетради посчитай: метрика с метками
route(10 значений),method(3),status(5): до 150 серий, нормально. Добавь меткуuser_id(1000 пользователей): 150 000 серий. Объясни вслух, почему это плохо и где хранить идентификаторы. - Путаница rate и значения. Построй график
http_requests_totalбезrate: счётчик растёт монотонно и ничего не говорит. Оберни вrate(...[5m])и сравни. Запомни: счётчик безrateсмотрят редко.
Сначала сам прочти график или ответ вслух по схеме урока, потом попроси нейросеть задать уточняющие вопросы интервьюера. Её эталонный ответ сверь с теорией курса и со своими запросами в Prometheus.
ИИ в помощь
Нейросеть хороша как тренажёр и проверяющий запросов PromQL, но эталонные ответы у неё бывают ошибочными. Общие правила: ИИ-помощник.
Задача: провести пробное собеседование по мониторингу.
Ты технический интервьюер на позицию junior-инженера по мониторингу. Я знаю: метрики и их типы, Prometheus и PromQL,
Grafana, Loki, алерты, SLO, кардинальность меток. Задавай по одному вопросу, потом давай разбор: что было верно,
чего не хватило, и одно уточнение. Включи две задачи на запрос PromQL и одну на чтение графика
(опиши график словами). После 8 вопросов дай итог по шкале 0-1-2 по каждому блоку.
Проверь ответ: все запросы из «правильных» ответов выполни в Prometheus на стенде. Типичные ошибки: rate() от значения, которое не счётчик, histogram_quantile без by (le), придуманные имена метрик и устаревшее «Grafana 8» в описании интерфейса.
Задача: пересказать собственный разбор инцидента для собеседования.
Вот краткий конспект моего разбора учебного инцидента: <вставь 5-8 строк: симптом, как нашёл, причина, исправление, урок>.
Задай мне вопросы, как скептичный интервьюер, чтобы найти пробелы. Не придумывай деталей, которых нет в конспекте,
и не называй причину за меня.
Проверь ответ: ответь на вопросы вслух, и если не нашлось ответа в твоих данных, вернись к уроку 13.1 и дополни конспект. Типичная ошибка: слишком общие вопросы без привязки к твоему случаю.
Данные реальных рабочих систем в тренировку не вставляй: на собеседовании о прошлой работе говори в общих чертах.
Словарик урока
| Термин | Простыми словами |
|---|---|
| Инженер мониторинга | Специалист, который строит и поддерживает сбор метрик, дашборды и алерты. |
| RED | Три показателя сервиса: запросы, ошибки, время. |
| USE | Три показателя ресурса: занятость, очередь, ошибки. |
| Кардинальность | Число уникальных серий метрики; растёт с числом значений меток. |
| Симптомный алерт | Срабатывает, когда страдает пользователь (ошибки, задержка). |
| Причинный алерт | Срабатывает, когда ресурс подходит к пределу; предупреждает заранее. |
for |
Время, которое условие алерта должно держаться до срабатывания. |
| Alert fatigue | Усталость от шумных алертов, из-за которой их перестают замечать. |
| Тишина (silence) | Временное подавление алерта в Alertmanager, например на время работ. |
| Runbook | Инструкция дежурного для типового алерта. |
Вопросы с собеседований
Раздел для повторения: ответь вслух, потом открой ответ. Блоки идут от простого к сложному; блок F это задачи. Баллы записывай в mock-monitoring.md.
Блок A. Основы метрик
1. [junior] [часто] Какие типы метрик есть в Prometheus?
Ответ
Counter (только растёт: запросы, ошибки), gauge (растёт и падает: память, очередь), histogram (распределение по бакетам: время ответа) и summary (квантили на стороне приложения). Для задержек обычно берут гистограмму, потому что её можно агрегировать по сервисам.
Что хотят услышать: четыре типа с примерами и применение.
Красный флаг: «метрики бывают числовые и текстовые».
2. [junior] [часто] Чем метрики отличаются от логов и трасс?
Ответ
Метрики: числа во времени, дёшево, для алертов и трендов. Логи: события с деталями, для разбора конкретного случая. Трассы: путь одного запроса через сервисы со временем на каждом участке. Дополняют друг друга: по метрике вижу, что ошибки выросли, по логам с request_id читаю причину, по trace_id открываю трейс и вижу, где запрос потерял время.
Что хотят услышать: три источника и связка между ними.
Красный флаг: «логи заменяют метрики».
3. [junior] Что такое label?
Ответ
Пара «ключ=значение», которая делит метрику на серии: http_requests_total{route="/api/orders", status="200"}. Позволяет фильтровать и группировать. Важно держать набор значений ограниченным.
Что хотят услышать: пример и осторожность с количеством значений.
Красный флаг: метка с идентификатором пользователя.
4. [junior] Что такое кардинальность и чем она опасна?
Ответ
Число уникальных серий метрики. Если в метку попадают значения с неограниченным набором (id пользователя, адрес), серий становятся миллионы, Prometheus упирается в память и замедляется. Идентификаторы хранят в логах и трассах.
Что хотят услышать: пример и последствие.
Красный флаг: не знать понятия.
5. [junior] Pull или push: как Prometheus получает метрики?
Ответ
Pull: Prometheus сам ходит за метриками на /metrics с интервалом (scrape interval). Плюс: сразу видно, что цель недоступна (метрика up равна 0). Push нужен для коротких заданий, которые не успеют быть опрошены (Pushgateway).
Что хотят услышать: модель pull и метрика up.
Красный флаг: «приложение само отправляет метрики».
6. [на скорость] Что такое scrape interval?
Ответ
Как часто Prometheus забирает метрики: в нашем стенде 5 секунд. От него зависит, насколько мелкие события видны и какое окно брать для rate.
Что хотят услышать: период опроса и связь с окном.
Красный флаг: «секунд сколько хватит».
Блок B. Prometheus и PromQL
7. [junior] [часто] Что делает функция rate и когда она нужна?
Ответ
Берёт счётчик за окно и считает скорость роста в секунду. Нужна, потому что сам счётчик монотонно растёт и ничего не говорит. Пример: rate(http_requests_total[5m]) даёт запросы в секунду за последние пять минут.
Что хотят услышать: смысл и пример.
Красный флаг: строить график счётчика без rate.
8. [junior] Как посчитать долю ошибок?
Ответ
Делю скорость ошибочных запросов на скорость всех: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])). Регулярное выражение 5.. берёт статусы 5xx.
Что хотят услышать: деление двух rate, фильтр по статусу.
Красный флаг: делить счётчики без rate.
9. [middle] [часто] Как посчитать p95 задержки из гистограммы?
Ответ
histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m]))). Сначала rate по бакетам, затем суммирование с сохранением метки le, затем квантиль. Точность зависит от границ бакетов: p95 не может быть точнее ширины бакета.
Что хотят услышать: порядок rate, sum by (le), квантиль, ограничение точности.
Красный флаг: забыть by (le).
10. [middle] Чем sum by отличается от sum without?
Ответ
sum by (route) оставляет только перечисленные метки и складывает остальное. sum without (instance) убирает перечисленные и оставляет все остальные. Выбор зависит от того, что короче: перечислить нужное или лишнее.
Что хотят услышать: различие и пример.
Красный флаг: считать их синонимами.
11. [middle] Чем rate отличается от irate и increase?
Ответ
rate: средняя скорость за окно, гладкая, подходит для алертов и графиков. irate: скорость по последним двум точкам, резкая, для быстрых колебаний. increase: прирост за окно (в штуках, а не в секунду).
Что хотят услышать: три функции и когда какая.
Красный флаг: использовать irate в алертах.
12. [на скорость] Что показывает метрика up?
Ответ
1, если Prometheus успешно забрал метрики с цели, 0, если нет. Основа проверки «живы ли источники».
Что хотят услышать: смысл 0 и 1.
Красный флаг: «аптайм сервиса».
Блок C. Grafana и экспортеры
13. [junior] Что такое экспортер и зачем он?
Ответ
Программа, которая берёт данные из системы, не умеющей отдавать метрики Prometheus (ОС, база), и публикует их на /metrics. Примеры из стенда: node-exporter (хост), cAdvisor (контейнеры), postgres-exporter (база).
Что хотят услышать: назначение и примеры.
Красный флаг: «плагин Grafana».
14. [junior] Как выбрать, какие панели нужны на дашборде?
Ответ
По RED для сервиса (запросы, ошибки, p95) и USE для ресурсов (CPU, память, пул БД). Сверху то, что болит у пользователя, ниже причины. Каждая панель отвечает на вопрос, а не просто «красиво».
Что хотят услышать: рамка и порядок.
Красный флаг: «все метрики, какие есть».
15. [middle] Чем опасно среднее на дашборде?
Ответ
Прячет хвост: p95 может быть в разы хуже среднего. Для задержек показываю p50, p95, p99. Для ресурсов смотрю пики, а не только среднее по окну.
Что хотят услышать: пример, перцентили.
Красный флаг: «среднее достаточно».
16. [middle] Что значит «дашборд врёт»?
Ответ
Бывает: окно rate слишком большое и сглаживает всплески; неверная единица на оси; агрегация скрывает выбросы; данные не успели прийти. Проверяю запрос панели, окно, единицы и сверяю с независимым источником (логи).
Что хотят услышать: список причин и проверка.
Красный флаг: «цифрам с дашборда верю всегда».
17. [на скорость] Что такое переменная дашборда?
Ответ
Список значений (сервис, маршрут), которым переключается дашборд без правки запросов.
Что хотят услышать: переиспользование дашборда.
Красный флаг: «настройки интерфейса».
Блок D. Логи и алерты
18. [junior] [часто] Какие алерты ты поставишь на веб-сервис?
Ответ
Симптомные: доля 5xx выше порога и p95 выше SLO, с for несколько минут, будят дежурного. Причинные: очередь за пулом, оплата медленнее нормы, диск и память, уходят в канал. Плюс алерт на живость целей (up).
Что хотят услышать: разделение симптом и причина, for.
Красный флаг: «CPU выше 80%» как единственный алерт.
19. [junior] Что делает параметр for?
Ответ
Условие должно держаться заданное время, прежде чем алерт сработает. Убирает ложные срабатывания от коротких всплесков, но задерживает обнаружение на это же время.
Что хотят услышать: компромисс.
Красный флаг: «не нужен».
20. [middle] Зачем нужен Alertmanager?
Ответ
Группирует похожие алерты в одно сообщение, подавляет дубли, маршрутизирует по командам и каналам, поддерживает тишину и подавление (inhibition: не слать «сервис не отвечает», если уже сработал «сервер недоступен»).
Что хотят услышать: группировка, маршрутизация, тишина.
Красный флаг: «просто отправляет письма».
21. [middle] Что такое alert fatigue и как с ней бороться?
Ответ
Усталость от слишком частых и бесполезных алертов: люди перестают реагировать, и настоящий пропускают. Борьба: убирать шум, оставлять алерты, требующие действия, группировать, настраивать for, ссылаться на инструкцию.
Что хотят услышать: признаки и меры.
Красный флаг: «больше алертов безопаснее».
22. [middle] Как ты ищешь причину по логам в Loki?
Ответ
Сужаю по меткам ({service="shop", level="ERROR"}), по времени из метрики, потом по request_id смотрю цепочку одного запроса. Для всплеска считаю частоту сообщений. Из логов читаю точный текст ошибки, например про исчерпанный пул.
Что хотят услышать: метки, время, request_id.
Красный флаг: «открываю файл и читаю всё».
23. [на скорость] Что должно быть в описании хорошего алерта?
Ответ
Что случилось, кого касается, куда смотреть (ссылка на дашборд), что делать (ссылка на инструкцию).
Что хотят услышать: четыре пункта.
Красный флаг: «название алерта».
Блок E. Инциденты и процесс
24. [middle] [часто] Расскажи, как ты разбирал инцидент.
Ответ
По схеме: что видели (симптом с цифрой), как нашли причину (метрики, логи), что сделали (смягчение, затем исправление), чему научились (действия постмортема с владельцами). Без поиска виноватых: «замедлилась оплата, пул исчерпался, нет алерта на очередь».
Что хотят услышать: хронология, цифры, действия, культура без обвинений.
Красный флаг: «нашёл виноватого».
25. [middle] С чего начнёшь, если ночью сработал алерт?
Ответ
Оцениваю влияние на пользователя (RED), выбираю смягчение, если оно безопасно (откат, отключение функции), сообщаю статус, ищу причину по метрикам и логам. Причину не называю, пока она не подтверждена. Записываю хронологию по ходу.
Что хотят услышать: сначала влияние и смягчение, потом причина.
Красный флаг: «сразу лезу в код».
26. [middle] Что такое SLO и бюджет ошибок?
Ответ
SLO это цель по качеству (например, 99,5% успешных запросов). Бюджет ошибок это допустимая доля сбоев (0,5%). Если бюджет израсходован, приоритет сдвигается к надёжности, а не новым функциям.
Что хотят услышать: связь с решениями.
Красный флаг: путать с SLA как с юридическим договором без пояснения.
27. [на скорость] Что такое runbook?
Ответ
Инструкция дежурного для типового алерта: что значит, куда смотреть, что делать, кому эскалировать.
Что хотят услышать: практичность.
Красный флаг: «описание проекта».
Блок F. Задачи
28. [middle] Задача: напиши запрос RPS по маршрутам за 5 минут.
Ответ
sum by (route) (rate(http_requests_total[5m])). Проговариваю: счётчик, значит rate по окну пять минут, суммирую по маршрутам.
Что хотят услышать: rate, sum by, пояснение по шагам.
Красный флаг: sum вместо rate.
29. [middle] Задача: напиши запрос доли попаданий в кэш.
Ответ
sum(rate(shop_cache_requests_total{result="hit"}[5m])) / sum(rate(shop_cache_requests_total[5m])). Если доля падает, кэш не помогает: проверяю ключи и время жизни.
Что хотят услышать: деление двух rate.
Красный флаг: брать значения счётчиков без rate.
30. [middle] Задача: p95 вырос, ошибок нет, RPS стал меньше. Что скажешь?
Ответ
Признаки зависимости или очереди: запросы стоят и ждут, поэтому RPS падает. Проверю панель оплаты (shop_payment_duration_seconds), shop_db_pool_waiting, запросы в работе (http_requests_in_progress). Ошибок нет, потому что до таймаута не дошло.
Что хотят услышать: вывод из сочетания, список проверок.
Красный флаг: «добавить серверов».
31. [middle] Задача: при 20 RPS соединение занято 0,5 с, в пуле 5. Хватит ли пула?
Ответ
Пропускная способность пула 5 / 0,5 = 10 в секунду. Приходит 20, значит нет: очередь растёт. Нужно уменьшить время удержания, увеличить пул (проверив лимит базы) или ограничить поток. Алерт поставлю на shop_db_pool_waiting.
Что хотят услышать: закон Литтла, число, варианты.
Красный флаг: «пул хватит, 5 больше 0,5».
32. [middle] Задача: алерт срабатывает каждые 10 минут и сам проходит. Что делаешь?
Ответ
Смотрю график метрики за сутки: это настоящий всплеск или шум? Если шум, увеличиваю for и проверяю окно rate. Если настоящий, ищу причину периодичности (задание по расписанию, сборка мусора). Если алерт не требует действий, превращаю его в предупреждение или убираю.
Что хотят услышать: анализ данных, а не «заглушить».
Красный флаг: «просто отключу».
33. [middle] Задача: нужно измерять время запроса по пользователям. Предлагают метку user_id. Что ответишь?
Ответ
Нет: кардинальность взорвётся (тысячи пользователей на десятки маршрутов дадут сотни тысяч серий). Для общей картины метрики по маршрутам, для конкретного пользователя логи с идентификатором или трассы. Если нужна сегментация, ввожу ограниченную метку вроде тарифа.
Что хотят услышать: расчёт серий, альтернатива.
Красный флаг: «добавить метку и всё».
34. [middle] Задача (разбор отчёта): отчёт показывает среднюю задержку 120 мс и вывод «всё хорошо». Что скажешь?
Ответ
Среднее прячет хвост. Попрошу p95 и p99, распределение по маршрутам и ошибки. Если p95 около секунды, каждый двадцатый запрос медленный, хотя среднее красивое. Вывод по среднему недоказателен.
Что хотят услышать: перцентили, запрос данных.
Красный флаг: «среднее 120 мс, значит всё хорошо».
Блок G. Практика работы
35. [junior] Как ты используешь ИИ в работе с мониторингом?
Ответ
Как помощника для черновиков и объяснений: просить разобрать незнакомую метрику или ошибку, набросать запрос PromQL или правило алерта, найти слабые места в тексте runbook. Всегда даю контекст: версию, список реальных имён метрик, точный вывод. Секреты, токены и данные пользователей в запрос не попадают. Ответ проверяю в Prometheus: запрос должен вернуть ряд, а имя метрики существовать (нейросети любят придумывать имена). Алерт проверяю через promtool check rules и на тестовой нагрузке. Что не понимаю, не внедряю.
Что хотят услышать: конкретные задачи, проверка запросов на реальных данных, защита данных.
Красный флаг: внедрить запрос или алерт из ответа без проверки, вставка рабочих логов и токенов в публичный чат.
Проверено на версиях
Prometheus 3.15, Alertmanager 0.34, Grafana 13.2, Loki 3.7, стенд «Магазин» из project/shop. Запросы проверяй на своём стенде: имена метрик взяты из project/shop/README.md. Октябрь 2026.
Итог урока: ты умеешь
- Отвечать на вопросы по метрикам, Prometheus и алертам вслух за 30-90 секунд.
- Читать дашборд по рамкам RED и USE и проговаривать вывод.
- Написать по памяти запросы: RPS, доля ошибок, p95, доля попаданий в кэш.
- Различать симптомные и причинные алерты и объяснять
for. - Объяснить кардинальность и почему идентификатор пользователя нельзя в метку.
- Рассказать про разбор инцидента без поиска виноватых.
- Оценить себя по шкале 0-1-2 и составить план повторения.
- Использовать нейросеть как интервьюера и проверять её запросы PromQL в Prometheus.
Ты прошёл курс. Дальше: возвращайся к слабым блокам, повторяй вслух, выполняй тестовые задания и откликайся на вакансии. Возвращайся на главную страницу курса.
Проверь себя
Короткий тест по уроку: 10 вопросов из банка в 40. Засчитывается только полностью правильный ответ, порог 60%. Каждая новая попытка даёт другие вопросы, пока банк не закончится. Ответы видны после проверки.
Тест работает с включённым JavaScript.