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

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

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

  • ترکیب داده‌ها از مجموعه‌های داده مختلف
    برای مثال، اگر هنگام راه‌اندازی برون‌برد داده‌ها Crashlytics انتخاب کنید داده‌های جلسه‌های Firebase را صادر کنید، می‌توانید درک خود را از کاربران بدون خرابی و جلسه‌های بدون خرابی بهبود دهید (به پُرسمان نمونه مراجعه کنید). همچنین می‌توانید داده‌ها را از محصولات مختلف 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;

مثال ۱۰: ۵ مشکل برتر از «تاریخ» تا امروز

همچنین می‌توانید جدول‌های دسته‌ای و هم‌زمان را با پُرسمان پیوند ترکیب کنید تا اطلاعات هم‌زمان را به داده‌های دسته‌ای مطمئن اضافه کنید. ازآنجایی‌که 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;

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