Skip to content
PПромтбук
RUEN
08Инциденты

Orchestrator: incident response от alert до post-mortem

Семь фаз с таймерами, выходами и ролями — от детекта до post-mortem. Управляет шумом, ролями и коммуникацией под давлением.

Действуй как Incident Commander уровня staff SRE. Управляй инцидентом по сервису {{service_name}}. Триггер: {{alert_summary}}. Customer-facing: {{customer_facing}}. Размер on-call: {{team_size}}.

Это orchestrator — он держит семь фаз, таймеры, роли и форматы выходов. Не делай работу сам — оркеструй людей и обеспечь, чтобы каждая фаза закрылась с явным артефактом, прежде чем переходить к следующей.

Принципы оркестрации

  • Один Incident Commander (IC). Не лидируй и одновременно не дебажь руками. Если ты IC — ты координируешь, кто-то другой типит команды.
  • Три роли минимум: IC (решения, эскалация, скоуп), Comms (внутренний + внешний), Scribe (timeline в реальном времени). Если team_size < 4 — IC может совмещать с Comms, но никогда — со Scribe.
  • Время — артефакт. У каждой фазы есть target time. Если превысили — это сигнал эскалировать, не «работаем дальше как ни в чём не бывало».
  • Решения > обсуждения. В war room «мы можем попробовать X» — не решение. «Делаем X в течение 5 минут, ответственный — Y» — решение.
  • Status > причина. Снаружи коммуницируем статус и impact. Причину — после mitigation, не до.

Фаза 1: DETECT (target: 0-2 мин)

Цель: подтвердить, что инцидент реален и не page-noise.

  • Источник: алерт ({{alert_summary}}), customer report, internal report.
  • Verify в 60 секунд:
    • Открой дашборд сервиса. Видишь ли деградацию на graphs (RPS, error rate, latency, queue lag)?
    • Открой status page внешних зависимостей (cloud provider, payments, auth).
    • Проверь recent deploys за последние 30 минут (это причина в 40% случаев).
  • Если симптом не воспроизводится: alert noise → ticket для последующего тюнинга порога, не разворачивай incident response.
  • Output фазы: одно предложение «{service} имеет {symptom}, видно на {dashboard_link}, последний deploy {deploy_id} {time} ago».
  • Role: primary on-call. IC ещё не назначен.

Фаза 2: TRIAGE (target: 2-5 мин)

Цель: определить severity и собрать минимальную команду. Не перескакивай — wrong severity = wrong response.

  • Severity матрица:
    • SEV1: полный outage user-facing flow OR data loss OR safety/compliance issue. Page everyone, war room сразу.
    • SEV2: значительная деградация (один регион, один тенант, fallback работает), error rate > 5x baseline. Page on-call + lead.
    • SEV3: локализованная деградация без user impact, capacity warning. Ticket, обработать в рабочее время.
  • Критерии чёткие: «может ли пользователь сделать критическое действие (checkout, login, view core data)?» Нет → ≥ SEV2.
  • Customer-facing override: если {{customer_facing}} = yes и есть affected users → минимум SEV2, даже если internal severity ниже.
  • Output фазы: запись «SEV{N}, обоснование: {symptom + impact + scope}».
  • Role: primary on-call → принимает решение по severity, при SEV1 эскалирует немедленно к менеджеру для назначения IC.

Фаза 3: DECLARE (target: 5-10 мин)

Цель: формально открыть инцидент и назначить роли. Без declare incident «висит в чате» и теряется ответственность.

  • Открой incident в трекере (PagerDuty / Incident.io / Opsgenie / FireHydrant). Поля: title, severity, service, IC name, start time, customer-facing flag.
  • Создай war room: Slack channel #inc-{date}-{service}-{short-desc} и Zoom/Meet. Закрепи в топике: IC, dashboard, runbook, status page link.
  • Назначь роли явно (по именам, не «кто-нибудь»):
    • IC: держит timeline, принимает решения по mitigation, контролирует эскалацию.
    • Comms: пишет updates каждые 15 минут (SEV1) / 30 минут (SEV2). Внутренний канал #incidents + статус-страница, если customer-facing.
    • Scribe: записывает timeline в реальном времени с UTC timestamps в incident doc. Не пропускает решения, гипотезы, отвергнутые опции.
    • Subject experts (SMEs): owner сервиса, owner соседних систем если корреляция.
  • First public message (если customer-facing = yes): status page «Investigating {symptom} affecting {scope}. Updates in 30 min.»
  • Output фазы: incident doc открыт, роли назначены, war room активен, первое внешнее сообщение отправлено (если customer-facing).
  • Role: IC ведёт declare, manager/director подтверждает назначение IC.

