اجرای کوئری‌های SQL روی داده‌های خروجی در BigQuery

بعد از اینکه داده‌های جلسات Crashlytics و (اختیاری) Firebase خود را به BigQuery صادر کردید، می‌توانید کار با داده‌ها را شروع کنید:

  • تجزیه و تحلیل داده‌ها با استفاده از کوئری‌های SQL
    شما می‌توانید کوئری‌هایی را روی داده‌های Crashlytics خود اجرا کنید تا گزارش‌ها و خلاصه‌های سفارشی تولید کنید. از آنجایی که این نوع گزارش‌های سفارشی در داشبورد Crashlytics کنسول Firebase در دسترس نیستند، می‌توانند تجزیه و تحلیل و درک شما از داده‌های خرابی را تکمیل کنند. مجموعه کوئری‌های نمونه را در ادامه همین صفحه مشاهده کنید.

  • اتصال داده‌ها از مجموعه داده‌های مختلف
    برای مثال، اگر هنگام تنظیم خروجی داده‌های Crashlytics ، خروجی گرفتن از داده‌های جلسات Firebase را انتخاب کنید، می‌توانید درک بهتری از کاربران بدون خرابی و جلسات بدون خرابی داشته باشید (به مثال query مراجعه کنید). همچنین، می‌توانید داده‌ها را از محصولات مختلف Firebase (مانند Performance Monitoring ) یا از Google Analytics خروجی بگیرید و سپس آن داده‌ها را در BigQuery با داده‌های Crashlytics خود ادغام و تجزیه و تحلیل کنید.

  • ایجاد نماها
    با استفاده از رابط کاربری BigQuery ، می‌توانید یک نما (view) ایجاد کنید که یک جدول مجازی است که توسط یک کوئری SQL تعریف می‌شود. برای دستورالعمل‌های دقیق در مورد انواع مختلف نماها و نحوه ایجاد آنها، به مستندات BigQuery مراجعه کنید.

برای جزئیات بیشتر در مورد طرحواره مجموعه داده، به طرحواره مجموعه داده برای داده‌های صادر شده در BigQuery مراجعه کنید.

آشنایی با BigQuery SQL

مثال‌هایی از پرس‌وجوها برای داده‌های Crashlytics

این بخش چند موقعیت و نمونه کوئری ارائه می‌دهد که نشان می‌دهد چگونه می‌توانید BigQuery SQL با داده‌های Crashlytics و داده‌های جلسات Firebase صادر شده خود استفاده کنید.

مثال ۱: محاسبه معیارهای بدون خرابی با استفاده از داده‌های جلسات Firebase

در آخرین نسخه خود، شما یک به‌روزرسانی اساسی در برنامه خود انجام داده‌اید تا مشکلات مربوط به خرابی‌ها در یک سفر کاربری حیاتی را برطرف کنید. شما نظرات فوق‌العاده‌ای از کاربران دریافت کرده‌اید، اما به شواهد کمی نیاز دارید که نشان دهد برنامه شما نسبت به قبل پایدارتر شده است.

معیارهای بدون خرابی می‌توانند به ارائه این اطلاعات کمک کنند. این معیارها، معیارهای مهمی هستند که به شما در درک سلامت کلی برنامه‌تان کمک می‌کنند. با داده‌های جلسات Firebase و رویدادهای Crashlytics ، می‌توانید این معیارها را با یک پرس‌وجوی ساده محاسبه کنید.

در اینجا نمونه‌هایی از کوئری‌ها برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

کاربران بدون خرابی برای یک نسخه خاص:

SELECT
  TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date,
  (1 - (COUNT (DISTINCT installation_uuid) / COUNT (DISTINCT instance_id))) AS CFU
FROM
  `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions
LEFT JOIN
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics
ON
  TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY)
WHERE
  crashlytics.error_type="FATAL"
  AND crashlytics.application.display_version="APP_VERSION"
  AND sessions.application.display_version = "APP_VERSION"
GROUP BY
  event_date
ORDER BY
  event_date

جلسات بدون خرابی در طول هفته گذشته (168 ساعت گذشته):

SELECT
  TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date,
  (1 - (COUNT (DISTINCT crashlytics.firebase_session_id) / COUNT (DISTINCT sessions.session_id))) AS CFS
FROM
  `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions
