ایشوها و رخدادها (Issues & Events)

نحوه تمایز رخدادهای مجزا از خطاهای تجمیع‌شده، اثرانگشت هوشمند و چرخه حیات ایشوها.

تفاوت رخداد (Event) و ایشو (Issue)

تصور کنید یک خطای NullPointerException در صفحه تسویه‌حساب برای ۱۴۷ کاربر مختلف رخ می‌دهد. اگر داشبورد شما ۱۴۷ رکورد جداگانه و پراکنده به شما نشان دهد، مدیریت و بررسی آن‌ها غیرممکن خواهد بود.

دیدبان این تمایز را با دو مفهوم اساسی حل می‌کند:

  • رخداد (Event): یک رویداد کرش مشخص روی دستگاه یک کاربر در یک زمان خاص، به همراه کلیه مشخصات سخت‌افزاری، نسخه سیستم‌عامل و ردپاهای متنی آن کاربر.
  • ایشو (Issue): یک مشکل نرم‌افزاری ریشه‌ای مشترک که تمام ۱۴۷ رخداد بالا را در خود جمع‌آوری کرده و امکان تعیین وضعیت، بررسی روند شیوع و حل آن را فراهم می‌سازد.
تفاوت ایشو (Issue) و رخداد (Event)
Issue #104 (Open)NullPointerException in CheckoutViewModel.kt:184fp_a89f92e4
evt_9842Samsung Galaxy S24 • Android 14 • 14:02
evt_9855Google Pixel 8 • Android 15 • 14:15
evt_9910Xiaomi 13 • Android 13 • 14:48

اثرانگشت و گروه‌بندی (Fingerprinting)

دیدبان چگونه تشخیص می‌دهد که کدام رخدادها متعلق به یک ایشوی مشترک هستند؟

هنگام دریافت هر رخداد، سرور دیدبان فریم‌های استک را بررسی کرده و با صرف‌نظر از نویزهای متغیر (مانند آدرس‌های حافظه گذرا یا خطوط داخلی ران‌تایم)، فریم‌های پایدار کد برنامه و کلاس استثنا را نرمال‌سازی می‌کند. از این ترکیب، یک اثرانگشت پایدار (Fingerprint) تولید می‌شود. تمام رخدادهایی که اثرانگشت یکسانی تولید کنند، به همان ایشو ملحق می‌شوند.

چرخه حیات ایشو (Issue Lifecycle)

هر ایشو در دیدبان دارای یکی از سه وضعیت زیر است:

Open

باز (Open)

وضعیت پیش‌فرض برای هر ایشوی جدید. نشان می‌دهد که این خطا فعال است و نیاز به بررسی تیم توسعه دارد.

Resolved

حل‌شده (Resolved)

توسعه‌دهنده پس از اعمال اصلاحیه، ایشو را در داشبورد حل‌شده علامت‌گذاری می‌کند. این تصمیم نشان‌دهنده جریان کاری تیم است.

Regressed

بازگشته (Regressed)

اگر پس از حل یک ایشو، رخداد جدیدی با همان اثرانگشت به دیدبان برسد، وضعیت ایشو به‌طور خودکار به Regressed تغییر می‌کند.

تشخیص بازگشت بر اساس زمان رخداد

یک نکته کلیدی در معماری دیدبان: تشخیص بازگشت خطا (Regression) بر اساس زمان وقوع رخداد (occurred_at) و ترتیب دریافت رخداد در پایگاه‌داده انجام می‌شود، نه صرفاً بر اساس بزرگ‌تر بودن کد نسخه (Version Code). این رفتار تضمین می‌کند که رخدادهای با تاخیر رسیده‌شده از نسخه‌های قدیمی به‌اشتباه باعث بازگشت یک ایشوی اصلاح‌شده در نسخه جدید نشوند.