Chạy các truy vấn SQL trên dữ liệu đã xuất trong BigQuery

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 chúng có thể bổ sung cho hoạt động phân tích và hiểu biết của bạn về dữ liệu sự cố. Xem bộ sưu tập các truy vấn mẫu ở phần sau trên trang này.

  • Kết hợp dữ liệu từ nhiều tập dữ liệu
    Ví dụ: nếu chọn xuất dữ liệu phiên Firebase khi thiết lập tính năng xuất dữ liệu Crashlytics, thì bạn có thể hiểu rõ hơn về số người dùng không gặp sự cố và số phiên không gặp sự cố (xem ví dụ về truy vấn). Ngoài ra, bạn có thể xuất dữ liệu từ nhiều sản phẩm của Firebase (chẳng hạn như Performance Monitoring) hoặc từ Google Analytics, sau đó kết hợp và phân tích dữ liệu đó trong BigQuery bằng dữ liệu Crashlytics của bạn.

  • Tạo khung hiển thị
    Khi sử dụng giao diện người dùng BigQuery, bạn có thể tạo một khung hiển thị. Đây là một bảng ảo do một truy vấn SQL xác định. Để biết hướng dẫn chi tiết về các loại chế độ xem và cách tạo các chế độ xem đó, hãy xem tài liệu về BigQuery.

Để biết thông tin chi tiết về giản đồ tập dữ liệu, hãy xem phần Giản đồ tập dữ liệu cho dữ liệu đã xuất trong BigQuery.

Tìm hiểu về SQL BigQuery

Ví dụ về truy vấn cho dữ liệu Crashlytics

Phần này cung cấp một số tình huống ví dụ và truy vấn ví dụ minh hoạ cách bạn có thể sử dụng SQL BigQuery với dữ liệu Crashlytics đã xuất và dữ liệu phiên Firebase.

Ví dụ 1: Tính toán các chỉ số không gặp sự cố bằng dữ liệu phiên trong Firebase

Trong phiên bản mới nhất, bạn đã tiến hành một đợt cải tiến lớn cho ứng dụng của mình để giải quyết các sự cố trong một 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à những chỉ số đo lường quan trọng giúp bạn nắm được tình trạng tổng thể của ứng dụng. Với dữ liệu phiên và sự kiện Crashlytics trên Firebase, bạn có thể tính toán những chỉ số này bằng một truy vấn cơ bản.

Sau đây là các truy vấn mẫu cho một ứ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).

Số người dùng không gặp sự cố đối với 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

Số 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ố lượt gặp sự cố theo ngày

Sau khi cố gắng khắc phục nhiều lỗi nhất có thể, bạn cho 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 việc đó, 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 kiểm thử lỗi đã giúp ứng dụng ổn định hơn theo thời gian.

Dưới đây là một ví dụ về truy vấn 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 các kế hoạch sản xuất, bạn cần tìm ra 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à một ví dụ về truy vấn 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ố hàng đầu

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 giải mới của các vấn đề cụ thể về thiết bị đã đến – đặc biệt là đối với Android. Để giải quyết những lo ngại về khả năng tương thích sắp xảy ra, bạn đã tổng hợp một truy vấn xác định 10 thiết bị gặp nhiều sự cố nhất trong tuần qua (168 giờ).

Dưới đây là một ví dụ về truy vấn 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à một nhà phát triển trò chơi và muốn biết cấp độ nào trong trò chơi của bạn gặp nhiều sự cố nhất.

Để giúp theo dõi số liệu thống kê đó, 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á này 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 tệp xuất sang BigQuery, bạn có thể viết một truy vấn để báo cáo mức phân phối các giá trị current_level được liên kết với từng sự kiện gặp sự cố.

Dưới đây là một ví dụ về truy vấn 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 DESC

Ví dụ 6: Trích xuất mã nhận dạng người dùng

Bạn có một ứng dụng Android đang ở giai đoạn tiếp cận sớm. Hầu hết người dùng đều thích ứng dụng của bạn, nhưng 3 người dùng đã gặp phải số lượng sự cố bất thường. Để tìm ra 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 gặp sự cố của những người dùng đó bằng cách sử dụng mã nhận dạng người dùng của họ.

Dưới đây là một ví dụ về truy vấn 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 kiểm thử beta. Nhóm của bạn có thể sử dụng truy vấn trong ví dụ"Tìm lỗi hỏng phổ biến nhất" ở trên để xác định mã vấn đề cụ thể về lỗi hỏng. 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 bị ảnh hưởng bởi sự cố này.

Dưới đây là một ví dụ về truy vấn 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 thấy một lỗi nghiêm trọng trong quá trình phát hành một 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 biết liệu sự cố này có lan rộng đến người dùng ở nhiều quốc gia 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ững việc sau:

  1. Bật tính năng xuất dữ liệu Google Analytics sang BigQuery. Xem phần Xuất dữ liệu dự án sang BigQuery.

  2. Cập nhật ứng dụng của bạn để truyền mã nhận dạng người dùng vào cả SDK Google Analytics và 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");
    
  3. 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 Google Analytics với các sự cố trong tập dữ liệu Crashlytics.

    Sau đây là một ví dụ về truy vấn cho ứng dụng Android. Đối với ứng dụng iOS, hãy 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ừ đầu ngày đến giờ

Dưới đây là một ví dụ về truy vấn 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, tính cả hôm nay

Bạn cũng có thể kết hợp các bảng theo lô và theo thời gian thực bằng một truy vấn kết hợp để thêm thông tin theo thời gian thực vào dữ liệu theo lô đáng tin cậy. Vì event_id là khoá chính, nên bạn có thể dùng DISTINCT event_id để loại bỏ mọi sự kiện trùng lặp trong hai bảng.

Dưới đây là một ví dụ về truy vấn 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;

Tiếp theo là gì?