หลังจากส่งออกข้อมูล 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 อันดับแรกที่เกิดข้อขัดข้อง
- กรองตามคีย์ที่กำหนดเอง
- ดึงข้อมูล 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 ราย ที่พบการขัดข้องจำนวนมากผิดปกติ หากต้องการเจาะลึกถึงสาเหตุของปัญหา คุณต้องเขียนคําค้นหาที่ดึงเหตุการณ์ข้อขัดข้องทั้งหมดสําหรับผู้ใช้เหล่านั้นโดยใช้รหัสผู้ใช้
นี่คือตัวอย่างการค้นหาสำหรับแอป 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บริการต่างๆ เช่น Looker Studio
ดูข้อมูลเกี่ยวกับสคีมาชุดข้อมูลสำหรับข้อมูลที่ส่งออก