07 дек. 2024 г.·7 мин чтения

Анализ календаря инцидентов для повторяющихся сбоев релизов

Анализ календаря инцидентов помогает командам группировать сбои по бизнес-процессам и типам релизов, замечать повторяющиеся шаблоны изменений и исправлять слабые привычки в релизах.

Анализ календаря инцидентов для повторяющихся сбоев релизов

Почему отдельные ретроспективы не показывают закономерность

Одна ретроспектива хорошо объясняет один сбой. А вот увидеть повторяемость она помогает гораздо хуже.

У каждого инцидента свои логи, свои люди, своя хронология и свой странный частный случай. После встречи команде часто кажется, что сбой был чем-то необычным. Обычно это не так. Детали меняются, но та же привычка в релизах снова и снова создает проблемы.

На одной неделе правка в конфигурации ломает вход в систему. Через две недели изменение прав доступа блокирует checkout. Через месяц миграция данных задерживает биллинг. Системы разные, а для бизнеса это один и тот же тип сбоев.

Команды еще и записывают инциденты так, как работают инженеры: по сервису, базе данных, очереди, API или приложению. Для отладки это полезно. Но при этом скрывается бизнес-процесс, который пострадал. Если регистрация, выставление счетов и обработка заказов зависят от нескольких систем, то обзор по системам превращает одну повторяющуюся проблему в несколько маленьких историй.

Заметки о релизах создают еще одну слепую зону. Там часто пишут "обновление backend" или "небольшая правка". Это слишком расплывчато, чтобы потом помочь. Нужно понимать, что именно изменилось: схема, выпуск feature flag, правило доступа, логика ценообразования или правка инфраструктуры. Такие категории повторяются, а вместе с ними повторяются и сбои.

Календарь меняет взгляд. Поместите инциденты в реальные даты и пометьте каждый по бизнес-процессу и типу релиза. Кластеры появляются быстро. Можно заметить, что проблемы для клиентов чаще всего возникают после пятничных изменений в авторизации, а сбои в биллинге случаются рядом с закрытием месяца и поспешными патчами.

Именно поэтому календарь часто рассказывает историю яснее, чем стопка заметок со встреч. CTO, который смотрит на шесть недель инцидентов, увидит закономерности, которых не покажет ни одна отдельная ретроспектива. Если три разных сбоя следуют за одним и тем же типом изменения, у команды не три уникальные проблемы. У нее одна повторяющаяся ошибка.

Что должно быть в календаре

Полезная запись в календаре короткая, но каждый раз должна отвечать на одни и те же вопросы. Если у одного инцидента аккуратная заметка, а у следующего — три расплывчатые строки, закономерность снова исчезает.

Сначала укажите точную дату и время, когда пользователи впервые почувствовали проблему. Не ограничивайтесь "во вторник утром" или "после деплоя". Релиз в 09:00 и ошибки у клиентов в 09:12 — это одна история. Ошибки в 16:40 — уже совсем другая. Если можно, отметьте и время восстановления сервиса. Так проще отличить изменения, которые падают сразу, от изменений, которые медленно разрушают систему.

Затем пишите не название системы, а тот бизнес-процесс, который сломался. "Checkout не работал" лучше, чем "проблема в сервисе платежей". "Пользователи не могли войти" понятнее, чем "просела авторизация". Люди покупают, входят в систему, загружают файлы, синхронизируют данные и утверждают счета. Именно эти действия должны быть в календаре, потому что они связывают сбой с реальной работой.

Тип релиза не менее важен. Разделяйте инциденты по тому, что именно изменилось: код, конфигурация, данные или инфраструктура. Многие команды сваливают все это в одну категорию "деплой" и теряют сигнал. Один этот признак часто и показывает главного виновника. Миграция данных, которая дважды в месяц ломает биллинг, — это не то же самое, что изменение инфраструктуры, которое выводит из строя вход в систему.

Пишите влияние на клиента простыми словами. Избегайте внутренних формулировок вроде "всплеск ошибок", если не объясняете, что именно увидели пользователи. "Новые клиенты не могли создать аккаунт 27 минут" — понятно. "Часть API-запросов не проходила" — нет.

В конце каждой записи фиксируйте реакцию, которая снизила ущерб: откат, hotfix или ручной обходной путь. Со временем это покажет, не решает ли команда снова и снова один и тот же класс проблемы одним и тем же экстренным способом.

Пример простой записи:

  • 14 мая, 09:12 UTC
  • Бизнес-процесс: клиенты не могли завершить checkout
  • Тип релиза: изменение конфигурации платежных настроек
  • Влияние на клиента: заказы не проходили 38 минут, просмотр каталога работал
  • Реакция: откатили конфигурацию, затем добавили проверку валидности перед релизом

