Интеграция Bugsnag для отслеживания ошибок мобильного приложения
Bugsnag занимает нишу между Crashlytics и Sentry: более богатая группировка ошибок, чем у Firebase, но без overhead performance-трейсинга из Sentry. Основная сила — алгоритм 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 |
|---|---|---|
| Группировка ошибок | Интеллектуальная, настраиваемая | Базовая по стектрейсу |
| Метаданные | Вкладки с произвольной структурой | Key-value, flat |
| Бесплатный план | Ограниченный (до 7500 событий/мес) | Бесплатно в Firebase |
| Self-hosted | Нет | Нет |
| Интеграции | Jira, PagerDuty, Slack, GitHub | Firebase Console, Email |
Bugsnag оправдан там, где команда тратит время на разбор дубликатов в Crashlytics. Хорошая группировка окупается при объёме 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 дня. Стоимость рассчитывается индивидуально.







