Sau khi xuất dữ liệu Crashlytics và (không bắt buộc) dữ liệu phiên Firebase vào BigQuery, bạn có thể bắt đầu làm việc với dữ liệu:
Phân tích dữ liệu bằng truy vấn SQL
Bạn có thể chạy truy vấn trên dữ liệu Crashlytics để tạo báo cáo và bản tóm tắt tuỳ chỉnh. Vì các loại báo cáo tuỳ chỉnh này không có trong trang tổng quan Crashlytics của bảng điều khiển Firebase, nên bạn có thể dùng các báo cáo này để bổ sung cho quá trình phân tích và hiểu rõ dữ liệu sự cố. Xem bộ sưu tập truy vấn mẫu ở phần sau trên trang này.Kết hợp dữ liệu từ các tập dữ liệu khác nhau
Ví dụ: nếu chọn xuất dữ liệu phiên Firebase khi thiết lập Crashlytics tính năng xuất dữ liệu, thì bạn có thể hiểu rõ hơn về người dùng không gặp sự cố và phiên không gặp sự cố (xem truy vấn mẫu). Ngoài ra, bạn có thể xuất dữ liệu từ nhiều sản phẩm của Firebase (như Performance Monitoring) hoặc từ Google Analytics và sau đó kết hợp và phân tích dữ liệu đó trong BigQuery bằng dữ liệu Crashlytics.Tạo chế độ xem
Bằng cách sử dụng giao diện người dùng BigQuery , bạn có thể tạo một chế độ xem. Đây là một bảng ảo được xác định bằng truy vấn SQL. Để biết hướng dẫn chi tiết về các loại chế độ xem và cách tạo, hãy xem tài liệu BigQuery.
Để biết thông tin chi tiết về giản đồ tập dữ liệu, hãy xem bài viết Giản đồ tập dữ liệu cho dữ liệu đã xuất trong BigQuery.
Tìm hiểu về BigQuery SQL
Tìm hiểu về các loại truy vấn mà bạn có thể chạy, bao gồm cả công việc truy vấn tương tác, công việc truy vấn hàng loạt và công việc truy vấn liên tục.
Tìm hiểu về các câu lệnh và phương ngữ SQL được hỗ trợ trong BigQuery.
Tìm hiểu cách viết truy vấn bằng tính năng hỗ trợ dựa trên AI (Gemini).
Truy vấn mẫu cho dữ liệu Crashlytics
Phần này cung cấp một số tình huống mẫu và truy vấn mẫu minh hoạ cách bạn có thể sử dụng BigQuery SQL với dữ liệu Crashlytics đã xuất và dữ liệu phiên Firebase.
- Tính toán các chỉ số không gặp sự cố bằng dữ liệu phiên Firebase
- Sự cố theo ngày
- Tìm các sự cố phổ biến nhất
- 10 thiết bị gặp sự cố nhiều nhất
- Lọc theo khoá tuỳ chỉnh
- Trích xuất mã nhận dạng người dùng
- Tìm tất cả người dùng gặp phải một vấn đề cụ thể về sự cố
- Số người dùng chịu ảnh hưởng của một vấn đề về sự cố, được phân tích theo quốc gia
- 5 vấn đề hàng đầu tính đến thời điểm hiện tại
- 5 vấn đề hàng đầu kể từ NGÀY, bao gồm cả hôm nay
Ví dụ 1: Tính toán các chỉ số không gặp sự cố bằng dữ liệu phiên Firebase
Trong phiên bản mới nhất, bạn đã ra mắt một bản cải tiến lớn cho ứng dụng của mình để giải quyết các sự cố trong hành trình quan trọng của người dùng. Bạn đã nhận được những bài đánh giá xuất sắc từ người dùng, nhưng bạn muốn có bằng chứng định lượng cho thấy ứng dụng của bạn ổn định hơn trước.
Các chỉ số không gặp sự cố có thể giúp cung cấp thông tin này. Đây là các chỉ số quan trọng giúp bạn hiểu được tình trạng tổng thể của ứng dụng. Với dữ liệu phiên Firebase và Crashlytics sự kiện, bạn có thể tính toán các chỉ số này bằng một truy vấn cơ bản.
Dưới đây là các truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và ANDROID).
Người dùng không gặp sự cố cho một phiên bản cụ thể:
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
Phiên không gặp sự cố trong tuần qua (168 giờ qua):
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
Ví dụ 2: Sự cố theo ngày
Sau khi nỗ lực khắc phục càng nhiều lỗi càng tốt, bạn nghĩ rằng nhóm của mình cuối cùng đã sẵn sàng ra mắt ứng dụng chia sẻ ảnh mới. Trước khi làm như vậy, bạn muốn kiểm tra số lượng sự cố mỗi ngày trong tháng qua để đảm bảo rằng việc khắc phục lỗi đã giúp ứng dụng ổn định hơn theo thời gian.
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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;
Ví dụ 3: Tìm các sự cố phổ biến nhất
Để ưu tiên đúng cách cho các kế hoạch sản xuất, bạn muốn tìm 10 sự cố phổ biến nhất trong ứng dụng của mình. Bạn tạo một truy vấn cung cấp các điểm dữ liệu liên quan.
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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;
Ví dụ 4: 10 thiết bị gặp sự cố nhiều nhất
Mùa thu là mùa điện thoại mới! Công ty của bạn biết rằng điều này cũng có nghĩa là mùa các vấn đề mới liên quan đến thiết bị, đặc biệt là đối với Android. Để giải quyết các mối lo ngại về khả năng tương thích sắp tới, bạn đã tạo một truy vấn xác định 10 thiết bị gặp sự cố nhiều nhất trong tuần qua (168 giờ).
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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;
Ví dụ 5: Lọc theo khoá tuỳ chỉnh
Bạn là nhà phát triển trò chơi muốn biết cấp độ nào trong trò chơi của bạn gặp sự cố nhiều nhất.
Để giúp theo dõi chỉ số đó, bạn đặt một khoá Crashlytics tuỳ chỉnh
(iOS+ |
Android |
Flutter |
Unity
)
có tên là current_level và cập nhật khoá đó mỗi khi người dùng đạt đến một cấp độ mới.
Swift
Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");
Objective-C
CrashlyticsKit setIntValue:3 forKey:@"current_level";
Java
Crashlytics.setInt("current_level", 3);
Với khoá đó trong quá trình xuất sang BigQuery, bạn có thể viết một truy vấn để
báo cáo phân phối các giá trị current_level được liên kết với từng sự cố
sự kiện.
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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 DESCVí dụ 6: Trích xuất mã nhận dạng người dùng
Bạn có một ứng dụng Android ở giai đoạn truy cập sớm. Hầu hết người dùng đều thích ứng dụng này, nhưng 3 người dùng đã gặp phải số lượng sự cố bất thường. Để tìm hiểu nguyên nhân của vấn đề, bạn viết một truy vấn kéo tất cả các sự kiện sự cố cho những người dùng đó bằng mã nhận dạng người dùng của họ.
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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
Ví dụ 7: Tìm tất cả người dùng gặp phải một vấn đề cụ thể về sự cố
Nhóm của bạn đã vô tình phát hành một lỗi nghiêm trọng cho một nhóm người thử nghiệm beta. Nhóm của bạn có thể sử dụng truy vấn trong ví dụ "Tìm các sự cố phổ biến nhất" ở trên để xác định mã vấn đề cụ thể về sự cố. Giờ đây, nhóm của bạn muốn chạy một truy vấn để trích xuất danh sách người dùng ứng dụng chịu ảnh hưởng của sự cố này.
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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;Ví dụ 8: Số người dùng chịu ảnh hưởng của một vấn đề về sự cố, được phân tích theo quốc gia
Nhóm của bạn đã phát hiện một lỗi nghiêm trọng trong quá trình triển khai bản phát hành mới. Bạn có thể sử dụng truy vấn trong ví dụ "Tìm các sự cố phổ biến nhất" ở trên để xác định mã vấn đề cụ thể về sự cố. Giờ đây, nhóm của bạn muốn xem liệu sự cố này có lan rộng đến người dùng ở các quốc gia khác trên thế giới hay không.
Để viết truy vấn này, nhóm của bạn cần làm như sau:
Bật tính năng xuất dữ liệu Google Analytics sang BigQuery. Xem bài viết Xuất dữ liệu dự án sang BigQuery.
Cập nhật ứng dụng để chuyển mã nhận dạng người dùng vào cả Google Analytics SDK và 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");Viết một truy vấn sử dụng trường mã nhận dạng người dùng để kết hợp các sự kiện trong tập dữ liệu với các sự cố trong tập dữ liệu.Google AnalyticsCrashlytics
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và
IOS(thay vì tên gói và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
Ví dụ 9: 5 vấn đề hàng đầu tính đến thời điểm hiện tại
CrashlyticsDưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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;
Ví dụ 10: 5 vấn đề hàng đầu kể từ NGÀY, bao gồm cả hôm nay
CrashlyticsBạn cũng có thể kết hợp các bảng hàng loạt và bảng theo thời gian thực bằng truy vấn kết hợp để thêm thông tin theo thời gian thực vào dữ liệu hàng loạt đáng tin cậy. Vì event_id là khoá chính, nên bạn có thể sử dụng DISTINCT event_id để loại bỏ các sự kiện trùng lặp từ hai
bảng.
Dưới đây là truy vấn mẫu cho ứng dụng Android. Đối với ứng dụng iOS, hãy sử dụng mã nhận dạng gói và IOS (thay vì tên gói và 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;
Bước tiếp theo là gì?
Tạo trang tổng quan tuỳ chỉnh bằng dữ liệu đã xuất và nhiều dịch vụ Google Cloud, chẳng hạn như Data Studio.
Tìm hiểu về giản đồ tập dữ liệu cho dữ liệu đã xuất.