LEFT JOIN
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics
ON
  TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY)
WHERE
  crashlytics.error_type="FATAL" AND _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)
  AND _PARTITIONTIME < CURRENT_TIMESTAMP()
GROUP BY
  event_date
ORDER BY
  event_date

مثال ۲: خرابی‌ها بر اساس روز

بعد از تلاش برای رفع هرچه بیشتر اشکالات، فکر می‌کنید تیم شما بالاخره آماده است تا برنامه جدید اشتراک‌گذاری عکس شما را راه‌اندازی کند. قبل از انجام این کار، می‌خواهید تعداد خرابی‌های روزانه را در ماه گذشته بررسی کنید تا مطمئن شوید که رفع اشکالات، برنامه را در طول زمان پایدارتر کرده است.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  COUNT(DISTINCT event_id) AS number_of_crashes,
  FORMAT_TIMESTAMP("%F", event_timestamp) AS date_of_crashes
FROM
 `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
GROUP BY
  date_of_crashes
ORDER BY
  date_of_crashes DESC
LIMIT 30;

مثال ۳: فراگیرترین خرابی‌ها را پیدا کنید

برای اولویت‌بندی صحیح برنامه‌های تولید، باید 10 مورد از رایج‌ترین خرابی‌ها را در برنامه خود پیدا کنید. شما یک پرس‌وجو ایجاد می‌کنید که نکات مربوط به داده‌ها را ارائه می‌دهد.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  DISTINCT issue_id,
  COUNT(DISTINCT event_id) AS number_of_crashes,
  COUNT(DISTINCT installation_uuid) AS number_of_impacted_user,
  blame_frame.file,
  blame_frame.line
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(),INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  issue_id,
  blame_frame.file,
  blame_frame.line
ORDER BY
  number_of_crashes DESC
LIMIT 10;

مثال ۴: ۱۰ دستگاهی که بیشترین خرابی را دارند

پاییز فصل گوشی‌های جدید است! شرکت شما می‌داند که این به معنای فصل مشکلات جدید مختص دستگاه‌ها - به خصوص برای اندروید - نیز هست. برای جلوگیری از نگرانی‌های مربوط به سازگاری قریب‌الوقوع، شما یک کوئری (پرس‌وجو) ایجاد می‌کنید که 10 دستگاهی را که بیشترین خرابی را در هفته گذشته (168 ساعت) تجربه کرده‌اند، شناسایی می‌کند.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  device.model,
COUNT(DISTINCT event_id) AS number_of_crashes
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  device.model
ORDER BY
  number_of_crashes DESC
LIMIT 10;

مثال ۵: فیلتر بر اساس کلید سفارشی

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

برای کمک به ردیابی این آمار، شما یک کلید سفارشی Crashlytics ( iOS+ | Android | Flutter | Unity ) به نام current_level تنظیم می‌کنید و هر بار که کاربر به یک سطح جدید می‌رسد، آن را به‌روزرسانی می‌کنید.

سویفت

Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");

هدف-سی

CrashlyticsKit setIntValue:3 forKey:@"current_level";

جاوا

Crashlytics.setInt("current_level", 3);

با استفاده از آن کلید در خروجی خود به BigQuery ، می‌توانید یک کوئری بنویسید تا توزیع مقادیر current_level مرتبط با هر رویداد خرابی را گزارش دهد.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
COUNT(DISTINCT event_id) AS num_of_crashes,
  value
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
UNNEST(custom_keys)
WHERE
  key = "current_level"
GROUP BY
  key,
  value
ORDER BY
  num_of_crashes DESC

مثال ۶: استخراج شناسه‌های کاربری

شما یک برنامه اندروید در مرحله دسترسی زودهنگام دارید. اکثر کاربران شما آن را دوست دارند، اما سه نفر از آنها تعداد غیرمعمولی از خرابی‌ها را تجربه کرده‌اند. برای رسیدن به ریشه مشکل، شما یک کوئری می‌نویسید که تمام رویدادهای خرابی را برای آن کاربران، با استفاده از شناسه کاربری آنها، استخراج می‌کند.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT *
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  user.id IN ("USER_ID_1", "USER_ID_2", "USER_ID_3")
ORDER BY
  user.id
 

مثال ۷: یافتن تمام کاربرانی که با یک مشکل خرابی خاص مواجه هستند

تیم شما به‌طور تصادفی یک اشکال بحرانی را برای گروهی از آزمایش‌کنندگان بتا منتشر کرده است. تیم شما توانست با استفاده از پرس‌وجوی مثال «یافتن فراگیرترین خرابی‌ها» در بالا، شناسه مشکل خرابی خاص را شناسایی کند. اکنون تیم شما می‌خواهد یک پرس‌وجو برای استخراج لیست کاربران برنامه که تحت تأثیر این خرابی قرار گرفته‌اند، اجرا کند.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT user.id as user_id
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  issue_id = "ISSUE_ID"
  AND application.display_version = "APP_VERSION"
  AND user.id != ""
ORDER BY
  user.id;

مثال ۸: تعداد کاربرانی که تحت تأثیر مشکل خرابی قرار گرفته‌اند، به تفکیک کشور

تیم شما در طول انتشار یک نسخه جدید، یک اشکال بحرانی را شناسایی کرده است. شما توانستید از پرس و جوی مثال "یافتن فراگیرترین خرابی‌ها" در بالا برای شناسایی شناسه مشکل خرابی خاص استفاده کنید. تیم شما اکنون می‌خواهد ببیند که آیا این خرابی به کاربران در کشورهای مختلف جهان سرایت کرده است یا خیر.

برای نوشتن این پرس و جو، تیم شما باید موارد زیر را انجام دهد:

  1. فعال کردن خروجی گرفتن از داده‌های Google Analytics به BigQuery . به بخش خروجی گرفتن از داده‌های پروژه به BigQuery مراجعه کنید.

  2. برنامه خود را به‌روزرسانی کنید تا یک شناسه کاربری را هم به Google Analytics SDK و هم به Crashlytics SDK ارسال کند.

    سویفت

    Crashlytics.sharedInstance().setUserIdentifier("123456789");
    Analytics.setUserID("123456789");
    

    هدف-سی

    CrashlyticsKit setUserIdentifier:@"123456789";
    FIRAnalytics setUserID:@"12345678 9";
    

    جاوا

    Crashlytics.setUserIdentifier("123456789");
    mFirebaseAnalytics.setUserId("123456789");
    
  3. یک کوئری بنویسید که از فیلد شناسه کاربری برای اتصال رویدادهای مجموعه داده Google Analytics به رویدادهای خرابی در مجموعه داده Crashlytics استفاده کند.

    در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

    SELECT DISTINCT c.issue_id, a.geo.country, COUNT(DISTINCT c.user.id) as num_users_impacted
    FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` c
    INNER JOIN  `PROJECT_ID.analytics_TABLE_NAME.events_*` a on c.user.id = a.user_id
    WHERE
      c.issue_id = "ISSUE_ID"
      AND a._TABLE_SUFFIX BETWEEN '20190101'
      AND '20200101'
    GROUP BY
      c.issue_id,
      a.geo.country,
      c.user.id