Делайте каждую запись такой же простой. Если человек вне инженерной команды поймет, что пошло не так, за десять секунд, значит, вы фиксируете нужные детали.

Группируйте инциденты по бизнес-процессам

Большинство команд помечают инциденты названиями систем, потому что алерты, логи и дашборды используют именно их. Для инженеров это ускоряет отладку. Но это не показывает, какая часть бизнеса снова и снова страдает. Если пять разных сервисов ломаются, а каждый раз от этого падает checkout, повторяющаяся проблема — это checkout, а не пять отдельных систем.

Бизнес-метки работают лучше технических. Их могут читать люди вне инженерной команды, а инженеры при этом могут оставить названия сервисов в заметках об инциденте. Сам календарь должен отвечать на простой вопрос: какой клиентский или внутренний рабочий процесс остановился, замедлился или начал давать неправильный результат?

Начните с клиентских и внутренних потоков

Начните с тех потоков, о которых люди уже говорят на встречах и в обращениях в поддержку. Большинству команд достаточно короткого набора меток, например: signup, checkout, billing, reporting и доступ к аккаунту.

Так у всех появляется общий язык. Поддержка говорит: "billing снова сломался", а инженерная команда — "таймаут у worker в очереди", и при этом оба могут пометить инцидент как billing.

Список держите коротким. Если сделать двадцать категорий, люди перестанут ставить метки последовательно, и календарь станет шумным. Обычно в начале хватает пяти–восьми бизнес-процессов. Технические метки можно хранить отдельно для работы с root cause.

Разделяйте категорию только тогда, когда различаются шаблоны сбоев

Не делите процесс только потому, что он кажется широким. Делите его тогда, когда одна метка скрывает два шаблона, для которых нужны разные исправления.

Биллинг — хороший пример. Если одна группа инцидентов идет из-за продления подписок, а другая — из-за выгрузки счетов, одна метка "billing" может скрывать закономерность. Простой тест помогает: спросите, обычно ли это один и тот же владелец, один и тот же тип релиза и одно и то же исправление. Если да, оставляйте одну категорию. Если нет — разделяйте.

Именно здесь многие команды уходят слишком глубоко в детали. Метки вроде "checkout-api", "payment-service" и "tax-webhook" выглядят точными, но возвращают календарь к инженерному жаргону. Лучший календарь показывает, что по пятницам правки конфигурации ломают checkout, или что ежемесячная отчетность падает после миграций базы данных. На такие закономерности уже можно влиять.

Отдельно отслеживайте типы релизов

Календарь релизов становится намного понятнее, когда вы перестаете называть любое изменение просто "релизом". Новый код приложения, правка базы данных и ночное изменение конфигурации ломаются по-разному. Если все смешать, повторяющиеся проблемы останутся скрытыми.

Один и тот же сбой может возникать из-за очень разных изменений. Замедление поиска после выпуска функции — это одна история. Сбой входа после изменения переменной окружения — совсем другая.

Держите отдельные метки для тех типов изменений, которые ломают системы по разным причинам. Релизы продуктового кода стоит отделять от правок конфигурации: feature flag, secrets, rate limits, правила маршрутизации и переменные окружения. Изменения схемы базы данных заслуживают отдельной метки, потому что откат там сложнее, а ущерб часто выходит за пределы одного экрана. Ручные правки данных тоже должны быть отдельной категорией. Если кто-то редактирует записи в продакшене, импортирует данные вручную или запускает backfill, помечайте это как отдельный тип события. То же относится к обновлениям зависимостей и инфраструктуры: обновления библиотек, изменения базового образа, сетевых правил, настроек кластера или правки DNS.

Такое разделение быстро окупается. Команда может думать, что "checkout ломается после релизов", но календарь покажет, что checkout ломается только после правок конфигурации в промо-дни. Проблема с биллингом может выглядеть случайной, пока не выстроятся все инциденты после изменений схемы.

Обновления зависимостей требуют особого внимания. Команды часто смешивают их с обычными релизами функций, потому что деплой происходит в одно и то же время. Из-за этого скрывается частый сценарий: новая функция работает нормально, но обновление библиотеки меняет тайминг запросов, использование памяти или контракт API.

Инфраструктурным изменениям тоже нужна своя метка, даже если код приложения не менялся. Настройки кеша, правила ingress, лимиты диска и тюнинг очередей могут уронить стабильный продукт не хуже плохого деплоя.

