اجرای پُرسمان‌های SQL روی داده‌های صادرشده در BigQuery

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

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

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

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

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

آشنایی با BigQuery SQL

نمونه پُرسمان‌ها برای داده‌های Crashlytics

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

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

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

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

در اینجا نمونه پرسمان‌هایی برای برنامه Android آورده شده است. برای برنامه 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

جلسه‌های بدون خرابی در هفته گذشته (۱۶۸ ساعت گذشته):

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

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

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

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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;

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

برای اولویت‌بندی صحیح برنامه‌های تولید، می‌خواهید ۱۰ مورد از فراگیرترین خرابی‌ها را در برنامه‌تان پیدا کنید. پُرسمانی تولید می‌کنید که نقاط داده مربوطه را ارائه می‌دهد.

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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;

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

پاییز فصل تلفن‌های جدید است! شرکت شما می‌داند که این به‌معنای شروع فصل مشکلات جدید مختص دستگاه نیز هست — به‌ویژه برای Android. برای پیشی گرفتن از نگرانی‌های قریب‌الوقوع سازگاری، پُرسمانی را تنظیم می‌کنید که ۱۰ دستگاهی را که بیشترین خرابی را در هفته گذشته (۱۶۸ ساعت) تجربه کرده‌اند شناسایی می‌کند.

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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 تنظیم می‌کنید و هربار که کاربر به سطح جدیدی می‌رسد، آن را به‌روز می‌کنید.

Swift

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

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

جاوا

Crashlytics.setInt("current_level", 3);

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

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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

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

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

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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
 

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

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

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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 و کیت توسعه نرم‌افزار Crashlytics منتقل کند.

    Swift

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

    Objective-C

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

    جاوا

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

    در اینجا نمونه‌ای از پُرسمان برای برنامه Android آورده شده است. برای برنامه 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

مثال ۹: ۵ مشکل برتر تا این لحظه از امروز

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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، ازجمله امروز

همچنین می‌توانید جدول‌های دسته‌ای و هم‌زمان را با پُرسمان پیونددهی ترکیب کنید تا اطلاعات هم‌زمان را به داده‌های دسته‌ای قابل‌اعتماد اضافه کنید. ازآنجایی‌که event_id کلید اصلی است، می‌توانید از DISTINCT event_id برای حذف موارد تکراری رویدادهای مشترک از دو جدول استفاده کنید.

در اینجا نمونه پُرسمانی برای برنامه Android آورده شده است. برای برنامه 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;

قدم بعدی چیست؟