مثال ۹: ۵ شماره برتر تا به امروز

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
WHERE
  DATE(event_timestamp) = CURRENT_DATE()
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

مثال ۱۰: ۵ شماره برتر از تاریخ DATE، شامل امروز

همچنین می‌توانید جداول batch و realtime را با یک کوئری stitching ترکیب کنید تا اطلاعات realtime را به داده‌های batch قابل اعتماد اضافه کنید. از آنجایی که event_id یک کلید اصلی است، می‌توانید DISTINCT event_id برای dedupe کردن هرگونه رویداد مشترک از دو جدول استفاده کنید.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM (
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
  UNION ALL
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`)
WHERE
  event_timestamp >= PARSE_TIMESTAMP("%Y_%m_%d", "YYYY_MM_DD")
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

بعدش چی؟

،

بعد از اینکه داده‌های جلسات Crashlytics و (اختیاری) Firebase خود را به BigQuery صادر کردید، می‌توانید کار با داده‌ها را شروع کنید:

  • تجزیه و تحلیل داده‌ها با استفاده از کوئری‌های SQL
    شما می‌توانید کوئری‌هایی را روی داده‌های Crashlytics خود اجرا کنید تا گزارش‌ها و خلاصه‌های سفارشی تولید کنید. از آنجایی که این نوع گزارش‌های سفارشی در داشبورد Crashlytics کنسول Firebase در دسترس نیستند، می‌توانند تجزیه و تحلیل و درک شما از داده‌های خرابی را تکمیل کنند. مجموعه کوئری‌های نمونه را در ادامه همین صفحه مشاهده کنید.

  • اتصال داده‌ها از مجموعه داده‌های مختلف
    برای مثال، اگر هنگام تنظیم خروجی داده‌های Crashlytics ، خروجی گرفتن از داده‌های جلسات Firebase را انتخاب کنید، می‌توانید درک بهتری از کاربران بدون خرابی و جلسات بدون خرابی داشته باشید (به مثال query مراجعه کنید). همچنین، می‌توانید داده‌ها را از محصولات مختلف Firebase (مانند Performance Monitoring ) یا از Google Analytics خروجی بگیرید و سپس آن داده‌ها را در BigQuery با داده‌های Crashlytics خود ادغام و تجزیه و تحلیل کنید.

  • ایجاد نماها
    با استفاده از رابط کاربری BigQuery ، می‌توانید یک نما (view) ایجاد کنید که یک جدول مجازی است که توسط یک کوئری SQL تعریف می‌شود. برای دستورالعمل‌های دقیق در مورد انواع مختلف نماها و نحوه ایجاد آنها، به مستندات BigQuery مراجعه کنید.

برای جزئیات بیشتر در مورد طرحواره مجموعه داده، به طرحواره مجموعه داده برای داده‌های صادر شده در BigQuery مراجعه کنید.

آشنایی با BigQuery SQL

مثال‌هایی از پرس‌وجوها برای داده‌های Crashlytics

این بخش چند موقعیت و نمونه کوئری ارائه می‌دهد که نشان می‌دهد چگونه می‌توانید BigQuery SQL با داده‌های Crashlytics و داده‌های جلسات Firebase صادر شده خود استفاده کنید.

مثال ۱: محاسبه معیارهای بدون خرابی با استفاده از داده‌های جلسات Firebase

در آخرین نسخه خود، شما یک به‌روزرسانی اساسی در برنامه خود انجام داده‌اید تا مشکلات مربوط به خرابی‌ها در یک سفر کاربری حیاتی را برطرف کنید. شما نظرات فوق‌العاده‌ای از کاربران دریافت کرده‌اید، اما به شواهد کمی نیاز دارید که نشان دهد برنامه شما نسبت به قبل پایدارتر شده است.

معیارهای بدون خرابی می‌توانند به ارائه این اطلاعات کمک کنند. این معیارها، معیارهای مهمی هستند که به شما در درک سلامت کلی برنامه‌تان کمک می‌کنند. با داده‌های جلسات Firebase و رویدادهای Crashlytics ، می‌توانید این معیارها را با یک پرس‌وجوی ساده محاسبه کنید.

در اینجا نمونه‌هایی از کوئری‌ها برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

کاربران بدون خرابی برای یک نسخه خاص:

SELECT
  TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date,
  (1 - (COUNT (DISTINCT installation_uuid) / COUNT (DISTINCT instance_id))) AS CFU
FROM
  `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions
LEFT JOIN
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics
ON
  TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY)