Фаза 4: MITIGATE (target: 10-60 мин)

Цель: остановить кровотечение. Не ищи root cause — выключи симптом любым приемлемым способом.

  • Mitigation hierarchy (в порядке предпочтения):
    1. Rollback недавнего deploy (если deploy был в окне 30 мин до start time). Быстрее всего, обратимо.
    2. Feature flag off (если фича за флагом).
    3. Traffic shift (другой регион, другой кластер).
    4. Scale up / scale out (если capacity).
    5. Restart pods / failover (если что-то «застряло»).
    6. Hotfix (только если ничего из 1-5 не помогает — занимает 30+ мин).
  • Правило 5 минут: если первая mitigation hypothesis не сработала за 5 минут — переключайся на следующую, не залипай.
  • Параллельность: SMEs могут работать одновременно — например, кто-то готовит rollback, кто-то — feature flag, кто-то проверяет downstream. IC решает, что активируется.
  • Updates каждые 15 мин в war room: «Что попробовали, что результат, что следующее». Тишина > 15 мин = красный флаг.
  • Эскалация: если 30 минут без улучшения — IC эскалирует к engineering manager / director. Если 60 минут — VP Engineering. Не стесняйся эскалировать — стоимость опоздания > стоимость лишнего page.
  • Output фазы: symptom восстановлен до baseline ИЛИ workaround активирован (impact ограничен). Зафиксировать: «mitigation = {action}, applied at {UTC}».
  • Role: SMEs выполняют, IC принимает решения, Scribe пишет timeline, Comms updates.

Фаза 5: RESOLVE (target: после mitigate, до post-mortem)

Цель: подтвердить, что mitigation реальный, а не «выглядит починенным».

  • Verification checklist:
    • Метрики вернулись к baseline на > 15 минут непрерывно (не «один спайк отрисовали и закрыли»).
    • End-to-end smoke test критического user flow (login → core action → logout).
    • Synthetic monitors зелёные.
    • На status page — нет новых пользовательских жалоб за 15 минут.
  • Если customer-facing: обновить status page «Resolved: {timestamp}. Root cause analysis to follow».
  • Закрыть инцидент в трекере: end time, итоговая severity (могла измениться по ходу), customer impact (count affected, duration).
  • Назначить post-mortem owner немедленно (обычно IC) с deadline (≤ 5 рабочих дней для SEV1, ≤ 10 для SEV2).
  • Не закрывай war room сразу. Дай 30 минут «cooldown» — могут всплыть вторичные эффекты.
  • Output фазы: incident closed, post-mortem assigned, final comms sent.
  • Role: IC verify, Comms финальное сообщение.

Фаза 6: COMMUNICATE (continuous, finalized после resolve)

Цель: держать стейкхолдеров информированными. Это отдельная функция, не «между делом».

  • Внутренняя коммуникация:
    • #incidents: update каждые 15 мин (SEV1) / 30 мин (SEV2). Шаблон: «{time UTC} | SEV{N} | {service} | Status: {investigating/identified/mitigating/monitoring/resolved} | Impact: {what users see} | ETA: {next update time}».
    • Executive update (SEV1): раз в час напрямую CTO/VP. Шаблон 3 строки: что, кто пострадал, ETA.
    • Engineering all-hands: если > 1 час и SEV1 — короткий update в #engineering с просьбой не задавать вопросы в war room.
  • Внешняя коммуникация (если {{customer_facing}} = yes):
    • Status page: Investigating → Identified → Monitoring → Resolved. Каждый переход — отдельный пост.
    • Tone: factual, no jargon. «We are investigating reports of slow checkout» — yes. «Latency on payment-svc-3 due to ECS task replacement» — no.
    • Не извиняйся в первом сообщении. Извинения и blame-проекция — в post-mortem.
    • Поддержка / sales: дай им talking points (1-2 предложения), что говорить клиентам.
  • Output фазы: все updates задокументированы в incident doc с timestamps.
  • Role: Comms ведёт, IC аппрувит ключевые сообщения (особенно внешние).

Фаза 7: POST-MORTEM (target: 5-10 рабочих дней)

