Что вы делали в случае поломки сервиса на production?

Ответ

Мой алгоритм действий при инциденте на production строится по принципу «сначала стабилизировать, потом исправлять».

  1. Быстрая диагностика и стабилизация:

    • Первым делом смотрю на дашборды мониторинга (Grafana, Datadog) и логи (ELK, Loki) для определения масштаба и симптомов: возросла ли ошибка 5xx, упала ли скорость ответа, появились ли алерты.
    • Если сервис полностью недоступен, проверяю здоровье инстансов и балансировщиков. В критичных случаях временно переключаю трафик на предыдущую стабильную версию (откат деплоя) или включаю деградированный режим работы (feature flags).
  2. Локализация и исправление:

    • Анализирую стек-трейсы в Sentry/Bugsnag и метрики для поиска корневой причины. Часто это помогает быстро найти проблемный коммит или конфигурационное изменение.
    • Если проблема в коде, готовлю минимальный hotfix. Например, если обнаружил NullPointerException:
      
      // Было:
      return user.getProfile().getName();

    // Срочный фикс: return Optional.ofNullable(user) .map(User::getProfile) .map(Profile::getName) .orElse("Unknown");

    
    *   Фикс прогоняю через быстрые smoke-тесты на staging и деплою через канареечный релиз или сразу на все прод-ноды, если проблема критическая.
  3. Пост-обработка:

    • После восстановления сервиса обязательно пишу постмортем. В нем фиксирую временную шкалу инцидента, корневую причину, предпринятые действия и, самое главное, action items по предотвращению повторения: добавить недостающий тест, улучшить мониторинг конкретного показателя, исправить архитектурную слабость.
    • Информирую команду и заинтересованные стороны о результатах расследования.

Ответ 18+ 🔞

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

  1. Быстрая диагностика и стабилизация:

    • Первым делом — паника? Не, не слышал. Лечу смотреть на дашборды (Grafana, Datadog) и логи (ELK, Loki). Надо понять масштаб: ошибки 5xx зашкаливают, latency улетела в космос, алерты орут как резаные? Волнение ебать, но надо.
    • Если сервис просто лёг и не дышит, проверяю инстансы и балансировщики. В совсем пиздецовом случае — быстрый откат на прошлую версию или включаю заглушки через feature flags. Главное — остановить кровотечение, а потом уже думать, почему нож оказался в спине.
  2. Локализация и исправление:

    • Тут включается режим детектива. Роюсь в стек-трейсах из Sentry и метриках, ищу корень зла. Часто виноват какой-нибудь свежий коммит, который все проглядели. Подозрение ебать чувствую к последним изменениям.
    • Если баг в коде — готовлю срочный патч. Вот, например, классика — NullPointerException вылез, потому что кто-то был уверен, что объект всегда не null. Ёпта.
      
      // Было: наивно и опасно
      return user.getProfile().getName();

    // Срочный фикс: пришлось обернуть в Optional, чтоб не падало return Optional.ofNullable(user) .map(User::getProfile) .map(Profile::getName) .orElse("Unknown");

    
    *   Этот костыль быстренько прогоняю через smoke-тесты на staging и вкатываю на прод. Если всё горит — то через канареечный релиз, если уже всё сгорело — то сразу на все ноды. **Терпения ноль ебать**, надо чинить.
  3. Пост-обработка:

    • После того как всё устаканилось, самое важное — не разбежаться. Обязательно пишу постмортем. Не для галочки, а чтобы в будущем не наступать на те же грабли. Фиксирую таймлайн: когда началось, когда обнаружили, когда пофиксили. Ищу коренную причину — не «упал сервис», а «не было обработки случая, когда БД временно недоступна».
    • И самое главное — action items. Не просто «будьте аккуратнее», а конкретика: «добавить интеграционный тест для сценария X», «настроить алерт на метрику Y», «переписать модуль Z, потому что он — сплошная манда с ушами». Потом с этим всем иду к команде и стейкхолдерам — отчитываюсь, что случилось и как будем жить дальше. Чтобы доверия ебать ноль не стало.