הרצת שאילתות SQL על נתונים שיוצאו ב-BigQuery

אחרי שמייצאים את נתוני Crashlytics ואת נתוני הסשנים של Firebase (אופציונלית) אל BigQuery, אפשר להתחיל לעבוד עם הנתונים:

  • ניתוח נתונים באמצעות שאילתות SQL
    אתם יכולים להריץ שאילתות על נתוני Crashlytics כדי ליצור דוחות וסיכומים בהתאמה אישית. מכיוון שסוגי הדוחות המותאמים אישית האלה לא זמינים בלוח הבקרה Crashlytics של מסוף Firebase, הם יכולים להשלים את הניתוח שלכם ואת ההבנה של נתוני הקריסות. בהמשך הדף מופיעה אוסף של דוגמאות לשאילתות.

  • שילוב נתונים ממערכי נתונים שונים
    לדוגמה, אם בוחרים לייצא נתוני סשנים של Firebase כשמגדירים ייצוא נתונים של Crashlytics, אפשר לשפר את ההבנה של נתוני המשתמשים שלא נתקלו בקריסות והסשנים שלא נתקלו בקריסות (ראו דוגמה לשאילתה). בנוסף, אתם יכולים לייצא נתונים ממוצרי Firebase שונים (כמו Performance Monitoring) או מ-Google Analytics, ואז לצרף את הנתונים האלה לנתוני Crashlytics ולנתח אותם ב-BigQuery.

  • יצירת תצוגות
    באמצעות ממשק המשתמש של BigQuery, אפשר ליצור תצוגה, שהיא טבלה וירטואלית שמוגדרת על ידי שאילתת SQL. הוראות מפורטות על הסוגים השונים של תצוגות ועל אופן היצירה שלהן מופיעות במאמרי העזרה בנושא BigQuery.

פרטים על סכימת מערך הנתונים זמינים במאמר סכימת מערך הנתונים של נתונים מיוצאים ב-BigQuery.

מידע על BigQuery SQL

שאילתות לדוגמה לנתוני Crashlytics

בקטע הזה מפורטות כמה דוגמאות לתרחישים ולשאילתות שמדגימות איך אפשר להשתמש ב-BigQuery SQL עם נתוני Crashlytics שיוצאו ועם נתוני סשנים של Firebase.

דוגמה 1: חישוב מדדים של אפליקציות שלא קורסות באמצעות נתוני סשנים ב-Firebase

בגרסה האחרונה, השקת שיפוץ משמעותי של האפליקציה כדי לטפל בקריסות בתהליך חשוב שעוברים המשתמשים. קיבלת ביקורות מצוינות מהמשתמשים, אבל היית רוצה לקבל הוכחה כמותית לכך שהאפליקציה יציבה יותר מבעבר.

מדדים שקשורים לקריסות יכולים לעזור לספק את המידע הזה. המדדים האלה הם מדדים חשובים שעוזרים לכם להבין את מצב האפליקציה. באמצעות נתוני הסשנים ואירועי Crashlytics ב-Firebase, אתם יכולים לחשב את המדדים האלה באמצעות שאילתה בסיסית.

אלה דוגמאות לשאילתות לאפליקציית 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

סשנים ללא קריסות בשבוע האחרון (ב-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

דוגמה 2: קריסות לפי יום

אחרי שפעלתם לתיקון כמה שיותר באגים, אתם חושבים שהצוות שלכם מוכן סוף סוף להשיק את אפליקציית שיתוף התמונות החדשה. לפני ההשקה, אתם רוצים לבדוק את מספר הקריסות ביום בחודש האחרון, כדי לוודא שסשן איתור הבאגים שיפר את יציבות האפליקציה לאורך זמן.

זוהי דוגמה לשאילתה של אפליקציה ל-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;

דוגמה 3: איתור קריסות נפוצות

כדי לתעדף נכון את תוכניות הייצור, אתם רוצים למצוא את 10 הקריסות הנפוצות ביותר באפליקציה. אתם יוצרים שאילתה שמספקת את נקודות הנתונים הרלוונטיות.

זוהי דוגמה לשאילתה של אפליקציה ל-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;

דוגמה 4: 10 המכשירים שגורמים לקריסה

הסתיו הוא העונה של הטלפונים החדשים! בחברה שלכם יודעים שזה גם אומר שהגיעה העונה של בעיות חדשות שספציפיות למכשירים – במיוחד ל-Android. כדי לפתור את בעיות התאימות האפשריות, יצרתם שאילתה שמזהה את 10 המכשירים שחוו הכי הרבה קריסות בשבוע האחרון (168 שעות).

זוהי דוגמה לשאילתה של אפליקציה ל-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;

דוגמה 5: סינון לפי מפתח מותאם אישית

אתם מפתחי משחקים שרוצים לדעת באיזה שלב במשחק יש הכי הרבה קריסות.

כדי לעקוב אחרי הנתון הזה, מגדירים מפתח מותאם אישית Crashlytics (iOS+‎ |‏ Android |‏ Flutter |‏ Unity ) בשם current_level, ומעדכנים אותו בכל פעם שהמשתמש מגיע לרמה חדשה.

Swift

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

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

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

דוגמה 6: חילוץ מזהי משתמשים

יש לך אפליקציית 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
 

דוגמה 7: חיפוש של כל המשתמשים שנתקלים בבעיה ספציפית של קריסה

הצוות שלכם פרסם בטעות באג קריטי לקבוצה של בודקי בטא. הצוות שלך הצליח להשתמש בשאילתה מהדוגמה 'איתור קריסות נפוצות' שלמעלה כדי לזהות את מזהה בעיית הקריסה הספציפית. עכשיו הצוות שלך רוצה להריץ שאילתה כדי לחלץ את רשימת המשתמשים באפליקציה שהושפעו מהקריסה הזו.

זוהי דוגמה לשאילתה של אפליקציה ל-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;

דוגמה 8: מספר המשתמשים שהושפעו מבעיית קריסה, בפירוט לפי מדינה

הצוות שלך זיהה באג קריטי במהלך השקת גרסה חדשה. יכולתם להשתמש בשאילתה מהדוגמה 'איתור קריסות נפוצות' שלמעלה כדי לזהות את מזהה בעיית הקריסה הספציפית. הצוות שלך רוצה לדעת אם הקריסה הזו התרחשה אצל משתמשים במדינות שונות ברחבי העולם.

כדי לכתוב את השאילתה הזו, הצוות שלכם יצטרך לבצע את הפעולות הבאות:

  1. הפעלה של ייצוא נתוני Google Analytics אל BigQuery. מידע נוסף על ייצוא נתוני פרויקט ל-BigQuery

  2. מעדכנים את האפליקציה כדי להעביר מזהה משתמש גם אל Google Analytics SDK וגם אל Crashlytics SDK.

    Swift

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

    Objective-C

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

    Java

    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

דוגמה 9: 5 הבעיות העיקריות עד עכשיו היום

זוהי דוגמה לשאילתה של אפליקציה ל-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;

דוגמה 10: 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;

מה השלב הבא?