Ответ
При возникновении критической ошибки в продакшене главное — действовать быстро, системно и без паники. Алгоритм можно разделить на несколько этапов:
1. Стабилизация системы (Triage & Stabilization)
- Немедленный откат: Если сбой произошел сразу после выката новой версии, самое быстрое решение — откатить развертывание до предыдущей стабильной версии.
- Отключение функционала: Если проблема связана с конкретной функцией, можно временно отключить ее с помощью feature flag (флага функциональности), не затрагивая остальную часть системы.
2. Сбор информации и диагностика (Investigation)
- Анализ логов: Изучить централизованные логи (например, в ELK Stack, Loki) на предмет сообщений об ошибках, паниках и их стектрейсов.
panic
в Go обычно логируется автоматически. - Анализ метрик: Проверить дашборды мониторинга (Grafana) на аномалии: всплески CPU/memory, количество ошибок, время ответа.
- Воспроизведение в тестовом окружении: Попытаться воспроизвести ошибку на staging- или dev-среде, чтобы безопасно ее отладить. Для этого пишутся минимальные воспроизводимые примеры или интеграционные тесты.
3. Поиск и устранение причины (Root Cause Analysis & Fix)
- Отладка: Используйте дебаггер, например,
dlv
(Delve), для пошагового анализа кода. - Профилирование: Если проблема связана с производительностью или утечками, используйте
pprof
для анализа CPU, памяти и горутин. - Детектор гонок (Race Detector): Скомпилируйте и запустите приложение с флагом
-race
в тестовой среде, чтобы выявить потенциальные состояния гонки. - Восстановление после паники: В критически важных горутинах можно использовать
recover
для перехвата паники, чтобы она не привела к падению всего приложения. Важно залогировать ошибку и стек вызовов перед завершением горутины.defer func() { if r := recover(); r != nil { log.Printf("PANIC recovered: %vn%s", r, debug.Stack()) } }()
4. Развертывание исправления и постмортем (Deploy & Post-mortem)
- После исправления и тщательного тестирования выкатить новую версию.
- Провести постмортем — анализ инцидента с командой, чтобы понять, почему он произошел и как предотвратить подобные проблемы в будущем (например, улучшить покрытие тестами, добавить новые алерты).