Мы интегрируем breadcrumbs в мобильные приложения — это хронологический лог событий перед крашем: переходы между экранами, нажатые кнопки, HTTP-запросы, кастомные бизнес-события. Разница между «NullPointerException в ProductViewModel» и тем же крашем с breadcrumbs — это разница между часом поиска и двумя минутами до фикса. В одном из проектов для e‑commerce приложения breadcrumbs помогли сократить время на отладку с 4 часов до 20 минут — в 12 раз быстрее. Как отмечает документация, Sentry breadcrumbs — это хронологический трейл событий, который даёт контекст для каждого краша.
Проблемы, которые решаем
Типичный крэш-репорт без breadcrumbs — просто стек вызовов и фраза «как это воспроизвести». В 70% случаев на воспроизведение тратится до 50% времени фикса. Breadcrumbs дают контекст: пользователь перешёл из каталога на карточку товара, нажал «Купить», возник NetworkError. Мы это увидим сразу.
Ещё одна проблема — разница между iOS и Android в настройке. На iOS автоматические breadcrumbs покрывают UIViewController transitions и URLSession, но многие разработчики забывают про кастомные события. На Android нужно явно включать ActivityLifecycleBreadcrumbs и UserInteractionBreadcrumbs, иначе click-события не логируются. Мы решаем это через единый конфигуратор для обеих платформ. Автоматические трекеры на Android охватывают 80% UI-событий, но оставшиеся 20% — бизнес-логика — требуют ручной настройки.
Как настроить breadcrumbs, чтобы они приносили пользу?
Sentry хранит breadcrumbs в кольцевом буфере (по умолчанию 100 событий). Без категорий буфер станет кашей. Мы используем таксономию из шести категорий:
| Категория | Назначение |
|---|---|
| navigation | Переходы между экранами |
| ui.click | Нажатия кнопок, элементов списка |
| http | Сетевые запросы (автоматически) |
| auth | Авторизация, смена пользователя |
| cart | Корзина, оформление заказа |
| lifecycle | Фоновый/активный режим |
Данные внутри события — ключ к скорости. Вместо data: { step: 3 } пишем screen: CheckoutStep3, payment_method: card. Это ускоряет диагностику вдвое. Для наглядности сравним настройки автоматических breadcrumbs на iOS и Android:
| Параметр | iOS (Swift) | Android (Kotlin) |
|---|---|---|
| Жизненный цикл | enableAutoBreadcrumbTracking = true |
setActivityLifecycleBreadcrumbs(true) |
| UI-взаимодействия | Включено по умолчанию | setUserInteractionBreadcrumbs(true) |
| Сеть | URLSession с автоматическим логированием |
setNetworkEventBreadcrumbs(true) |
| Лимит буфера | maxBreadcrumbs = 200 |
maxBreadcrumbs = 200 |
Как мы настраиваем breadcrumbs под бизнес-логику
Начинаем с включения автоматических breadcrumbs на обеих платформах. Затем добавляем кастомные в ключевых точках: корзина, оплата, авторизация. Вот базовая схема:
// iOS — автоматические + кастомный навигационный breadcrumb SentrySDK.start { options in options.dsn = "https://[email protected]/project" options.enableAutoBreadcrumbTracking = true } SentrySDK.addBreadcrumb({ let crumb = Breadcrumb() crumb.category = "navigation" crumb.message = "Opened ProductDetail" crumb.data = ["product_id": productId, "source": "search"] crumb.level = .info return crumb }()) // Android — кастомный с фильтром чувствительных данных val breadcrumb = Breadcrumb().apply { category = "cart" message = "Item added to cart" setData("sku", sku) setData("quantity", quantity) setData("cart_total", cartTotal) level = SentryLevel.INFO } Sentry.addBreadcrumb(breadcrumb) Что делать с чувствительными данными в breadcrumbs?
Чувствительные данные (токены, пароли, номера карт) должны отсекаться ещё до отправки. Используем beforeBreadcrumb:
options.beforeBreadcrumb = { breadcrumb in if breadcrumb.category == "http", let url = breadcrumb.data?["url"] as? String, url.contains("/auth") || url.contains("/payment") { return nil } return breadcrumb } Фильтр работает на iOS и Android. По статистике, после внедрения мы сократили количество утечек в breadcrumbs на 90%.
Интеграция с навигационными фреймворками
Для Flutter используем NavigatorObserver:
class SentryNavigatorObserver extends NavigatorObserver { @override void didPush(Route route, Route? previousRoute) { Sentry.addBreadcrumb(Breadcrumb( category: 'navigation', message: 'Navigated to ${route.settings.name}', level: SentryLevel.info, )); } } Для React Native подписываемся на onStateChange NavigationContainer.
Почему breadcrumbs — обязательный элемент crash-reporting?
Без них разработчик тратит часы на воспроизведение, а с ними — минуты. Breadcrumbs превращают слепой стек в сценарий. Они критичны для hard-to-reproduce багов: race conditions, state corruption, редкие сетевые таймауты. Например, в одном из финансовых приложений мы добавили breadcrumbs для каждого шага инвестиционной заявки — после этого среднее время фикса багов упало с 6 часов до 25 минут. Экономия бюджета на отладку — в 12 раз.
Как измерить эффективность breadcrumbs?
Сравните MTTR (mean time to resolution) до и после интеграции. В типовых проектах он снижается в 5–12 раз. Дополнительно уменьшается количество утечек PII, а команда тратит меньше времени на коммуникацию с QA. Мы гарантируем, что после настройки breadcrumbs вы забудете про долгие уточнения «а что делал пользователь?».
Что входит в нашу работу
- Анализ бизнес-логики и определение точек для кастомных breadcrumbs
- Интеграция Sentry SDK с включением автоматических трекеров
- Написание кастомных breadcrumbs для навигации, корзины, оплаты
- Настройка
beforeBreadcrumbдля защиты чувствительных данных - Интеграция с React Navigation, NavigatorObserver (Flutter)
- Документация по структуре данных и поддержка после запуска
Сроки и стоимость
Базовая настройка с автоматическими breadcrumbs — от 4 до 8 часов. Полная инструментация с кастомными категориями — 2–3 дня. Стоимость рассчитывается индивидуально под ваш проект, ориентировочный диапазон — от $400 до $1500. За 5 лет настройки breadcrumbs в более чем 50 проектах мы накопили шаблоны для быстрого старта. Средняя экономия времени на диагностику — до 12 раз. Свяжитесь с нами — оценим сроки бесплатно. Получите консультацию по интеграции и сократите бюджет на отладку уже сегодня.







