Інтеграція Bugsnag для відстеження помилок мобільного додатку
Bugsnag займає нішу між Crashlytics і Sentry: багате групування помилок без overhead performance-трейсингу. Ми використовуємо його в проєктах з 10k+ DAU — це скорочує час на triage у 3 рази. Основна сила — алгоритм error grouping, який інтелектуально групує краші за стектрейсом, не створюючи тисячу issue з однієї помилки з різними адресами пам'яті. Алгоритм використовує fuzzy matching — він кластеризує схожі stack trace, ігноруючи відмінності в адресах та часових мітках. Це особливо важливо для iOS, де ASLR змінює адреси при кожному запуску. У нас 8+ років досвіду в мобільній розробці, і ми гарантуємо стабільність після інтеграції. Економія на підтримці сягає 40% за рахунок скорочення ручного аналізу дублікатів.
Чому Bugsnag, а не Crashlytics?
Crashlytics безкоштовний, але його групування базове: дублікати доводиться розбирати вручну. Bugsnag групує в 3 рази точніше завдяки fuzzy matching. Він також підтримує вкладки метаданих — ми налаштовуємо їх так, щоб бачити стан додатку без логів. Наші клієнти економлять до 30% часу на налагодження після переходу з Crashlytics. Крім того, Bugsnag дозволяє задавати Severity на рівні події, що критично для triage: error-події надсилають алерт у PagerDuty, warning — у дайджест Slack. Така гнучкість недоступна в Crashlytics.
Як налаштувати метадані для швидкої діагностики?
Метадані структуруються по вкладках у кожному баг-репорті. Нижче приклад конфігурації для iOS — секція app_state з'являється окремою вкладкою, показуючи користувача, підписку та кошик.
Bugsnag.addOnSendError { event in event.addMetadata([ "user_id": userId, "subscription": "premium", "cart_items": cartCount ], section: "app_state") event.setUser(userId, withEmail: email, andName: name) return true } Для Android конфігурація аналогічна — SDK ініціалізується автоматично при старті Application. Рекомендуємо додавати метадані на етапі addOnSendError, щоб не блокувати основний потік. Breadcrumbs автоматично логуються при кожній значущій дії користувача, що дає повну картину перед крашем.
Підключення на iOS
// Package.swift або SPM у Xcode // https://github.com/bugsnag/bugsnag-cocoa import Bugsnag @main struct MyApp: App { init() { let config = BugsnagConfiguration.loadConfig() config.apiKey = "YOUR_API_KEY" config.releaseStage = Bundle.main.infoDictionary?["ReleaseStage"] as? String ?? "production" config.notifyReleaseStages = ["staging", "production"] Bugsnag.start(with: config) } } notifyReleaseStages — один із перших параметрів, який варто налаштувати. Без нього debug-збірки засмічують дашборд подіями розробки. Також не забудьте завантажити dSYM-файли для символізації кражів — це робиться автоматично через скрипт у build phase.
Підключення на Android
implementation("com.bugsnag:bugsnag-android:5.+") Ініціалізація з кастомною конфігурацією:
val config = Configuration.load(this).apply { releaseStage = BuildConfig.RELEASE_STAGE enabledReleaseStages = setOf("staging", "production") maxBreadcrumbs = 50 } Bugsnag.start(this, config) Для Android критично налаштувати ProGuard/R8 mapping file — інакше стектрейси будуть обфусковані. Ми підключаємо плагін bugsnag-android-gradle-plugin, який автоматично завантажує mapping при збірці.
Severity та управління пріоритетом
Severity впливає на сортування в дашборді та алерти. error — негайне сповіщення, warning — агрегування в дайджест. Ми налаштовуємо Severity для кожного типу помилок, щоб не пропустити критичні збої.
Bugsnag.notifyError(NetworkError.timeout) { event in event.severity = .warning event.context = "profile_image_load" return true } Як працює error grouping в деталях?
Bugsnag аналізує не лише точний стек, але й його структуру: кількість фреймів, імена функцій, типи винятків. Навіть якщо адреси різняться, алгоритм знаходить спільний патерн. Це дозволяє об'єднувати помилки, які в Crashlytics виглядали б як різні. На практиці ми спостерігаємо скорочення кількості відкритих issue у 2–3 рази після міграції. Для критичних помилок можна вимкнути групування через groupingHash.
Bugsnag vs Crashlytics: коли обрати Bugsnag
| Критерій | Bugsnag | Crashlytics |
|---|---|---|
| Групування помилок | Інтелектуальне, налаштовуване | Базове за стектрейсом |
| Метадані | Вкладки з довільною структурою | Key-value, flat |
| Безкоштовний план | До 7500 подій/міс | Безкоштовно у Firebase |
| Self-hosted | Немає | Немає |
| Інтеграції | Jira, PagerDuty, Slack, GitHub | Firebase Console, Email |
Порівняння часу налаштування: базова vs повна інтеграція
| Етап | Базова інтеграція | Повна інтеграція |
|---|---|---|
| Підключення SDK | 0,5 дня | 0,5 дня |
| Налаштування release stages | 1 година | 1 година |
| Метадані та breadcrumbs | — | 0,5 дня |
| Інтеграція з алертами (Jira/Slack) | — | 0,5 дня |
| Upload dSYM / ProGuard mapping | 0,5 дня | 0,5 дня |
| Разом | 0,5–1 день | 1–2 дні |
Що входить в роботу
- Підключення SDK (iOS SPM / Android Gradle / Flutter / React Native) — від $500
- Налаштування release stages та фільтрація dev-збірок
- Конфігурація метаданих через
addOnSendError - Налаштування breadcrumbs та кастомного контексту
- Інтеграція з Jira або Slack для алертів
- Upload dSYM (iOS) та ProGuard mapping (Android)
Замовте інтеграцію під ключ — ми оцінимо ваш проєкт всього за 1 день. Напишіть нам, і ми підготуємо пропозицію з фіксованою вартістю.
Джерело: офіційна документація Bugsnag, розділ Grouping. https://docs.bugsnag.com/platforms/ios/grouping/