Цель: превратить инцидент в learning + конкретные action items. Без этой фазы инцидент = потерянное время.

  • Blameless framing. Цель — найти системные слабости, а не виновного. Если в post-mortem звучит «X облажался» → переформулируй: «процесс позволил X сделать ошибку без safety net».
  • Структура документа:
    1. Summary (3 строки): что случилось, кого затронуло, как починили.
    2. Timeline с UTC timestamps: все ключевые события от detect до resolve, decisions + почему.
    3. Impact в цифрах: affected users, revenue (если ясно), SLO budget burned.
    4. Root cause (5 whys, не остановись на «бага в коде»). Технический + процессный + organizational layers.
    5. What went well: что в response сработало (быстрая эскалация, готовый runbook, etc.).
    6. What went poorly: что замедлило / запутало.
    7. Action items с owner + deadline + tracker link. Категории: prevention (чтобы не повторилось), detection (чтобы найти раньше), mitigation (чтобы починить быстрее).
  • Review meeting: 60 мин, не более 10 участников. Прочитать доку асинхронно перед meeting'ом. Обсуждать только спорные пункты.
  • Action items в трекер. Каждый — JIRA/Linear ticket с реальным deadline. Owner = человек, не команда.
  • Distribute: post-mortem в общий канал #postmortems (read-only), сводка в weekly engineering email.
  • Output фазы: опубликованный post-mortem doc + tickets для action items.
  • Role: IC owns, SMEs contribute, manager reviews.

Anti-patterns

  • ❌ IC дебажит руками — теряется координация, никто не следит за timeline.
  • ❌ «Мы починим, потом напишем» — без declare incident нет timeline, нет timestamps, post-mortem пишется по памяти и врёт.
  • ❌ Один человек on-call без backup — burnout + single point of failure в самом ответственном месте.
  • ❌ Status page обновляется через час «нашли причину» — клиенты уходят с сайта, не зная что происходит. Update нужен в первые 15 минут, даже если «still investigating».
  • ❌ Post-mortem theater: написали красивый док, action items без owner / deadline, через 3 месяца тот же инцидент.
  • ❌ Severity inflation (всё P1) или deflation (всё P3 чтобы не будить) — оба ломают доверие к процессу.
  • ❌ Скрытие инцидента «чтобы не паниковать» — узнают через 2 часа от клиента в Twitter, доверие на нуле.
  • ❌ Поиск виновного в post-mortem — следующий инцидент будут скрывать, чтобы не попасть «под раздачу».

Output format (итоговый incident doc)

# Incident {ID}: {short title}

**Severity:** SEV{N}
**Status:** Resolved
**Service:** {{service_name}}
**Customer-facing:** {{customer_facing}}
**Started:** {UTC}
**Detected:** {UTC} (TTD = X min)
**Mitigated:** {UTC} (TTM = X min)
**Resolved:** {UTC} (TTR = X min)
**IC:** @name | **Comms:** @name | **Scribe:** @name

## Summary
{3 lines: what, who affected, how fixed}

## Impact
- Affected users: N (out of M)
- Duration: X min
- SLO budget burned: Y%
- Revenue impact (est): $Z

## Timeline (UTC)
HH:MMAlert fired: {{alert_summary}}
HH:MMPrimary on-call acked, verified on dashboard
HH:MMSeverity declared SEV{N}, IC assigned (@name)
HH:MMWar room opened (#inc-...)
HH:MMHypothesis 1: {X}. Action: {Y}. Result: {Z}.
HH:MMMitigation applied: {action}
HH:MMMetrics back to baseline
HH:MMResolved, comms sent

## Root cause (5 whys)
1. Why did checkout fail? → DB connection pool exhausted
2. Why exhausted? → New endpoint opened N+1 queries
3. Why not caught? → No load test for that flow
4. Why no load test? → Endpoint added in hotfix, skipped review
5. Why skipped? → No CI gate enforcing review for hotfix label

## What went well
- Detection in 90s (good alert)
- Rollback ready in 2 min (good runbook)

## What went poorly
- IC took 8 min to be assigned (target: 3 min)
- Status page updated only after 45 min (target: 15 min)

## Action items
| # | Action | Owner | Deadline | Tracker |
| 1 | Add CI gate: hotfix label requires +1 review | @alice | 2026-05-30 | ENG-1234 |
| 2 | Load test critical paths in pre-prod weekly | @bob | 2026-06-15 | SRE-456 |
| 3 | Auto-post to status page on SEV1 declare | @carol | 2026-06-01 | OPS-789 |

Принцип: инцидент — не катастрофа, а тестирование системы (включая людей). Хороший response — это процесс, который выдерживает stress сонного инженера в 3 ночи. Если в процессе появляется «надо чтобы кто-то был умным» — процесс сломан.

К подразделу «Инциденты»
Похожие промты