Інтеграція Bugsnag для відстеження помилок мобільного додатка
Bugsnag займає нішу між Crashlytics та Sentry: більш багата группировка помилок, ніж у Firebase, але без overhead performance-трейсингу з Sentry. Основна сила — алгоритм intelligent error grouping: Bugsnag групує схожі краші по стектрейсу інтелектуально, не створюючи тисячу окремих issue з однієї помилки з різними адресами пам'яті. У проектах з великою аудиторією це різко спрощує приоритизацію.
Підключення на 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-сборки засоряють панель управління подіями розробки.
Підключення на Android
implementation("com.bugsnag:bugsnag-android:5.+")
В AndroidManifest.xml:
<meta-data android:name="com.bugsnag.android.API_KEY" android:value="YOUR_API_KEY"/>
SDK автоматично ініціалізується при старті Application. Для кастомної конфігурації:
val config = Configuration.load(this).apply {
releaseStage = BuildConfig.RELEASE_STAGE
enabledReleaseStages = setOf("staging", "production")
maxBreadcrumbs = 50
}
Bugsnag.start(this, config)
Збагачення контексту
Bugsnag особливо добре працює з метаданими — вони структуровані за табами в кожному баг-репорті:
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
}
Секція app_state з'явиться окремою вкладкою в інтерфейсі Bugsnag. Швидко видно стан додатка в момент помилки без розбору логів.
Severity та управління пріоритетом
// Явно позначити помилку як некритичну
Bugsnag.notifyError(NetworkError.timeout) { event in
event.severity = .warning
event.context = "profile_image_load"
return true
}
Severity впливає на сортування у панелі управління та на алерти. error — попадає в Slack/PagerDuty одразу, warning — агрегується в дайджест.
Bugsnag vs Crashlytics: коли вибрати Bugsnag
| Критерій | Bugsnag | Crashlytics |
|---|---|---|
| Groupировка помилок | Інтелектуальна, налаштовувана | Базова по стектрейсу |
| Метадані | Вкладки з довільною структурою | Key-value, flat |
| Безплатний план | Обмежений (до 7500 подій/мес) | Безплатно у Firebase |
| Self-hosted | Ні | Ні |
| Інтеграції | Jira, PagerDuty, Slack, GitHub | Firebase Console, Email |
Bugsnag виправданий там, де команда витрачає час на розбір дубликатів у Crashlytics. Хороша groupировка окупається при обсязі 10k+ DAU.
Що входить до роботи
- Підключення SDK (iOS SPM / Android Gradle / Flutter / React Native)
- Конфігурація release stages та фільтрація dev-сборок
- Конфігурація метаданих через
addOnSendError - Налаштування breadcrumbs та кастомного контексту
- Інтеграція з Jira або Slack для алертів
- Upload dSYM (iOS) та ProGuard mapping (Android)
Сроки
Базова інтеграція: 0,5–1 день. Повна налаштування з метаданими та інтеграціями: 1–2 дні. Вартість розраховується індивідуально.