Через несколько недель картина обычно становится намного проще. Может выясниться, что большинство инцидентов для клиентов связано с ручными правками и изменениями конфигурации, а не с релизами функций. Это подсказывает, куда в первую очередь ставить ревью, автоматизацию или защитные ограничения.

Соберите первый календарь

Соберите календарь инцидентов
Поможем превратить разрозненные сбои в простой помесячный обзор, которому команда сможет доверять.

Начните с небольшого окна, обычно за последние 60–90 дней. Этого достаточно, чтобы поймать повторы, но не утонуть в старых тикетах, наполовину готовых заметках и сменившихся сотрудниках.

Соберите все продакшн-инциденты в одном месте, включая мелкие, которые люди обычно отмахиваются. Пропущенный webhook, сломанный шаг регистрации и короткий сбой в биллинге должны попасть в один календарь, если пользователи их почувствовали.

Первая версия должна быть простой. Для каждого инцидента нужны только несколько полей: когда он начался, одна метка бизнес-процесса, одна метка типа релиза, короткая заметка о том, что сломалось, и примерное влияние на клиента.

Используйте одну метку бизнес-процесса на один инцидент. Выбирайте тот процесс, который реально испытал клиент или внутренняя команда: checkout, billing, login, onboarding, маршрутизация заказов или reporting.

То же самое для типа релиза. Используйте одну метку, которая описывает изменение, скорее всего вызвавшее проблему, например backend deploy, миграция базы данных, изменение feature flag, изменение инфраструктуры или ручная правка конфигурации.

Не ждите идеальной разметки. Если обе метки кажутся подходящими, выберите более удачную и двигайтесь дальше. Названия можно потом поправить. Сначала вам нужен календарь, который можно быстро просмотреть.

Вынесите все инциденты в общий помесячный обзор. Таблица, страница в вики или обычный календарь подойдут, если людям легко читать их с одного взгляда. Поместите инцидент в день, когда он начался, а затем добавьте две метки прямо в запись, чтобы закономерность была видна без открытия другого документа.

Когда время, процесс и тип релиза оказываются на одной странице, повторы уже трудно игнорировать. Если за шесть недель три billing-инцидента следуют за ручными правками конфигурации, это не невезение. Если сбои входа снова и снова появляются после мобильных релизов, это требует другого исправления, чем разовый сбой.

После первого прохода вы уже должны уметь показать на несколько дат и с опорой на факты сказать, какой процесс ломается чаще всего и какой тип изменения обычно это запускает.

Простой пример из продуктовой команды

Одна продуктовая команда постоянно сталкивалась с одной и той же неприятной пятничной проблемой. Ошибки в checkout начинались ближе к вечеру, как раз когда рос поток заказов. Клиенты все еще могли просматривать товары, добавлять их в корзину и применять скидки, но часть платежей не проходила или суммы считались неправильно. Каждый инцидент по отдельности выглядел небольшим, поэтому команда воспринимала их как отдельные баги.

Заметки в ретроспективах не выглядели драматично. На одной неделе кто-то поменял порог скидки. На следующей — обновили региональное правило ценообразования. Еще один раз подправили налоговые настройки для промоакции. Изменения в коде выглядели безобидно, а некоторые инциденты вообще не были связаны с кодом. Поэтому сбои было легко списать на невезение.

Потом команда стала помечать каждый инцидент по бизнес-процессу и типу релиза. Checkout получил одну метку. Изменения в ценовой конфигурации — другую. Деплои кода, работы по инфраструктуре и обновления контента — свои категории. Через шесть недель закономерность стала очевидной.

В эти пятницы снова и снова повторялся один и тот же сценарий:

  • поздно в пятницу вносили правку в ценовую конфигурацию
  • никто не делал повторную проверку, потому что изменение выглядело мелким
  • в течение следующего часа рос трафик
  • в checkout всплывали крайние случаи со скидками, налогами или суммой корзины
  • заказы начинали падать или цена отображалась неверно

Это изменило разговор. Команда перестала спрашивать: "Что на этот раз сломалось в checkout?" и начала спрашивать, почему люди продолжают менять правила ценообразования прямо перед пиком нагрузки. Календарь показал привычку в релизах, а не загадочный сбой в софте.

Первым исправлением не стала переработка. Команда перенесла обновления цен на более раннее время, запретила несрочные правки конфигурации перед пятничным наплывом и потребовала дополнительное ревью для любых правил, которые меняют суммы, налоги или скидки. Они также проверяли небольшой набор реальных сценариев корзины перед публикацией изменений. Сбои быстро сократились, потому что главной проблемой было поспешное управление изменениями, а не сломанный код checkout.

Ошибки, которые скрывают повторяющиеся сбои

