אנו משלבים פירורי לחם ביישומים ניידים — יומן כרונולוגי של אירועים לפני קריסה: מעברי מסך, הקשות על כפתורים, בקשות HTTP, אירועים עסקיים מותאמים אישית. ההבדל בין 'NullPointerException ב-ProductViewModel' לבין אותה קריסה עם פירורי לחם הוא ההבדל בין שעת חיפוש לשתי דקות לתיקון. בפרויקט מסחר אלקטרוני אחד, פירורי לחם צמצמו את זמן הניפוי מ-4 שעות ל-20 דקות — פי 12 מהר יותר. כפי שמצוין בתיעוד, פירורי הלחם של Sentry הם מסלול כרונולוגי של אירועים המספקים הקשר לכל קריסה.
בעיות שאנו פותרים
דוח קריסה טיפוסי ללא פירורי לחם הוא רק מחסנית קריאה והביטוי 'איך לשחזר'. ב-70% מהמקרים, השחזור תופס עד 50% מזמן התיקון. פירורי לחם מספקים הקשר: המשתמש ניווט מהקטלוג לכרטיס המוצר, הקיש על 'קנה', אירעה שגיאת NetworkError. אנו רואים זאת מיד.
בעיה נוספת היא ההבדל בין iOS ל-Android בהתקנה. ב-iOS, פירורי לחם אוטומטיים מכסים מעברי UIViewController ו-URLSession, אך מפתחים רבים שוכחים אירועים מותאמים אישית. ב-Android, יש להפעיל במפורש ActivityLifecycleBreadcrumbs ו-UserInteractionBreadcrumbs, אחרת אירועי לחיצה לא מתועדים. אנו פותרים זאת עם מגדיר אחיד לשתי הפלטפורמות. עוקבים אוטומטיים ב-Android מכסים 80% מאירועי הממשק, אך 20% הנותרים — לוגיקה עסקית — דורשים הגדרה ידנית.
כיצד להגדיר פירורי לחם כך שיהיו שימושיים
Sentry מאחסנת פירורי לחם במאגר טבעתי (ברירת מחדל 100 אירועים). ללא קטגוריות, המאגר הופך לבלאגן. אנו משתמשים בטקסונומיה של שש קטגוריות:
| קטגוריה | מטרה |
|---|---|
| navigation | מעברי מסך |
| ui.click | הקשות על כפתורים, הקשות על פריטי רשימה |
| http | בקשות רשת (אוטומטי) |
| auth | אימות, החלפת משתמש |
| cart | עגלה, ביצוע הזמנה |
| lifecycle | מצב רקע/חזית |
הנתונים בתוך האירוע הם המפתח למהירות. במקום data: { step: 3 } אנו כותבים screen: CheckoutStep3, payment_method: card. זה מקצר את זמן האבחון בחצי. להמחשה, השוו הגדרות פירורי לחם אוטומטיות ב-iOS וב-Android:
| פרמטר | iOS (Swift) | Android (Kotlin) |
|---|---|---|
| מחזור חיים | enableAutoBreadcrumbTracking = true |
setActivityLifecycleBreadcrumbs(true) |
| אינטראקציות ממשק | מופעל כברירת מחדל | setUserInteractionBreadcrumbs(true) |
| רשת | URLSession עם רישום אוטומטי |
setNetworkEventBreadcrumbs(true) |
| מגבלת מאגר | maxBreadcrumbs = 200 |
maxBreadcrumbs = 200 |
כיצד אנו מגדירים פירורי לחם ללוגיקה עסקית
אנו מתחילים בהפעלת פירורי לחם אוטומטיים בשתי הפלטפורמות. לאחר מכן אנו מוסיפים מותאמים אישית בנקודות מפתח: עגלה, תשלום, התחברות. הנה הסכימה הבסיסית:
// 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) מה לעשות עם נתונים רגישים בפירורי לחם?
יש לסנן נתונים רגישים (טוקנים, סיסמאות, מספרי כרטיסים) לפני השליחה. השתמשו ב-// 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 }()) :
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. לאחר היישום, צמצמנו דליפות נתונים בפירורי לחם ב-90%.
אינטגרציה עם מסגרות ניווט
עבור Flutter, השתמשו ב-// 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) :
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, הירשמו ל-beforeBreadcrumb של NavigationContainer.
מדוע פירורי לחם הם מרכיב חובה בדיווחי קריסה
ללא הם, מפתחים מבזבזים שעות בשחזור; עם הם, דקות. פירורי לחם הופכים מחסנית עיוורת לתרחיש. הם קריטיים לבאגים שקשה לשחזר: תנאי מרוץ, שחיתות מצב, פסקי זמן נדירים ברשת. לדוגמה, באפליקציית פינטק אחת הוספנו פירורי לחם לכל שלב בבקשת השקעה — לאחר מכן, זמן תיקון הבאגים הממוצע ירד מ-6 שעות ל-25 דקות. חיסכון בתקציב הניפוי — פי 12.
כיצד למדוד את יעילות פירורי הלחם?
השוו MTTR (זמן ממוצע לפתרון) לפני ואחרי האינטגרציה. בפרויקטים טיפוסיים, הוא יורד פי 5–12. בנוסף, דליפות PII פוחתות, והצוות מבלה פחות זמן בתקשורת עם QA. אנו מבטיחים שאחרי הגדרת פירורי לחם, תשכחו מבירורים ארוכים כמו 'מה המשתמש עשה?'.
מה כוללת העבודה שלנו
- ניתוח לוגיקה עסקית וזיהוי נקודות לפירורי לחם מותאמים אישית
- אינטגרציית Sentry SDK עם עוקבים אוטומטיים מופעלים
- כתיבת פירורי לחם מותאמים אישית לניווט, עגלה, תשלום
- הגדרת
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 }להגנה על נתונים רגישים - אינטגרציה עם React Navigation, NavigatorObserver (Flutter)
- תיעוד מבנה הנתונים ותמיכה לאחר ההשקה
לוחות זמנים ועלות
הגדרה בסיסית עם פירורי לחם אוטומטיים — 4 עד 8 שעות. אינסטרומנטציה מלאה עם קטגוריות מותאמות אישית — 2–3 ימים. העלות מחושבת באופן אישי לפרויקט שלכם, טווח מוערך בין $400 ל-$1500. במשך 5 שנים של הגדרת פירורי לחם ביותר מ-50 פרויקטים, צברנו תבניות להתחלה מהירה. חיסכון ממוצע בזמן אבחון — עד פי 12. צרו קשר — נעריך לוחות זמנים. קבלו ייעוץ על אינטגרציה וצמצמו את תקציב הניפוי שלכם היום.







