หลังจากส่งออกข้อมูล Crashlytics และ (ไม่บังคับ) ข้อมูลเซสชัน Firebase ไปยัง BigQuery แล้ว คุณจะเริ่มใช้ข้อมูลได้โดยทำดังนี้
วิเคราะห์ข้อมูลโดยใช้การค้นหา SQL
คุณสามารถเรียกใช้การค้นหาในข้อมูล Crashlytics เพื่อสร้างรายงาน และข้อมูลสรุปที่กำหนดเอง เนื่องจากรายงานที่กำหนดเองประเภทนี้ไม่พร้อมใช้งานในแดชบอร์ดของคอนโซล รายงานเหล่านี้จึงสามารถเสริมการวิเคราะห์และความเข้าใจข้อมูลข้อขัดข้องของคุณได้CrashlyticsFirebase ดูคอลเล็กชัน ตัวอย่างการค้นหาในส่วนท้ายของหน้านี้รวมข้อมูลจากชุดข้อมูลต่างๆ
ตัวอย่างเช่น หากคุณเลือกส่งออกข้อมูลเซสชัน Firebase เมื่อตั้งค่า Crashlytics การส่งออกข้อมูล คุณจะเข้าใจผู้ใช้และเซสชันที่ไม่มีข้อขัดข้องได้ดียิ่งขึ้น (ดูตัวอย่างการค้นหา) นอกจากนี้ คุณยังส่งออกข้อมูลจากผลิตภัณฑ์ต่างๆ ของ Firebase (เช่น Performance Monitoring) หรือ จาก Google Analytics แล้วรวมและวิเคราะห์ข้อมูลดังกล่าวใน BigQuery กับข้อมูล Crashlytics ได้ด้วยสร้างมุมมอง
คุณสามารถสร้าง มุมมอง ซึ่งเป็นตารางเสมือนจริงที่กำหนดโดยการค้นหา SQL ได้โดยใช้ UI ของ BigQuery ดูวิธีการโดยละเอียดเกี่ยวกับมุมมองประเภทต่างๆ และวิธีสร้างมุมมองได้ในเอกสารประกอบ BigQuery
ดูรายละเอียดเกี่ยวกับสคีมาชุดข้อมูลได้ที่ สคีมาชุดข้อมูลสำหรับข้อมูลที่ส่งออกใน BigQuery
ดูข้อมูลเกี่ยวกับ SQLBigQuery
ดูข้อมูลเกี่ยวกับ ประเภทการค้นหาที่คุณเรียกใช้ได้, ซึ่งรวมถึงงานการค้นหาแบบโต้ตอบ งานการค้นหาแบบกลุ่ม และงานการค้นหาต่อเนื่อง
ดูข้อมูลเกี่ยวกับ คำสั่งและภาษา SQL ที่รองรับใน BigQuery
ดูวิธีเขียนการค้นหาโดยใช้ความช่วยเหลือที่ทำงานด้วยระบบ AI (Gemini)
ตัวอย่างการค้นหาข้อมูล Crashlytics
ส่วนนี้จะแสดงสถานการณ์และตัวอย่างการค้นหาบางส่วนที่ แสดงให้เห็นวิธีใช้การค้นหา SQL ของ BigQuery กับข้อมูล Crashlytics และข้อมูลเซสชัน Firebase ที่ส่งออก
- คำนวณเมตริกที่ไม่มีข้อขัดข้องโดยใช้ข้อมูลเซสชัน Firebase
- ข้อขัดข้องตามวัน
- ค้นหาข้อขัดข้องที่เกิดขึ้นบ่อยที่สุด
- อุปกรณ์ 10 อันดับแรกที่เกิดข้อขัดข้อง
- กรองตามคีย์ที่กำหนดเอง
- แยก User-ID
- ค้นหาผู้ใช้ทั้งหมดที่พบปัญหาข้อขัดข้องที่เฉพาะเจาะจง
- จำนวนผู้ใช้ที่ได้รับผลกระทบจากปัญหาข้อขัดข้อง แยกตามประเทศ
- ปัญหา 5 อันดับแรกของวันนี้
- ปัญหา 5 อันดับแรกนับตั้งแต่วันที่ DATE รวมถึงวันนี้
ตัวอย่างที่ 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: จำนวนผู้ใช้ที่ได้รับผลกระทบจากปัญหาข้อขัดข้อง แยกตามประเทศ
ทีมของคุณตรวจพบข้อบกพร่องร้ายแรงระหว่างการเปิดตัวเวอร์ชันใหม่ คุณ ใช้การค้นหาจาก "ค้นหาข้อขัดข้องที่เกิดขึ้นบ่อยที่สุด" ตัวอย่าง ด้านบนเพื่อระบุรหัสปัญหาข้อขัดข้องที่เฉพาะเจาะจงได้ ตอนนี้ทีมของคุณต้องการดูว่าข้อขัดข้องนี้แพร่กระจายไปยังผู้ใช้ในประเทศต่างๆ ทั่วโลกหรือไม่
ทีมของคุณจะต้องทำดังนี้เพื่อเขียนการค้นหานี้
เปิดใช้การส่งออกข้อมูล Google Analytics ไปยัง BigQuery ดูหัวข้อส่งออกข้อมูลโปรเจ็กต์ไปยัง BigQuery
อัปเดตแอปเพื่อส่ง 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");เขียนการค้นหาที่ใช้ช่อง 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;
ขั้นตอนต่อไปคืออะไร
สร้างแดชบอร์ดที่กำหนดเองโดยใช้ ข้อมูลที่ส่งออกและบริการต่างๆ Google Cloud เช่น Looker Studio
ดูข้อมูลเกี่ยวกับ สคีมาชุดข้อมูลสำหรับข้อมูลที่ส่งออก