Проведите аудит продакшн-процесса
Получите CTO-разбор, который связывает инциденты с бизнес-процессами и привычками релизов.

Календарь перестает помогать, когда команды пытаются отслеживать все сразу. Неряшливая запись может выглядеть подробной, но она мешает сравнивать. Через несколько недель люди перестают доверять меткам, а повторяющиеся сбои проходят мимо, потому что одна и та же проблема появляется под четырьмя разными названиями.

Слишком много меток быстро приводит именно к этому. Если один инцидент помечен как "checkout", другой как "payments", а третий как "order flow", никто уже не понимает, связаны ли они. Выберите небольшой набор меток для бизнес-процессов и держите их стабильными. Если во время ревью люди спорят о значении метки, таксономия уже слишком большая.

Еще одна частая ошибка — смешивать влияние на пользователя с технической причиной. "Пользователи не могли оформить заказ" и "неудачная миграция базы данных" — оба варианта полезны, но отвечают на разные вопросы. Держите их в разных полях. Если слить их в одну метку, вы не поймете, то ли один бизнес-процесс постоянно ломается, то ли один способ релиза постоянно приносит ущерб.

Хотфиксы должны идти отдельной дорожкой. Команды часто смешивают их с обычными релизами, потому что и там и там выкатывается код. Но так скрывается закономерность, которую вам, скорее всего, как раз и нужно увидеть. Срочные исправления обычно проходят меньше проверок, делаются поздно или под давлением. Если один и тот же бизнес-процесс снова и снова падает после хотфиксов, календарь должен это показать.

Почти-сбои тоже важны. Если инженер в 23:00 вручную чинит данные, а клиенты ничего не замечают, все равно запишите это. Ручное исправление — это предупреждение, а не победа. Многие повторяющиеся продакшн-проблемы начинаются как тихие ручные вмешательства, которые так и не попадают в журнал инцидентов.

Смена названий категорий каждый месяц тоже ломает аналитику. "Signup" превращается в "onboarding", потом в "new account flow", и история разваливается. Переименовывайте только при необходимости и переносите старые записи на новый термин, а не начинайте сначала.

Быстрая проверка помогает. Если ревьюеры постоянно спрашивают, что значит метка, если одна метка смешивает влияние сбоя и root cause, если хотфиксы теряются внутри обычных релизов или если ручные восстановления вообще не попадают в календарь, значит учет уже уезжает в сторону.

Здесь нужна скучная последовательность. Держите метки простыми, раздельными и стабильными, и повторяющиеся сбои станет гораздо легче заметить.

Вопросы для еженедельного обзора

Найдите повторяющийся сбой
Попросите Oleg посмотреть недавние инциденты и вывести их к одному шаблону релиза.

Еженедельный обзор должен занимать 15 минут, а не полдня. Откройте календарь, просмотрите последние четыре недели и ищите повторы. Цель не в идеальной классификации. Цель в том, чтобы рано увидеть одну и ту же боль.

Если один бизнес-процесс продолжает ломаться, считайте это реальной закономерностью. Checkout, биллинг или вход в систему, которые падают три раза за месяц, требуют внимания, даже если каждый раз была разная техническая причина. Клиентам не важно, почему это сломалось. Они видят, что одна и та же часть бизнеса снова и снова падает.

Обычно лучше всего работают несколько прямых вопросов:

  1. Какой бизнес-процесс ломался чаще всего?
  2. Какой тип релиза принес больше всего боли клиентам?
  3. Какой обходной путь снова и снова повторяется?
  4. Скапливаются ли инциденты в один и тот же день или час?
  5. Действительно ли последнее изменение процесса снизило число сбоев?

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

Не заканчивайте обзор расплывчатым планом "наблюдать дальше". Выберите одну закономерность, назначьте владельца и решите, что изменится до следующего обзора. Повторяющиеся продакшн-проблемы обычно никуда не уходят, пока кто-то не изменит лежащую в их основе привычку релизов.

Что делать с найденной закономерностью

Начинайте с одной повторяющейся проблемы, а не с десяти. Если пятничные вечерние API-релизы снова и снова ломают обработку заказов, меняйте именно эту привычку в первую очередь. Перенесите релиз на более безопасное время, добавьте проверку отката или потребуйте еще одного ревьюера. Небольшое правило, которое все соблюдают, лучше толстого регламента, который никто не читает.

Превратите закономерность в простое правило. Напишите его так, чтобы его за несколько секунд понял инженер, продакт-менеджер или основатель. Хорошие правила узкие. "Для релизов billing нужен тест на откат перед утверждением" — понятно. "Нужно быть аккуратнее с billing" — бесполезно.

