Мониторинг и отчёты о сбоях
Понимать, что на самом деле происходит с приложением и сервером в production: сбои, ошибки, задержки и то, что тихо перестало работать. Альтернатива — узнавать об этом из отзыва на одну звезду.
Почему это важно. Большинство проблем в production так и не превращаются в обращение в поддержку. Пользователь пробует ещё раз, сдаётся и уходит. Без телеметрии такие отказы не видны: приложение выглядит совершенно исправным ровно до того момента, когда об обратном скажут цифры удержания.
Что нужно понимать
- Что нужно знать, чтобы поставить диагноз, не воспроизводя проблему
- Какие сигналы говорят, что пользователю плохо, а какие — лишь о том, что сработала строчка в логе
- Ради чего стоит будить человека ночью, а что достаточно вывести на дашборд
- Отсутствие ошибок — это здоровье системы или слепота наблюдения
- Какие персональные данные собирает ваша телеметрия — намеренно или нет
Основные темы
Сбои и ошибки
- Нативные сбои и исключения Dart — и разница в том, что вы получаете на выходе
- Символикация и деобфускация, загрузка карты символов на этапе сборки
- Группировка, чтобы тысяча отчётов складывалась в одну проблему
- Нефатальные ошибки — обычно именно они и есть главная беда
- Доля сессий без сбоев (crash-free rate) как главная цифра
Контекст
- Что прикладывать: версию, маршрут, действие пользователя, устройство, состояние сети
- Цепочка событий (breadcrumbs), которая привела к сбою
- Идентификаторы пользователя, которыми может воспользоваться поддержка и которые не нарушают приватность
- Достаточно данных, чтобы воспроизвести, но не дневник чужой сессии
Не только сбои
- Задержки и доля ошибок на границе API
- Отказы, от которых приложение оправилось и о которых никому не сообщило
- Бизнес-сигналы: регистрации, покупки, отправки — и их отсутствие
- Структурированные логи, по которым действительно можно строить запросы
Оповещения
- Оповещать о симптомах, которые чувствует пользователь, а не о каждой аномалии
- Пороги, которые учитывают нормальный разброс значений
- Оповещения на тишину: задача перестала запускаться, метрика легла в ровную линию
- Усталость от оповещений: то, что никто не читает, хуже, чем ничего
Реакция
- Триаж: насколько всё плохо, скольких затронуло, с какого момента
- Сопоставление с релизом
- Замыкание цикла: от инцидента к тесту или защитной проверке
Уровни
| Уровень | Как это выглядит |
|---|---|
| Junior | Подключает систему сбора отчётов о сбоях и заглядывает в неё, когда попросят. |
| Middle | Добавляет полезный контекст и цепочки событий, сообщает о нефатальных ошибках, следит за crash-free rate вокруг релизов. |
| Senior | Измеряет то, что реально испытывает пользователь, настраивает оповещения по симптомам и замыкает путь от инцидента к его предотвращению. |
Практика
Для начала
-
Сломайте приложение намеренно Вызовите сбой в release-сборке и убедитесь, что отчёт дошёл — читаемым и с восстановленными символами.
-
Приложите контекст Добавьте текущий маршрут и последнее действие и посмотрите, насколько быстрее ставится диагноз.
-
Сообщите о проглоченной ошибке Найдите
catch, который прячет сбой, и отправьте его как нефатальную ошибку.
Глубже
-
Оповещение по симптому Настройте оповещение на то, что чувствует пользователь, и доводите его до состояния, когда ему можно доверять.
-
Оповещение на тишину Сделайте так, чтобы пропавшая метрика поднимала тревогу.
-
Понаблюдайте за релизом Сравните crash-free rate и долю ошибок с предыдущей версией, задав порог, при котором раскатка останавливается.
Проверьте себя
- Как вы узнаете, что приложение падает на одной-единственной модели устройства?
- Какой у вас crash-free rate и каким он был в прошлом релизе?
- Какие ошибки приложение проглатывает, никуда о них не сообщая?
- Какой контекст приходит вместе со сбоем и хватает ли его для диагноза?
- Какие из ваших оповещений команда научилась игнорировать?
- Что подскажет, что фоновая задача перестала выполняться месяц назад?
Ресурсы
- Google SRE Book: Monitoring Distributed Systems — симптомы против причин и четыре золотых сигнала. Глава, после которой люди иначе выбирают, на что настраивать оповещения.
- Error reporting in Flutter — как правильно перехватывать ошибки Dart и самого фреймворка; без этого сообщать попросту не о чем.
- Firebase Crashlytics — самый распространённый выбор для мобильных приложений: загрузка символов, отправка нефатальных ошибок.
- Sentry for Flutter — покрывает приложение и сервер в одном месте, с хорошей документацией по цепочкам событий и здоровью релиза.
- Google SRE Workbook: Alerting on SLOs — как настраивать оповещения по целям, заметным пользователю, а не по сырым метрикам, вместе с математикой burn rate.