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