Делайте правило коротким. Назовите тип релиза, назовите бизнес-процесс, который он бьет, опишите новую привычку и укажите, кто может сделать исключение.

Потом назначьте одного владельца календаря. Команды часто соглашаются, что учет важен, а после загруженной недели никто уже не обновляет записи. Один владелец поддерживает последовательность в датах, типах релизов, затронутых бизнес-процессах и заметках о причинах. Такая дисциплина делает закономерность видимой, а не дает ей раствориться в памяти.

Подождите достаточно, чтобы увидеть эффект от изменения. Проверяйте ту же закономерность после двух циклов релиза, а не после одного спокойного выката. Смотрите, стало ли инцидентов меньше, были ли сбои короче, восстановление быстрее и ошибок у клиентов меньше. Если ничего не меняется, правило слишком слабое, слишком расплывчатое или его слишком легко игнорировать.

Иногда закономерность держится, потому что сам процесс релизов грязный. Смешанные деплои, неясная зона ответственности и отсутствие шагов для отката могут месяцами скрывать настоящую причину. В таких случаях помогает внешний разбор. Oleg Sotnikov пишет и работает с такими проблемами релизов и операций на oleg.is, и разбор от fractional CTO может быть достаточным, чтобы ужесточить правила согласования, границы релизов и учет инцидентов без лишнего процесса.

Если billing и после следующих двух релизов все еще ломается, перестаньте смешивать изменения billing с другой работой. Разделите их, отслеживайте отдельно и посмотрите, станет ли календарь наконец спокойнее.

Часто задаваемые вопросы

Почему календарь инцидентов работает лучше, чем отдельные ретроспективы?

Календарь показывает повторы за несколько недель. Отдельные ретроспективы хорошо объясняют один сбой, но редко показывают, что один и тот же тип правки в конфигурации, миграции или хотфикса снова и снова бьет по одному и тому же бизнес-процессу.

Что должно быть в каждой записи об инциденте?

Делайте каждую запись короткой и одинаковой по структуре. Фиксируйте, когда пользователи впервые почувствовали проблему, какой бизнес-процесс сломался, какой тип релиза, вероятнее всего, ее вызвал, что увидели клиенты и что команда сделала, чтобы уменьшить ущерб.

Группировать инциденты по сервисам или по бизнес-процессам?

Сначала помечайте календарь по бизнес-процессам. Используйте такие метки, как checkout, биллинг, вход, отчеты или онбординг, чтобы было видно, какая часть бизнеса продолжает ломаться. Названия сервисов можно оставить в заметках об инциденте для отладки.

Сколько меток бизнес-процессов стоит завести сначала?

Начинайте с малого. Большинству команд хватает пяти–восьми меток, потому что так люди ставят их стабильнее. Разделяйте метку только тогда, когда она скрывает два разных шаблона сбоев, для которых нужны разные исправления.

Какие типы релизов нужно отслеживать отдельно?

Разделяйте типы релизов, потому что они ломаются по разным причинам. Держите отдельно продуктовый код, изменения в конфигурации, изменения в базе данных, ручные исправления данных, обновления зависимостей, хотфиксы и правки инфраструктуры, если они создают разные проблемы.

Нужно ли включать в календарь почти-сбои и ручные исправления?

Да. Добавляйте почти-сбои, ручные исправления и ночные экстренные правки, если пользователи почти почувствовали проблему или команде пришлось срочно вмешаться. Такие записи часто показывают закономерность еще до того, как случится большой инцидент.

На какой период назад строить первый календарь?

Начните с последних 60–90 дней. Так обычно хватает данных, чтобы увидеть повторы, но не утонуть в старых тикетах, недостающем контексте и устаревших привычках команды.

Какой инструмент лучше взять для первого календаря?

Используйте самый простой инструмент, который команда реально будет обновлять каждую неделю. Общая таблица, страница в вики или обычный календарь подойдут, если всем легко быстро просмотреть записи и прочитать метки без лишних документов.

Что нужно проверять каждую неделю?

Примерно раз в неделю уделяйте этому 15 минут и смотрите на последний месяц. Ищите бизнес-процесс, который ломался чаще всего, тип релиза, который принес больше всего боли клиентам, повторяющиеся обходные решения и любые временные кластеры, например пятничные вечера или конец месяца.

Что делать после того, как мы заметили закономерность?

Выберите одну повторяющуюся проблему и измените привычку релиза, которая за ней стоит. Перенесите изменение на более безопасное время, потребуйте еще одно ревью, добавьте проверку отката или отделите рискованную работу от обычных релизов. Потом посмотрите на следующие два цикла и проверьте, стали ли сбои реже.