WHERE
  crashlytics.error_type="FATAL"
  AND crashlytics.application.display_version="APP_VERSION"
  AND sessions.application.display_version = "APP_VERSION"
GROUP BY
  event_date
ORDER BY
  event_date

جلسات بدون خرابی در طول هفته گذشته (168 ساعت گذشته):

SELECT
  TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date,
  (1 - (COUNT (DISTINCT crashlytics.firebase_session_id) / COUNT (DISTINCT sessions.session_id))) AS CFS
FROM
  `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions
LEFT JOIN
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics
ON
  TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY)
WHERE
  crashlytics.error_type="FATAL" AND _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)
  AND _PARTITIONTIME < CURRENT_TIMESTAMP()
GROUP BY
  event_date
ORDER BY
  event_date

مثال ۲: خرابی‌ها بر اساس روز

بعد از تلاش برای رفع هرچه بیشتر اشکالات، فکر می‌کنید تیم شما بالاخره آماده است تا برنامه جدید اشتراک‌گذاری عکس شما را راه‌اندازی کند. قبل از انجام این کار، می‌خواهید تعداد خرابی‌های روزانه را در ماه گذشته بررسی کنید تا مطمئن شوید که رفع اشکالات، برنامه را در طول زمان پایدارتر کرده است.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  COUNT(DISTINCT event_id) AS number_of_crashes,
  FORMAT_TIMESTAMP("%F", event_timestamp) AS date_of_crashes
FROM
 `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
