Как искать причину ошибки при недоступности отчета в мобильном приложении
Что проверяют
Умеете ли вы искать причину по шагам, от симптома к конкретному звену, а не гадать. Интервьюеру важно, с чего вы начнёте и как быстро сузите круг. Следом обычно спрашивают, как вы убедитесь, что проблема именно на бэкенде, а не в приложении.
Как отвечать
Начните с масштаба: у всех пользователей или у части, на iOS или Android, на какой версии приложения, с какого момента. Ответ «с 14:00 и только на старой версии» уже почти называет причину.
Дальше пройдите путь запроса от клиента до данных:
- что видит клиент: HTTP-код и тело ответа.
401и403это авторизация,404часто означает сменившийся контракт API,5xxошибку сервиса, а таймаут без ответа указывает на долгую генерацию или обрыв на балансировщике; - сквозной идентификатор: по
traceIdиз OpenTelemetry илиX-Request-Idнаходите этот запрос в логах сервиса (ELK, Loki) и видите, на каком шаге он упал; - метрики: Micrometer и Prometheus покажут рост ошибок и задержек эндпоинта, исчерпание пула соединений к базе, паузы GC;
- что изменилось: последний деплой, миграция, фича-флаг, обновление приложения в сторе.
У отчётов есть свои типичные причины: тяжёлый запрос упирается в таймаут прокси (у nginx proxy_read_timeout по умолчанию 60 секунд), большой отчёт собирается целиком в памяти и роняет сервис с OutOfMemoryError, асинхронная задача генерации упала молча, ссылка на файл в хранилище истекла. На клиенте смотрите Crashlytics или Sentry: возможно, ответ приходит, а приложение не может его разобрать.
Закончите тем, как не допустить повтора: алерт на долю ошибок, тест на контракт API, лимит на размер отчёта.
Где спотыкаются
Сразу лезут в код генерации отчёта, не выяснив, у кого и когда воспроизводится. Час уходит на чтение кода, который не менялся.
Забывают про версию приложения. Бэкенд поменял формат ответа, новая сборка это учитывает, а старые клиенты у половины пользователей ломаются.
Предлагают перезапустить сервис как решение. Симптом может уйти, но причина останется, а вместе с процессом пропадёт и состояние памяти, которое можно было снять через heap dump.