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