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