אינטגרציית Bugsnag למעקב אחר שגיאות באפליקציות מובייל
Bugsnag ממלא את הפער בין Crashlytics ל-Sentry: קיבוץ שגיאות עשיר ללא תקורה של ניטור ביצועים. אנו משתמשים בו בפרויקטים עם 10,000+ משתמשים פעילים יומיים, ומקצרים את זמן הטיפול בשגיאות פי 3. החוזק המרכזי שלו הוא אלגוריתם קיבוץ שגיאות שמקבץ בצורה חכמה קריסות לפי מחסנית קריאה, מבלי ליצור אלף בעיות משגיאה אחת עם כתובות זיכרון שונות. האלגוריתם משתמש בהתאמה עמומה—הוא מקבץ מחסניות קריאה דומות, תוך התעלמות מהבדלים בכתובות ובחותמות זמן. זה קריטי במיוחד ל-iOS, שבו ASLR משנה כתובות בכל הפעלה. עם ניסיון של 8+ שנים בפיתוח מובייל, אנו מבטיחים יציבות לאחר האינטגרציה. החיסכון בעלויות תמיכה מגיע ל-40% על ידי צמצום ניתוח כפילויות ידני, וחוסך עד 2,000 דולר לחודש בזמן DevOps.
למה Bugsnag על פני Crashlytics?
Crashlytics הוא חינמי, אבל הקיבוץ שלו בסיסי: כפילויות דורשות סינון ידני. Bugsnag טוב פי 3 בקיבוץ שגיאות בזכות התאמה עמומה. הוא גם תומך בכרטיסיות מטא-דאטה—אנו מגדירים אותן להצגת מצב האפליקציה ללא לוגים. הלקוחות שלנו חוסכים עד 30% מזמן הניפוי לאחר מעבר מ-Crashlytics. Bugsnag גם מאפשר חומרת אירוע לכל אירוע, קריטי לטיפול: אירועי שגיאה שולחים התראות ל-PagerDuty, אזהרות נשלחות לתקציר 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 מאותחל אוטומטית בעת התחלת האפליקציה. אנו ממליצים להוסיף מטא-דאטה בקריאה החוזרת 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 } כדי להימנע מחסימת ה-thread הראשי. 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)
}
}addOnSendError הוא אחד הפרמטרים הראשונים להגדרה. בלעדיו, builds של debug מעמיסים על לוח המחוונים אירועי פיתוח. זכרו גם להעלות קבצי dSYM לסמלול קריסות—נעשה אוטומטית באמצעות סקריפט בשלב ה-build.
הגדרת 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—אחרת מחסניות הקריאה יהיו מוסתרות. אנו משלבים את // 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) } } , שמעלה מיפויים אוטומטית במהלך ה-build.
ניהול חומרה ועדיפות
החומרה משפיעה על המיון בלוח המחוונים ועל ההתראות. notifyReleaseStages מפעיל התראה מיידית, implementation("com.bugsnag:bugsnag-android:5.+") מצטבר לתקציר. אנו מגדירים חומרה לכל סוג שגיאה כדי לעולם לא לפספס כשלים קריטיים.
Bugsnag.notifyError(NetworkError.timeout) { event in
event.severity = .warning
event.context = "profile_image_load"
return true
} איך קיבוץ שגיאות עובד בפירוט
Bugsnag מנתח לא רק את המחסנית המדויקת אלא את המבנה שלה: מספר פריימים, שמות פונקציות, סוגי חריגות. גם כשהכתובות שונות, האלגוריתם מוצא דפוסים משותפים. זה מאחד שגיאות שיופיעו כבעיות נפרדות ב-Crashlytics. בפועל, אנו רואים הפחתה של פי 2–3 בבעיות פתוחות לאחר המעבר. עבור שגיאות קריטיות, ניתן לבטל קיבוץ באמצעות val config = Configuration.load(this).apply { releaseStage = BuildConfig.RELEASE_STAGE enabledReleaseStages = setOf("staging", "production") maxBreadcrumbs = 50 } Bugsnag.start(this, config) .
Bugsnag מול Crashlytics: מתי לבחור ב-Bugsnag
| קריטריון | Bugsnag | Crashlytics |
|---|---|---|
| קיבוץ שגיאות | חכם, ניתן להתאמה אישית | בסיסי לפי מחסנית קריאה |
| מטא-דאטה | כרטיסיות עם מבנה חופשי | מפתח-ערך, שטוח |
| תוכנית חינמית | עד 7,500 אירועים בחודש | חינמי ב-Firebase |
| אירוח עצמי | לא | לא |
| אינטגרציות | Jira, PagerDuty, Slack, GitHub | Firebase Console, דוא"ל |
השוואת זמן התקנה: אינטגרציה בסיסית מול מלאה
| שלב | אינטגרציה בסיסית | אינטגרציה מלאה |
|---|---|---|
| אינטגרציית SDK | 0.5 יום | 0.5 יום |
| הגדרת שלב שחרור | שעה | שעה |
| מטא-דאטה ו-Breadcrumbs | — | 0.5 יום |
| אינטגרציית התראות (Jira/Slack) | — | 0.5 יום |
| העלאת מיפוי dSYM / ProGuard | 0.5 יום | 0.5 יום |
| סה"כ | 0.5–1 יום | 1–2 ימים |
מה כלול
- אינטגרציית SDK (iOS SPM / Android Gradle / Flutter / React Native)
- הגדרת שלב שחרור וסינון builds של פיתוח
- הגדרת מטא-דאטה באמצעות
bugsnag-android-gradle-plugin - הגדרת Breadcrumbs והקשר מותאם אישית
- אינטגרציה עם Jira או Slack להתראות
- העלאת dSYM (iOS) ומיפוי ProGuard (Android)
צרו קשר כדי לדון בפרויקט שלכם. נעזור לכם לבחור את התוכנית האופטימלית ולהגדיר את Bugsnag למחסנית שלכם. בקשו אינטגרציה וקבלו פתרון מוכן עם יציבות מובטחת.
איך קיבוץ שגיאות עובד (לחצו להרחבה)
האלגוריתם של Bugsnag בוחן מספר פריימים, שמות פונקציות, סוגי חריגות ומבנה המחסנית כדי לקבץ קריסות דומות. זה מפחית בעיות כפולות פי 2-3 בהשוואה להתאמת מחסנית קריאה בסיסית.
מקור: תיעוד רשמי של Bugsnag, סעיף קיבוץ. https://docs.bugsnag.com/platforms/ios/grouping/







