הרצת שאילתות 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.

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

מה השלב הבא?