Стройте ответ вокруг владения состоянием, лимитов, отказа и восстановления. Определение становится инженерным ответом только в конкретном production-сценарии.
Вопросы и ответы
11 подробных ответов
01Что такое SLI, SLO, SLA и error budget? Покажите расчёт бюджета.
concept
Короткий ответ: SLI — измеряемый показатель: доля хороших событий от всех. SLO — внутренняя цель по SLI на окне (99.9% за 30 дней). SLA — внешний контракт с клиентом, где за нарушение платят штрафами. Error budget = 1 − SLO: доля «разрешённых» ошибок, которую можно тратить.
Подробно:
| Термин | Что это | Пример |
|---|---|---|
| SLI | измеренное отношение: good events / total | доля запросов < 300 мс без 5xx |
| SLO | внутренняя цель на окне | 99.9% за 30 дней |
| SLA | внешний договор со штрафами | 99.5%, иначе кредиты клиенту |
| Error budget | 1 − SLO | 0.1% допустимых ошибок |
SLO 99.9% за 30 дней: 30 × 24 × 60 = 43 200 мин
бюджет = 0.1% × 43 200 ≈ 43.2 мин даунтайма в месяц
SLO 99.99% ≈ 4.4 мин в месяц
SLO всегда строже SLA: внутренняя цель должна срабатывать раньше, чем контрактные штрафы.
⚠️ Частая ошибка: называть SLO и SLA синонимами и не знать цифр. Интервьюер ждёт именно расчёт: 99.9% в месяц ≈ 43 минуты, 99.99% ≈ 4.4 минуты.
02Error budget исчерпан в середине квартала. Что происходит на практике?
concept
Короткий ответ: Error budget — это механизм принятия решений, а не отчётная цифра. Политика согласована с продактами заранее: бюджет исчерпан → feature freeze, приоритет надёжностной работе, гейтинг релизов, пока бюджет не восстановится. Без enforcement всё это — театр.
Подробно:
- Политика подписана до инцидента — команда и продакт заранее договорились: кончился бюджет — фичи ждут. Спорить в момент исчерпания уже поздно.
- Эскалация по остатку бюджета:
| Остаток бюджета | Действие |
|---|---|
| > 50% | обычный темп релизов |
| < 25% | ужесточить ревью, заморозить рискованные выкаты |
| 0 — исчерпан | feature freeze: только надёжностные фиксы, релизы через гейт |
- Надёжность в приоритете — экшены из постмортемов, автоматизация откатов, тесты: то, что реально вернёт бюджет.
- Восстановление — бюджет считается на скользящем окне (обычно 30 дней): старые ошибки выкатываются из окна, и бюджет отрастает сам.
⚠️ Частая ошибка: отвечать «мы будем стараться лучше». Без заранее согласованных последствий error budget — просто цифра на дашборде, а не контракт между надёжностью и скоростью фич.
03Почему алертить лучше на симптомы, а не на причины?
middle
Короткий ответ: Пейджить человека нужно тогда, когда страдают пользователи, — то есть по SLI: error rate, латентность. Алерт «CPU 90%» будит дежурного из-за не-проблем и молчит при настоящих: причин у деградации много, а симптом один. Причинные метрики живут на дашбордах — для диагностики.
Подробно:
| Симптом → пейдж | Причина → дашборд | |
|---|---|---|
| Примеры | error rate выше SLO, p99-латентность, чекаут недоступен | CPU 90%, память, глубина очереди, медленный диск |
| Ложные срабатывания | редко: пользователи реально страдают | часто: CPU 90% может быть нормой |
| Пропуски | почти нет | легко: деградация без «красной» инфраметрики |
- CPU 90% ≠ инцидент — батч-джоб честно утилизирует машину; дежурного разбудили зря.
- Все хосты зелёные, пользователи страдают — баг в коде, битый конфиг, лёг сторонний API: причинные алерты молчат.
- Медленный диск, который никому не мешает — если SLI в порядке, это тикет на завтра, а не пейдж в 3 часа ночи.
⚠️ Частая ошибка: алертить на всё «на всякий случай». Итог — alert fatigue: дежурный мьютит канал и пропускает настоящий инцидент.
04Объясните burn-rate-алертинг. Чем он лучше статического порога?
senior
Короткий ответ: Burn rate — во сколько раз быстрее заложенного вы тратите error budget: фактическая доля ошибок ÷ бюджетная. Burn rate 1 — бюджет израсходуется ровно к концу окна. Алертим по скорости сжигания на нескольких окнах: быстрое горение — пейдж, медленное — тикет. Каждый алерт привязан к математике реального ущерба.
Подробно:
SLO 99.9% за 30 дней → бюджетная доля ошибок 0.1%
burn rate = фактическая доля ошибок / 0.1%
burn 1 → бюджет кончится ровно к концу 30-дневного окна
пейдж: burn 14.4× на окне 1 ч
сожжено 14.4 × (1 ч / 720 ч) = 2% месячного бюджета за час
тикет: burn 6× на окне 6 ч
сожжено 6 × (6 / 720) = 5% бюджета — медленно, но верно
- Multi-window, multi-burn-rate — быстрые пожары ловит короткое окно (пейдж), медленные утечки — длинное (тикет); короткое контрольное окно (5 мин) гасит алерт сразу после восстановления.
- Против статического порога — «error rate > 1%» либо будит на всплеске из десятка запросов, либо неделями молчит, пока утечка съедает бюджет. Burn rate масштабирует срочность от серьёзности сам.
- Ответ на «почему разбудили?» — в цифрах: «за час сгорело 2% месячного бюджета».
⚠️ Частая ошибка: один порог на все случаи. Быстрый пожар и медленная утечка требуют разных окон и разной срочности реакции.
05Метрики, логи и трейсы: когда какой инструмент правильный?
concept
Короткий ответ: Метрики — дешёвые агрегаты: алертинг и тренды. Логи — дискретные события: форензика конкретного инцидента, дорого на объёме. Трейсы — причинность одного запроса через все сервисы: «куда ушли 2 секунды?». Сигналы связываются через trace ID и exemplars.
Подробно:
| Метрики | Логи | Трейсы | |
|---|---|---|---|
| Вопрос | «что происходит в целом?» | «что именно случилось?» | «где в цепочке тормозит?» |
| Гранулярность | агрегаты во времени | отдельное событие | запрос через сервисы |
| Цена | копейки при фикс. числе серий | дорого на объёме | сэмплируется |
| Роль | алерты, дашборды, тренды | расследование, аудит | латентность распределённых систем |
- Начинаем с метрик — алерт по SLI сообщает, что что-то не так.
- Трейс показывает, где — какой из 12 сервисов добавил 1.8 с из 2.
- Логи объясняют, почему — стектрейс, конкретный запрос, конкретный пользователь.
- Корреляция — общий trace ID в логах и exemplars в метриках позволяют прыгать между сигналами, а не сверять таймстемпы глазами.
⚠️ Частая ошибка: «логируем всё — потом разберёмся». На проде это счёт за хранение выше счёта за компьют и grep по терабайтам вместо алерта за секунды.
06Как устроен Prometheus: pull-модель, модель данных и зачем rate() поверх счётчиков?
middle
Короткий ответ: Prometheus сам опрашивает (pull) эндпоинты /metrics у таргетов, найденных через service discovery. Временной ряд = имя метрики + набор лейблов. Счётчики только растут, поэтому смотрим не значение, а скорость: rate() считает прирост в секунду и корректно переживает рестарты.
Подробно:
- Pull, не push — Prometheus скрейпит таргеты по расписанию: сам факт удачного скрейпа (up == 1) — бесплатный health-check; service discovery (Kubernetes, Consul) находит таргеты автоматически.
- Модель данных —
http_requests_total{method="GET", status="500"}: каждая уникальная комбинация лейблов — отдельный ряд. - rate() поверх counter — абсолютное значение счётчика бессмысленно (зависит от аптайма); rate() даёт прирост/с и обрабатывает сброс счётчика на рестарте.
# доля 5xx
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# p99 из гистограммы
histogram_quantile(0.99,
sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
- Окно rate() ≥ 2× интервала скрейпа — иначе в окно попадает меньше двух точек и график дырявый.
⚠️ Частая ошибка: алертить на сырое значение счётчика или брать rate() от gauge. Counter → rate(), gauge → текущее значение/дельта.
07Что такое кардинальность метрик и как одним лейблом положить Prometheus?
senior
Короткий ответ: Кардинальность — число уникальных комбинаций лейблов: каждая комбинация — отдельный временной ряд, живущий в памяти. Память растёт примерно линейно с числом активных серий. Лейбл user_id, полный URL или хэш пода порождает неограниченное число серий — и Prometheus уходит в OOM.
Подробно:
http_requests_total{path="/user/48211/cart", ...}
100 000 юзеров × 5 методов × 10 статусов = 5 000 000 серий
→ память TSDB взрывается, скрейпы тормозят, OOM
- Правило — перед добавлением лейбла спросить: может ли у него быть 10 000+ значений? Тогда это измерение для трейсов и логов, а не для метрик.
- Типичные виновники — user_id, session_id, полный путь с параметрами (нормализуйте в /user/:id), IP-адрес, хэш пода в значении лейбла.
- Диагностика —
prometheus_tsdb_head_seriesи топ метрик по кардинальности через /api/v1/status/tsdb. - Когда серий законно много — ответ на масштаб не «ещё один Prometheus», а VictoriaMetrics или Thanos: долгое хранение, глобальный запрос, дедупликация. Частый вопрос на собеседованиях в Avito/Ozon — там это боевой стек.
⚠️ Частая ошибка: лейбл по параметру запроса «чтобы удобнее фильтровать». Одна строка инструментации — и через неделю мониторинг лежит вместе с сервисом.
08Назовите четыре золотых сигнала мониторинга.
junior
Короткий ответ: Латентность, трафик, ошибки, насыщение (saturation) — из SRE-книги Google. Этого набора достаточно, чтобы мониторить почти любую user-facing систему. Тонкость: латентность считаем по успешным запросам — ошибки обычно отвечают быстро и «улучшают» среднее.
Подробно:
| Сигнал | Что измеряет | Пример |
|---|---|---|
| Латентность | время ответа успешных запросов | p50/p99 длительности |
| Трафик | нагрузку на систему | RPS, сообщений/с |
| Ошибки | долю неуспешных запросов | 5xx rate, таймауты |
| Насыщение | насколько «полон» ресурс | CPU, память, очередь, диск |
- Латентность ошибок — отдельно — быстрый 500-й в общей куче маскирует деградацию: p99 «улучшился», а пользователи страдают.
- Насыщение смотрит вперёд — опережающий сигнал: очередь растёт сейчас → латентность деградирует через минуты.
- Это блиц-вопрос — отвечать без паузы; углубляют обычно в латентность и saturation.
⚠️ Частая ошибка: считать латентность по всем запросам вместе с ошибками — быстрые 5xx статистически прячут реальное замедление.
09Пейдж в 3 часа ночи: error rate чекаута вырос через 20 минут после деплоя. Ваши первые 15 минут?
senior
Короткий ответ: Сначала митигировать, потом диагностировать. Корреляция с деплоем очевидна — откатываем релиз, не выясняя root cause: пока вы дебажите, пользователи теряют заказы. Диагноз — после того, как кровотечение остановлено.
Подробно:
0–2 мин подтвердить: дашборд SLI чекаута, масштаб (все? регион? сегмент?)
2–5 мин корреляция: деплой 20 мин назад — главный подозреваемый
5–8 мин ОТКАТ деплоя. Не hotfix, не дебаг — rollback
8–12 мин проверить восстановление SLI; коммуникация: инцидент-канал,
статус-пейдж; при крупном масштабе — объявить инцидент
и раздать роли (IC / comms / ops)
12–15 мин зафиксировать улики: графики, логи, id релиза — для постмортема
- Mitigate first — откат почти всегда быстрее и дешевле диагноза; root cause спокойно подождёт до утра.
- Коммуникация — не опция — молчащий дежурный порождает второй инцидент; таймстемпы в канале потом станут таймлайном постмортема.
- Сохранить состояние — снять логи и графики до того, как откат сотрёт картину.
⚠️ Частая ошибка: героически дебажить root cause на горящем проде. Интервьюер слушает порядок действий: остановить ущерб → связь → и только потом причина.
10Что делает постмортем blameless — и что делает его полезным?
concept
Короткий ответ: Blameless — фокус на системе, а не на людях: «человеческая ошибка» — точка, где анализ начинается, а не заканчивается. Полезным его делают конкретные action items с владельцами и дедлайнами, которые реально доезжают до прода, и выводы, расшаренные на всю организацию.
Подробно:
- Почему без обвинений — если за инцидент наказывают, люди прячут детали, и организация теряет данные для обучения. Вопрос не «кто нажал», а «почему система позволила одному нажатию уронить прод».
- Анатомия хорошего постмортема:
| Секция | Содержание |
|---|---|
| Таймлайн | факты с таймстемпами: детект, эскалация, митигация, резолв |
| Contributing factors | несколько факторов вместо единственной «root cause» |
| Impact | цифры: минуты, затронутые пользователи, сожжённый бюджет |
| Action items | конкретные, каждый с владельцем и дедлайном |
- Полезность = закрытые экшены — трекать их как обычные задачи в спринте; постмортем, после которого ничего не изменилось, — ритуал.
- Шарить широко — чужой инцидент — самый дешёвый урок для соседней команды.
⚠️ Частая ошибка: «виноват Вася, впредь будет внимательнее» — или 15 экшенов без владельцев. Оба варианта гарантируют повтор инцидента.
11Что такое toil и как его сокращать в команде, тонущей в тикетах?
concept
Короткий ответ: Toil — операционная работа, которая одновременно: ручная, повторяющаяся, автоматизируемая, тактическая, не создаёт долгосрочной ценности и растёт линейно с ростом сервиса. Google ограничивает toil примерно 50% времени SRE — остальное должно уходить на инжиниринг, который этот toil убивает.
Подробно:
- Шесть признаков — ручная, повторяющаяся, автоматизируемая, тактическая (реактивная), без устойчивой ценности, масштабируется линейно с ростом. Чем больше совпало, тем чище toil.
- Сначала измерить — одна-две недели учёта: категории тикетов, время на каждую. Без данных «мы тонем» не превращается в план.
- Атаковать топ — 2–3 категории обычно дают половину объёма: автоматизация (скрипт вместо ранбука), self-service (кнопка для разработчиков вместо тикета «выдайте доступ»), устранение источника (починить корневой баг).
- Toil budget как аргумент — «мы тратим 60% времени на toil, вот учёт» — легитимный кейс перед менеджментом, чтобы выделить инженерное время.
| Признак | Toil | Не toil |
|---|---|---|
| Повторяется | ресет пароля по тикету | дизайн новой схемы алертинга |
| Автоматизируемо | ручной рестарт по ранбуку | расследование нового инцидента |
⚠️ Частая ошибка: называть toil'ом всю операционную работу. Он-колл и разбор новых инцидентов — не toil: они требуют суждения и создают знание.
Источники
Источники и редакционная политика
Материалы RecallDeck сопоставлены с официальной документацией и открытыми публикациями компаний, когда первичный источник доступен. Мы не связаны с упомянутыми работодателями, не публикуем конфиденциальные задания и не продаём места в подборках. Формат найма может меняться — уточняйте его у рекрутера.
От чтения к воспроизведению
Отрепетируйте полный цикл интервью.
RecallDeck возвращает сложные темы по расписанию и помогает удерживать в памяти язык, SQL, архитектуру и поведенческие истории.