Петля инцидента: от пейджера до постмортема до предотвращения
Полная петля production-инцидента — от T+0 до T+1 недели — плюс культурные механизмы (blameless postmortem, runbook''''и, game day''''и, error budget policy), которые составной ставкой улучшают MTTR со временем.
Две команды используют одинаковый observability-тулинг. MTTR команды А — 45 минут. Команды Б — 8 минут. Разница не в дашбордах, не в вендоре, не в количестве людей. У команды Б есть культура blameless postmortem, runbook на каждый алерт, подписанный error budget policy и ежемесячные game day’и. Инструменты собирают данные; культура определяет, что с ними делать.
Полная петля инцидента от начала до конца
Правильно разрешённый production-инцидент выглядит так:
T+0: Срабатывает SLO burn-rate алерт, пейджируя дежурного. Payload алерта содержит: имя сервиса, SLO id, текущую скорость сгорания, временное окно и четыре deeplink’а — RED-дашборд, trace view, отфильтрованный по окну сгорания, profile view, отфильтрованный по тому же окну, runbook.
T+30 с: Дежурный ackует через PagerDuty. Первый deeplink (RED) открывается автоматически.
T+1 мин: Дежурный читает три панели RED и определяет, какой из показателей Rate / Errors / Duration изменился и по какому паттерну (спайк vs дрейф vs плато).
T+1 мин 30 с: Дежурный кликает deeplink трейсов, видит 5–10 репрезентативных медленных или ошибочных трейсов, определяет, в каком сервисе и в каком span’е сосредоточена большая часть задержки.
T+2 мин: Дежурный кликает deeplink профиля (предфильтрованный по trace-id из предыдущего шага), видит flame graph, определяет самый широкий листовой фрейм — функцию, которая поглотила время.
T+2 мин 30 с: git blame на функцию показывает коммит, автора, дату. Сверка с таймлайном деплоев; причина подтверждена.
T+3 мин: Инициирован откат или drafted hotfix.
T+5–10 мин: Скорость сгорания возвращается к baseline. Алерт снимается.
T+1 ч: Создан blameless postmortem-документ с таймлайном и корневой причиной. Пункты действий поданы.
T+1 день: Пункты действий начинают выполняться. Runbook обновлён новым паттерном.
T+1 неделя: Пункты действий выполнены. Следующий инцидент этого класса предотвращён.
Петля воспроизводима. Она ускоряется с практикой. Она не требует героизма.
| Фаза | Время | Действие |
|---|---|---|
| Detect | T+0 | Срабатывает SLO burn алерт, дежурный пейджируется |
| Diagnose | T+0 до T+3 мин | Следуй воронке: RED → trace → profile → git blame |
| Resolve | T+3 до T+10 мин | Откат или hotfix; наблюдай возврат burn rate |
| Learn | T+1 ч | Blameless postmortem, пункты действий поданы |
| Prevent | T+1 день до T+1 недели | Пункты действий выполнены; runbook обновлён |
Пять культурных механизмов
Каждая техническая часть этого юнита окупается только тогда, когда команда имеет следующее.
1. Подписанный error budget policy. Письменное соглашение — подписанное на уровне директора — замораживающее некритические деплои при исчерпании error budget. Без него инженеры всё равно деплоят «на этот раз» и SLO превращается в метрику, на которую никто не реагирует. Policy — это то, что делает SLO реальным контрактом между инженерией и бизнесом.
2. Культура blameless postmortem. Каждый SEV-1 и SEV-2 инцидент порождает постмортем в течение 24–48 часов. Документ фиксирует: таймлайн, корневую причину (системный сбой, не личный) и конкретные пункты действий. Пункты действий отслеживаются и выполняются как продуктовая работа. Без этого те же инциденты повторяются. С этим каждый инцидент делает следующий класс инцидентов либо невозможным, либо быстро диагностируемым.
3. Runbook’и на каждый алерт. Каждый алерт ведёт к runbook’у, за которым закреплён конкретный инженер и который пересматривается ежеквартально. Runbook содержит: что означает алерт, что дежурный должен проверить сначала, какие вероятные причины и как каждую исправить. Дежурный, получивший пейдж в 3 ночи и открывший хороший runbook на повторяющийся инцидент, решает его за несколько минут. Дежурный без runbook’а каждый раз исследует с нуля.
4. Game day’и. Запланированные упражнения, где инженерия инжектирует реалистичный сбой (убивает pod, замедляет downstream, взрывает регион) и наблюдает реакцию дежурного: следует ли воронка? Помог ли runbook? Достаточно ли быстро сработал алерт? Каждый game day порождает обновления runbook’а и улучшения дашборда. Команды, проводящие ежемесячные game day’и, формируют мышечную память, превращающую 3-ночные инциденты в 10-минутные разрешения.
5. Ревью стоимости. Расходы на observability проверяются ежеквартально так же, как проверяются infra-расходы. Каждая команда видит свой объём сигналов, кардинальность и стоимость. Команды, допускающие утечку бюджета, получают инженерное внимание до того, как стать следующей историей в духе Datadog 2021 ($680k → $2M за неделю из-за одной неправильно настроенной метрики).
Все пять механизмов усиливают друг друга: без error budget policy пункты действий постмортема не имеют силы; без runbook’ов game day ничего действенного не выявляет; без ревью стоимости весь стек деградирует до тех пор, пока тулинг больше не поддерживает культуру. Отсутствие хоть одного оставляет брешь, которую остальные не закроют.
Маховик пунктов действий
Пункты действий каждого постмортема — самый ценный reliability-актив org, а не сам инцидент. Паттерн за 12 месяцев:
- Пункты действий, повторяющиеся в нескольких постмортемах, становятся работой над политикой с высоким приоритетом («мы постоянно деплоим схемные изменения без обратной совместимости» → «обратная совместимость теперь обязательна в CI»).
- Выявление паттернов в постмортемах («60% инцидентов из deploy pipeline одной команды») направляет архитектурные инвестиции.
- Процент выполнения пунктов действий становится метрикой здоровья команды — отслеживается на уровне VP, пересматривается ежемесячно.
Org, запускающая этот маховик год, видит: MTTR вдвое (45 → 20 мин), число инцидентов снизилось на 30%, стоимость observability не растёт или снижается несмотря на 2x рост трафика, удовлетворённость команды выросла (меньше пейджей в 3 ночи).
▸Почему это работает
Org’и с сильным тулингом и слабой культурой видят MTTR, застрявший на 30+ минутах. Org’и с посредственным тулингом и сильной культурой превосходят их по MTTR в 2–3 раза. Этот юнит существует, чтобы сделать тулинг базовыми ставками, чтобы культурным механизмам было на что опереться. Культурные изменения сложнее внедрить, чем инструменты — они требуют управленческой вовлечённости и терпения — но они накапливаются вечно. Обновления инструментов амортизируются; культура накапливается.
- Улучшение MTTR (воронка + культура)
- Снижение 50–80%
- Снижение числа инцидентов (маховик action items)
- ~30% за 12 месяцев
- Целевой показатель завершения постмортемов (SEV1/2)
- 100% в течение 48 ч
- Целевой показатель выполнения пунктов действий
- ≥ 80% в течение 30 дней
- Каденция game day'ов (зрелая org)
- Ежемесячно минимум по региону
- Целевое покрытие runbook'ами
- У каждого алерта есть именованный владелец
MTTR команды застрял на 25 минутах на протяжении года, несмотря на несколько обновлений инструментов. Что скорее всего отсутствует?
Один и тот же SEV-1 инцидент срабатывал четыре раза за три месяца. Каждый раз MTTR составлял 40–50 минут. Что означает этот паттерн?
- 01Что такое blameless postmortem и почему он важен для MTTR со временем?
- 02Что должен содержать payload SLO burn-rate алерта, чтобы воронка работала менее чем за три минуты?
- 03Назови пять культурных механизмов и объясни, что ломается при отсутствии каждого.
Полная петля инцидента идёт от T+0 (срабатывает алерт) до T+1 недели (пункты действий выполнены и корневая причина предотвращена), при этом воронка-driven диагностика занимает менее трёх минут, когда deeplink’и встроены в payload алерта. Пять культурных механизмов заставляют петлю накапливаться: подписанный error budget policy, реально замораживающий деплои; blameless postmortem’ы, превращающие инциденты в отслеживаемые пункты действий; runbook’и на каждый алерт за именованным инженером; ежемесячные game day’и, поддерживающие мышечную память дисциплины воронки; и ежеквартальные ревью стоимости, выявляющие утечки кардинальности до того, как они становятся бюджетными кризисами. Маховик пунктов действий — составной актив: пункты каждого постмортема делают следующий класс инцидентов либо невозможным, либо быстро диагностируемым. Команды с сильным тулингом и слабой культурой застревают на MTTR 30 минут; команды с посредственным тулингом и сильной культурой превосходят их в 2–3 раза. Культуру сложнее внедрить, чем новый дашборд, но в отличие от дашборда она накапливается вечно. Теперь, когда MTTR твоей команды перестаёт улучшаться несмотря на новые инструменты, ищи отсутствующий культурный механизм — ответ почти всегда «нет runbook’а» или «пункты действий постмортема не доведены до конца».
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
встречается в212
- Почему GraphQL получает N+1junior
- Механика DataLoader: батчинг на границе тикаmiddle
- Контракты batch-функции: порядок, формы, ошибкиmiddle
- Federation и lookahead: батчинг за пределами DataLoadermiddle
- Защита сложности запросов: depth, cost, persisted queriesmiddle
- Senior GraphQL API: scheduling-контракт, изоляция арендаторов, наблюдаемостьsenior
- Зачем идемпотентность: безопасные retryjunior
- Серверный state machine: четыре состояния idempotency keymiddle
- Outbox и inbox: effectively-once через dual-write границуmiddle
- Конкурентность и архитектура кеша для идемпотентности на масштабеsenior
- Наблюдаемость, production-инциденты и дизайн для глобального масштабаsenior
- Event loop: один поток, три очередиjunior
- Задачи, микрозадачи и scheduler.yield()middle
- Голодание микрозадач, длинные задачи и LoAFsenior
- Event loop Node.js: фазы, nextTick и задержка циклаsenior
- React, Vue и наблюдаемость INP в продакшенеsenior
- Render pipeline: шесть стадий от байтов до пикселейjunior
- Цена стадий и модель процесса рендерераmiddle
- Инвалидация, dirty-биты и containmiddle
- Слои композитора: продвижение, перекрытие и память GPUmiddle
- Флейм-стрип DevTools и жизненный цикл кадраmiddle
- Layout thrash: форсированная синхронная компоновкаsenior
- BeginMainFrame, анимации на потоке compositor и память GPUsenior
- Observability в проде: LoAF, INP и полная поверхность атакиsenior
- Что такое V8 и почему производительность различается в 100 разjunior
- Четырёхуровневый JIT-конвейер V8 и профилированная тиеризацияmiddle
- Hidden classes, деревья переходов и расположение в памятиmiddle
- Inline caches, состояния IC и деоптимизацияmiddle
- Orinoco GC: параллельный scavenger, конкурентная разметка и барьеры записиmiddle
- Спекулятивный движок TurboFan и ловушка deopt-loopsenior
- V8 в production: Isolates, сжатие указателей и реальные аварииsenior
- Что такое воркеры и зачем они нужныjunior
- Механика web workers: dedicated, shared и OffscreenCanvasmiddle
- Structured clone и transferablesmiddle
- Жизненный цикл service worker и стратегии кешированияmiddle
- SharedArrayBuffer, Atomics и cross-origin isolationsenior
- Граничные случаи service worker: version skew, долговременность и ловушка навигацииsenior
- Пулы воркеров, Comlink и наблюдаемость в продакшенеsenior
- Что делает реконсилер: render vs commitjunior
- Объект fiber и дерево с двойной буферизациейmiddle
- Чистота фазы render и подшаги фазы commitmiddle
- Реконсиляция: эвристики диффа и ловушка ключейmiddle
- Приоритетные lanes, time-slicing и useTransitionmiddle
- Bailout, мемоизация и tearingsenior
- React Profiler, компилятор и продакшн-наблюдаемостьsenior
- Стратегии рендеринга: SSG, SSR, ISR, streaming и гидратацияjunior
- SSG, SSR, ISR, streaming и RSC — как работает каждая стратегияmiddle
- Цена гидратации: selective, progressive, острова, resumabilitymiddle
- Hydration mismatch: причины, обнаружение и правило детерминизмаsenior
- RSC, стратегия на маршрут и production-наблюдаемостьsenior
- Core Web Vitals: что измеряют LCP, INP и CLSjunior
- CLS: почему происходят сдвиги лейаута и как их остановитьmiddle
- Трейдоффы метрик, RUM-атрибуция и цикл CI+полеsenior
- Общая картина: от URL до LCP до INP как эстафетаjunior
- Восемь слоёв трассировки: от service worker до второй навигацииmiddle
- Пять канонических поломок: где производство стабильно ломаетсяsenior
- Метод трёх треков: чтение трасс и построение системы мониторингаsenior
- Что такое cache stampede и почему он делает всё хужеjunior
- Лок и single-flight: ограничение параллельных rebuildmiddle
- XFetch: вероятностное раннее истечение без координацииmiddle
- Stale-while-revalidate и CDN request coalescingmiddle
- Детектирование stampede и дизайн TTL для продакшенаmiddle
- Метастабильный сбой, fencing-токены и production-постмортемыsenior
- Что такое отношение: таблицы, строки, ключи и ограниченияjunior
- Ограничения, ключи и типы данных Postgresmiddle
- Нормальные формы, денормализация и почему схемы «прилипают»middle
- JSONB, массивы и когда side table побеждаетmiddle
- Heap-хранилище, TOAST и выравнивание колонокsenior
- Целостность схемы: deferral, версионирование и сбои в продакшнеsenior
- Реляционная модель vs документные, wide-column, граф и key-valuesenior
- Index-only scan, Visibility Map и INCLUDEsenior
- Типичные сбои в продакшне и аудит индексовsenior
- pg_statistic, ANALYZE и производственная наблюдаемостьmiddle
- Производственные режимы отказа и стабильность плановsenior
- MVCC: как Postgres раздаёт согласованные снимкиjunior
- Заголовок tuple и механика снимковmiddle
- HOT-обновления и уровни изоляцииmiddle
- VACUUM, bloat и autovacuummiddle
- CLOG, XID wraparound и MultiXactsenior
- SSI и production-тюнинг autovacuumsenior
- Реальные провалы MVCC, deployment-паттерны и распределённые снимкиsenior
- Connection pool: зачем амортизировать стоимость backend Postgresjunior
- Режимы PgBouncer: session, transaction и statementmiddle
- Размер пула: формула (ядра × 2) + шпинделей и двухуровневый стекmiddle
- Исчерпание пула и idle-in-transaction: сценарий отказа в 3 ночиmiddle
- Миграция на transaction mode: план развёртывания и prepared statements в PgBouncer 1.21middle
- Процессная модель Postgres и почему увеличение max_connections снижает производительностьsenior
- Ландшафт пулеров 2026, serverless connection storms и полная таксономия отказовsenior
- Что такое миграция схемы и почему она заменяет ad-hoc DDLjunior
- ADD COLUMN: мгновенно в PG 11+ против перезаписи в старом Postgresjunior
- Режим отказа очереди блокировок: почему мгновенный DDL может заморозить базуmiddle
- Безопасные DDL-паттерны: NOT VALID, CONCURRENTLY и исправления небезопасных операцийmiddle
- Expand-contract: нулевой простой для ломающих изменений схемыmiddle
- Advisory-блокировки, инструменты миграций и координация деплояsenior
- Таксономия сбоев миграций и дисциплина продакшнаsenior
- Зачем нужно шардирование: потолок одного Postgresjunior
- Выбор ключа шарда: стратегии hash, range, list и directorymiddle
- Партиционирование против шардирования: одно слово, два разных понятияmiddle
- Ко-локация и Citus: инвариант, делающий шардирование пригодным к использованиюmiddle
- Режим отказа hot shard: обнаружение, изоляция и долгосрочная политикаmiddle
- Schema-based шардирование и альтернативы мультиарендностиsenior
- Онлайн-решардинг, 2PC и операционная стоимость шардированияsenior
- Семь актов: от CREATE TABLE до Citusjunior
- Акты 1–3 в глубину: схема, индексы и статистика планировщикаmiddle
- Акты 4–6 в глубину: MVCC bloat, connection pooling и безопасные миграцииmiddle
- Акт 7 в глубину: шардинг, co-location и семиуровневый каскад трейдоффовmiddle
- Наблюдаемость, антипаттерны и производственный триажsenior
- Роли Raft, term и почему majority-кворум предотвращает split brainjunior
- Как Raft реплицирует log entry и решает, что его безопасно коммититьmiddle
- Выборы лидера в Raft: таймауты, правила голосования и четыре свойства безопасностиmiddle
- Raft в реальном мире: partition, медленный диск и клиентская маршрутизацияmiddle
- Расширения Raft: pre-vote, learner, snapshot и линеаризуемые чтенияsenior
- Raft в production: membership change, Multi-Raft и observabilitysenior
- Где происходит data fetching — и почему это решает LCPjunior
- Fetch waterfall''''ы — диагностика и лечение через Promise.allmiddle
- React Server Components и Suspense streamingmiddle
- Клиентский кэш: TanStack Query, SWR и stale-while-revalidatemiddle
- LCP, prefetch и race conditions в интерактивном fetchingmiddle
- Senior internals: RSC payload, слои кэша и production паденияsenior
- Что такое движок JavaScriptzero
- Ignition и байт-кодmiddle
- Внутри цикла интерпретатораmiddle
- Как V8 представляет значениеmiddle
- Что такое Map на самом деле: вскрываем hidden classmiddle
- Деревья переходов, deprecation и миграцияmiddle
- Быстрые свойства, медленные свойства и slack trackingmiddle
- Inline cache в глубину: feedback-слоты и handlersmiddle
- Monomorphic, polymorphic, megamorphic — и stub cachemiddle
- Четыре яруса и как работает разогревmiddle
- Обратная связь о типах: топливо для оптимизатораsenior
- TurboFan: оптимизатор на море узловsenior
- Спекуляция и guardssenior
- Деоптимизация: падение с обрываsenior
- On-Stack Replacement: подмена фрейма посреди циклаsenior
- Области видимости, контексты и scope chainmiddle
- Что на самом деле удерживает замыканиеmiddle
- Когда V8 аллоцирует Context (и чего это стоит)middle
- Замыкания, feedback-векторы и полиморфизм точки вызоваmiddle
- Зачем нужен GC и достижимостьmiddle
- Утечки в языке со сборкой мусораsenior
- Движок против циклаmiddle
- Микрозадачи против макрозадач: порядокmiddle
- Внутри Promisemiddle
- async/await, десахаризированныйmiddle
- Капстоун: оптимизируем горячий путьsenior
- Конверт IPjunior
- Читаем IP-заголовокmiddle
- Трёхстороннее рукопожатие TCPjunior
- Номера последовательности и состояние соединенияmiddle
- DNS: что делает и зачем существуетjunior
- Обход резолвера: перенаправления, типы записей и gluemiddle
- TTL, кеширование и распространение DNSmiddle
- Что делает TLS и зачем он нуженjunior
- Рукопожатие за 1 RTT: key share и ECDHEmiddle
- Возобновление сессии и 0-RTTmiddle
- Расписание ключей, SNI, ALPN и расширенияsenior
- Защита 0-RTT, ECH, гибридный PQ и продакшн TLSsenior
- WebSocket: HTTP-апгрейд до постоянного соединенияjunior
- Формат WebSocket-фрейма: opcodes, маскирование, фрагментацияmiddle
- Backpressure в WebSocket: когда клиенты не успеваютmiddle
- Реконнект: jittered backoff, thundering herd, восстановление сообщенийsenior
- WebSocket в масштабе: HTTP/2 мультиплексирование, permessage-deflate, C10Msenior
- WebSocket в production: прокси, безопасность и распределённая архитектураsenior
- Что делают обратные проксиjunior
- Health checks, connection draining и slow startmiddle
- Session affinity, consistent hashing и правильное решениеmiddle
- Retry-бури, circuit breakers и load sheddingsenior
- Устойчивая архитектура LB: anycast, zone-aware маршрутизация и observabilitysenior
- Почему QUIC, а не TCP+TLSjunior
- Connection ID и миграция сетиmiddle
- Возобновление 0-RTT и шифрование пакетовsenior
- DDoS: что это и почему работаетjunior
- Атаки усиления и истощение состоянияmiddle
- Ограничение скорости: алгоритмы и архитектураmiddle
- WAF, межсетевые экраны, mTLS и HSTSmiddle
- Отравление DNS-кэша и BGP-перехватsenior
- Эшелонированная защита и экономика атакsenior
- Двенадцать слоёв: один URL, семь действующих лицjunior
- DNS, TCP, TLS по очереди: куда уходят миллисекундыmiddle
- Перехват прокси и шлюзы безопасности: rate limiter, WAF, mTLSmiddle
- Альтернативные пути: QUIC 0-RTT, WebSocket upgrade, миграция соединенияmiddle
- Наблюдаемость: распределённые трейсы, USE/RED и семплированиеsenior
- Устойчивость: каскадные повторы, circuit breakers и error budgetsenior
- Cache lines и false sharing: когда параллелизм замедляет кодmiddle
- SIMD и data layout: AoS vs SoA и разница в 4–8xmiddle
- Cache-oblivious алгоритмы, PGO и production failuressenior
- GC в production: наблюдаемость, безопасность, edge cases и управление флотомsenior
- Batching: амортизируй фиксированную цену каждой операцииjunior
- Окно батчинга: размер и время ожиданияmiddle
- Batching в Kafka и Postgresmiddle
- io_uring и наблюдаемость пакетированияmiddle
- От Nagle до io_uring: эволюция пакетированияmiddle
- Backpressure, изоляция сбоев и безопасность батчей в продакшенеsenior
- CI enforcement и RUM: делаем бюджеты рабочимиmiddle
- V8 JIT-пайплайн, HTTP-приоритеты и безопасность bundlesenior
- Цикл performance: дисциплина, а не проектjunior
- Классификация и исправление: сопоставление family bottleneck с методамиmiddle
- Observability-стек и CI gates: ловить регрессии до выпускаmiddle
- От инцидента к enforcement: SLO burn до верифицированного исправления за 35 минутmiddle
- Культура, экономика и масштаб performancesenior
- At-most-once, at-least-once, exactly-once: три контракта доставкиjunior
- Три ножки сбоя — где реально происходят дубликаты и потериmiddle
- Consumer-side dedup: самый дешёвый путь к exactly-once processingmiddle
- Kafka exactly-once semantics: idempotent producer и транзакцииmiddle
- SQS visibility timeout, DLQ и outbox patternmiddle
- Exactly-once в production: impossibility-доказательство, гибридные паттерны и реальные инцидентыsenior
- Что такое OAuth и почему пароли — не ответjunior
- Authorization code flow с PKCEmiddle
- Валидация ID-токена и управление JWKS-кешемmiddle
- Ротация refresh-токенов и scope-based least privilegemiddle
- Sender-constrained токены: DPoP и mTLSsenior
- OAuth в production: audience атаки, observability и реальные провалыsenior
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.