GROUP BY
  date_of_crashes
ORDER BY
  date_of_crashes DESC
LIMIT 30;

مثال ۳: فراگیرترین خرابی‌ها را پیدا کنید

برای اولویت‌بندی صحیح برنامه‌های تولید، باید 10 مورد از رایج‌ترین خرابی‌ها را در برنامه خود پیدا کنید. شما یک پرس‌وجو ایجاد می‌کنید که نکات مربوط به داده‌ها را ارائه می‌دهد.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  DISTINCT issue_id,
  COUNT(DISTINCT event_id) AS number_of_crashes,
  COUNT(DISTINCT installation_uuid) AS number_of_impacted_user,
  blame_frame.file,
  blame_frame.line
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(),INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  issue_id,
  blame_frame.file,
  blame_frame.line
ORDER BY
  number_of_crashes DESC
LIMIT 10;

مثال ۴: ۱۰ دستگاهی که بیشترین خرابی را دارند

پاییز فصل گوشی‌های جدید است! شرکت شما می‌داند که این به معنای فصل مشکلات جدید مختص دستگاه‌ها - به خصوص برای اندروید - نیز هست. برای جلوگیری از نگرانی‌های مربوط به سازگاری قریب‌الوقوع، شما یک کوئری (پرس‌وجو) ایجاد می‌کنید که 10 دستگاهی را که بیشترین خرابی را در هفته گذشته (168 ساعت) تجربه کرده‌اند، شناسایی می‌کند.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  device.model,
COUNT(DISTINCT event_id) AS number_of_crashes
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  device.model
ORDER BY
  number_of_crashes DESC
LIMIT 10;

مثال ۵: فیلتر بر اساس کلید سفارشی

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

برای کمک به ردیابی این آمار، شما یک کلید سفارشی Crashlytics ( iOS+ | Android | Flutter | Unity ) به نام current_level تنظیم می‌کنید و هر بار که کاربر به یک سطح جدید می‌رسد، آن را به‌روزرسانی می‌کنید.

سویفت

Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");

هدف-سی

CrashlyticsKit setIntValue:3 forKey:@"current_level";

جاوا

Crashlytics.setInt("current_level", 3);

با استفاده از آن کلید در خروجی خود به BigQuery ، می‌توانید یک کوئری بنویسید تا توزیع مقادیر current_level مرتبط با هر رویداد خرابی را گزارش دهد.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
COUNT(DISTINCT event_id) AS num_of_crashes,
  value
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
UNNEST(custom_keys)
WHERE
  key = "current_level"
GROUP BY
  key,
  value
ORDER BY
  num_of_crashes DESC

مثال ۶: استخراج شناسه‌های کاربری

شما یک برنامه اندروید در مرحله دسترسی زودهنگام دارید. اکثر کاربران شما آن را دوست دارند، اما سه نفر از آنها تعداد غیرمعمولی از خرابی‌ها را تجربه کرده‌اند. برای رسیدن به ریشه مشکل، شما یک کوئری می‌نویسید که تمام رویدادهای خرابی را برای آن کاربران، با استفاده از شناسه کاربری آنها، استخراج می‌کند.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT *
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  user.id IN ("USER_ID_1", "USER_ID_2", "USER_ID_3")
ORDER BY
  user.id
 

