เรียกใช้การค้นหา SQL ในข้อมูลที่ส่งออกใน BigQuery

หลังจากส่งออกข้อมูล Crashlytics และ (ไม่บังคับ) ข้อมูลเซสชัน Firebase ไปยัง BigQuery แล้ว คุณจะเริ่มใช้ข้อมูลได้โดยทำดังนี้

  • วิเคราะห์ข้อมูลโดยใช้การค้นหา SQL
    คุณสามารถเรียกใช้การค้นหาในข้อมูล Crashlytics เพื่อสร้างรายงาน และข้อมูลสรุปที่กำหนดเอง เนื่องจากรายงานที่กำหนดเองประเภทนี้ไม่พร้อมใช้งานในแดชบอร์ดของคอนโซล รายงานเหล่านี้จึงสามารถเสริมการวิเคราะห์และความเข้าใจข้อมูลข้อขัดข้องของคุณได้CrashlyticsFirebase ดูคอลเล็กชัน ตัวอย่างการค้นหาในส่วนท้ายของหน้านี้

  • รวมข้อมูลจากชุดข้อมูลต่างๆ
    ตัวอย่างเช่น หากคุณเลือกส่งออกข้อมูลเซสชัน Firebase เมื่อตั้งค่า Crashlytics การส่งออกข้อมูล คุณจะเข้าใจผู้ใช้และเซสชันที่ไม่มีข้อขัดข้องได้ดียิ่งขึ้น (ดูตัวอย่างการค้นหา) นอกจากนี้ คุณยังส่งออกข้อมูลจากผลิตภัณฑ์ต่างๆ ของ Firebase (เช่น Performance Monitoring) หรือ จาก Google Analytics แล้วรวมและวิเคราะห์ข้อมูลดังกล่าวใน BigQuery กับข้อมูล Crashlytics ได้ด้วย

  • สร้างมุมมอง
    คุณสามารถสร้าง มุมมอง ซึ่งเป็นตารางเสมือนจริงที่กำหนดโดยการค้นหา SQL ได้โดยใช้ UI ของ BigQuery ดูวิธีการโดยละเอียดเกี่ยวกับมุมมองประเภทต่างๆ และวิธีสร้างมุมมองได้ในเอกสารประกอบ BigQuery

ดูรายละเอียดเกี่ยวกับสคีมาชุดข้อมูลได้ที่ สคีมาชุดข้อมูลสำหรับข้อมูลที่ส่งออกใน BigQuery

ดูข้อมูลเกี่ยวกับ SQLBigQuery

ตัวอย่างการค้นหาข้อมูล Crashlytics

ส่วนนี้จะแสดงสถานการณ์และตัวอย่างการค้นหาบางส่วนที่ แสดงให้เห็นวิธีใช้การค้นหา SQL ของ BigQuery กับข้อมูล Crashlytics และข้อมูลเซสชัน Firebase ที่ส่งออก

ตัวอย่างที่ 1: คำนวณเมตริกที่ไม่มีข้อขัดข้องโดยใช้ข้อมูลเซสชัน 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

เซสชัน ที่ไม่มีข้อขัดข้องในช่วงสัปดาห์ที่ผ่านมา (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: แยก User-ID

คุณมีแอป Android ที่อยู่ในช่วงทดลองใช้ก่อนเปิดตัว ผู้ใช้ส่วนใหญ่ชื่นชอบแอปของคุณ แต่มีผู้ใช้ 3 รายที่พบข้อขัดข้องจำนวนมากผิดปกติ คุณจึงเขียนการค้นหาที่ดึงเหตุการณ์ข้อขัดข้องทั้งหมดของผู้ใช้เหล่านั้นโดยใช้ User-ID เพื่อหาสาเหตุของปัญหา

ต่อไปนี้คือตัวอย่างการค้นหาสำหรับแอป 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. อัปเดตแอปเพื่อส่ง User-ID ไปยังทั้ง 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. เขียนการค้นหาที่ใช้ช่อง User-ID เพื่อรวมเหตุการณ์ในชุดข้อมูล 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 อันดับแรกนับตั้งแต่วันที่ DATE รวมถึงวันนี้

นอกจากนี้ คุณยังรวมตารางแบบกลุ่มและแบบเรียลไทม์เข้าด้วยกันด้วยการค้นหาแบบรวมเพื่อเพิ่มข้อมูลแบบเรียลไทม์ลงในข้อมูลแบบกลุ่มที่เชื่อถือได้ เนื่องจาก event_id เป็นคีย์หลัก คุณจึงใช้ DISTINCT event_id เพื่อลบข้อมูลซ้ำของเหตุการณ์ทั่วไปจากตารางทั้ง 2 ตารางได้

ต่อไปนี้คือตัวอย่างการค้นหาสำหรับแอป 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;

ขั้นตอนต่อไปคืออะไร