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

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

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

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

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

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

מידע על BigQuery SQL

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

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

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

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

מדדים ללא קריסות יכולים לספק את המידע הזה. המדדים האלה חשובים כדי להבין את המצב הכללי של האפליקציה. בעזרת נתוני הסשנים של 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

סשנים בלי קריסות בשבוע האחרון (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. מעדכנים את האפליקציה כך שתעביר מזהה משתמש גם ל-SDK של Google Analytics וגם ל-SDK של Crashlytics.

    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: חמש הבעיות המובילות היום עד עכשיו

הנה דוגמה לשאילתה לאפליקציה ל-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: חמש הבעיות המובילות מאז [תאריך], כולל היום

אפשר גם לשלב את הטבלאות של הנתונים בזמן אמת ושל הנתונים שנאספו באצווה באמצעות שאילתת חיבור, כדי להוסיף מידע בזמן אמת לנתונים האמינים שנאספו באצווה. מכיוון שהשדה 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;

מה השלב הבא?