مثال ۷: یافتن تمام کاربرانی که با یک مشکل خرابی خاص مواجه هستند

تیم شما به‌طور تصادفی یک اشکال بحرانی را برای گروهی از آزمایش‌کنندگان بتا منتشر کرده است. تیم شما توانست با استفاده از پرس‌وجوی مثال «یافتن فراگیرترین خرابی‌ها» در بالا، شناسه مشکل خرابی خاص را شناسایی کند. اکنون تیم شما می‌خواهد یک پرس‌وجو برای استخراج لیست کاربران برنامه که تحت تأثیر این خرابی قرار گرفته‌اند، اجرا کند.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT user.id as user_id
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  issue_id = "ISSUE_ID"
  AND application.display_version = "APP_VERSION"
  AND user.id != ""
ORDER BY
  user.id;

مثال ۸: تعداد کاربرانی که تحت تأثیر مشکل خرابی قرار گرفته‌اند، به تفکیک کشور

تیم شما در طول انتشار یک نسخه جدید، یک اشکال بحرانی را شناسایی کرده است. شما توانستید از پرس و جوی مثال "یافتن فراگیرترین خرابی‌ها" در بالا برای شناسایی شناسه مشکل خرابی خاص استفاده کنید. تیم شما اکنون می‌خواهد ببیند که آیا این خرابی به کاربران در کشورهای مختلف جهان سرایت کرده است یا خیر.

برای نوشتن این پرس و جو، تیم شما باید موارد زیر را انجام دهد:

  1. فعال کردن خروجی گرفتن از داده‌های Google Analytics به BigQuery . به بخش خروجی گرفتن از داده‌های پروژه به BigQuery مراجعه کنید.

  2. برنامه خود را به‌روزرسانی کنید تا یک شناسه کاربری را هم به Google Analytics SDK و هم به Crashlytics SDK ارسال کند.

    سویفت

    Crashlytics.sharedInstance().setUserIdentifier("123456789");
    Analytics.setUserID("123456789");
    

    هدف-سی

    CrashlyticsKit setUserIdentifier:@"123456789";
    FIRAnalytics setUserID:@"12345678 9";
    

    جاوا

    Crashlytics.setUserIdentifier("123456789");
    mFirebaseAnalytics.setUserId("123456789");
    
  3. یک کوئری بنویسید که از فیلد شناسه کاربری برای اتصال رویدادهای مجموعه داده Google Analytics به رویدادهای خرابی در مجموعه داده Crashlytics استفاده کند.

    در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

    SELECT DISTINCT c.issue_id, a.geo.country, COUNT(DISTINCT c.user.id) as num_users_impacted
    FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` c
    INNER JOIN  `PROJECT_ID.analytics_TABLE_NAME.events_*` a on c.user.id = a.user_id
    WHERE
      c.issue_id = "ISSUE_ID"
      AND a._TABLE_SUFFIX BETWEEN '20190101'
      AND '20200101'
    GROUP BY
      c.issue_id,
      a.geo.country,
      c.user.id

مثال ۹: ۵ شماره برتر تا به امروز

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
WHERE
  DATE(event_timestamp) = CURRENT_DATE()
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

مثال ۱۰: ۵ شماره برتر از تاریخ DATE، شامل امروز

همچنین می‌توانید جداول batch و realtime را با یک کوئری stitching ترکیب کنید تا اطلاعات realtime را به داده‌های batch قابل اعتماد اضافه کنید. از آنجایی که event_id یک کلید اصلی است، می‌توانید DISTINCT event_id برای dedupe کردن هرگونه رویداد مشترک از دو جدول استفاده کنید.

در اینجا یک نمونه کوئری برای یک برنامه اندروید آورده شده است. برای یک برنامه iOS، از شناسه بسته و IOS آن (به جای نام بسته و ANDROID ) استفاده کنید.

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM (
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
  UNION ALL
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`)
WHERE
  event_timestamp >= PARSE_TIMESTAMP("%Y_%m_%d", "YYYY_MM_DD")
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

بعدش چی؟