Tìm hiểu về cách gửi thư

FCM cung cấp ba bộ công cụ giúp bạn hiểu rõ hơn về quá trình gửi tin nhắn:

  • Báo cáo gửi thông báo trên bảng điều khiển của Firebase
  • Chỉ số phân phối SDK Android tổng hợp từ API dữ liệu gửi thông báo qua đám mây của Firebase
  • Xuất dữ liệu toàn diện sang Google BigQuery

Tất cả các công cụ báo cáo được mô tả trong trang này đều yêu cầu Google Analytics để hoạt động. Nếu Google Analytics không được bật cho dự án của bạn, bạn có thể thiết lập trong tích hợp trong phần cài đặt dự án Firebase.

Xin lưu ý rằng việc báo cáo nhiều số liệu thống kê trên trang này, có thể bị chậm trễ đến 24 giờ do việc phân lô dữ liệu phân tích.

Báo cáo gửi tin nhắn

Trong Báo cáo trong bảng điều khiển của Firebase, bạn có thể xem những dữ liệu sau đối với các thông báo được gửi đến SDK FCM nền tảng Android hoặc Apple, bao gồm cả những thông báo được gửi qua trình soạn Thông báo và API FCM:

  • Gửi — Tin nhắn dữ liệu hoặc tin nhắn thông báo đã được thêm vào hàng đợi hoặc đã được chuyển thành công tới một dịch vụ bên thứ ba như APN để được giao hàng. Xem thời gian tồn tại của một tin nhắn để biết thêm thông tin.
  • Đã nhận (chỉ có trên các thiết bị Android) — Thông báo dữ liệu hoặc ứng dụng đã nhận được nội dung thông báo. Có sẵn dữ liệu này khi thiết bị Android nhận được có FCM SDK 18.0.1 hoặc đã cài đặt cao hơn.
  • Số lượt hiển thị (chỉ dành cho nội dung thông báo trên thiết bị Android) — Thông báo hiển thị đã xuất hiện trên thiết bị khi ứng dụng đang ở chế độ nền.
  • Mở – Người dùng đã mở thư thông báo. Chỉ báo cáo cho thông báo nhận được khi ứng dụng chạy trong nền.

Tất cả tin nhắn có tải trọng thông báo đều có dữ liệu này và tất cả đều được gắn nhãn thông báo dữ liệu. Để tìm hiểu thêm về nhãn, hãy xem Thêm nhãn phân tích vào thư.

Khi xem báo cáo về tiện ích tin nhắn, bạn có thể đặt phạm vi ngày cho dữ liệu được hiển thị, có lựa chọn xuất sang CSV. Bạn cũng có thể lọc theo các tiêu chí sau:

  • Nền tảng (iOS hoặc Android)
  • Ứng dụng
  • Nhãn phân tích tuỳ chỉnh

Thêm nhãn phân tích vào thư

Việc gắn nhãn thư rất hữu ích cho phân tích tuỳ chỉnh, cho phép bạn lọc số liệu thống kê phân phối theo nhãn hoặc bộ nhãn. Bạn có thể thêm cho bất kỳ thư nào được gửi qua API HTTP v1 bằng cách thiết lập trường fcmOptions.analyticsLabel trong message hoặc trong đối tượng trường AndroidFcmOptions hoặc ApnsFcmOptions dành riêng cho nền tảng.

Nhãn Analytics là các chuỗi văn bản có định dạng ^[a-zA-Z0-9-_.~%]{1,50}$. Nhãn có thể bao gồm chữ thường và chữ hoa, số và các ký hiệu sau:

  • -
  • ~
  • %

Độ dài tối đa là 50 ký tự. Bạn có thể chỉ định tối đa 100 nhãn duy nhất mỗi ngày; thư có nhãn vượt quá giới hạn đó sẽ không được báo cáo.

Trong thẻ Báo cáo nhắn tin trên bảng điều khiển của Firebase, bạn có thể tìm kiếm danh sách tất cả các nhãn hiện có và áp dụng từng nhãn hoặc kết hợp để lọc số liệu thống kê được hiển thị.

Dữ liệu phân phối được tổng hợp qua API dữ liệu FCM

Firebase Cloud Messaging Data API cho phép bạn truy xuất thông tin có thể giúp bạn nắm được kết quả của lời mời nhắn tin nhắm đến Android . API này cung cấp dữ liệu tổng hợp trên tất cả dữ liệu thiết bị Android đã bật bộ sưu tập trong một dự án. Điều này bao gồm thông tin chi tiết về tỷ lệ phần trăm tin nhắn đã gửi mà không bị trì hoãn cũng như số lượng thư đã bị trì hoãn hoặc bị thả trong Android Transport Layer (Lớp truyền tải Android). Việc đánh giá dữ liệu này có thể cho biết xu hướng chung trong việc gửi thư và giúp bạn tìm ra cách hiệu quả để cải thiện hiệu suất gửi yêu cầu. Xem Tổng hợp tiến trình dữ liệu để biết thông tin về khả năng sử dụng phạm vi ngày trong báo cáo.

API này cung cấp tất cả dữ liệu có sẵn cho một ứng dụng cụ thể. Xem Tài liệu tham khảo API.

Dữ liệu được chia nhỏ như thế nào?

Dữ liệu phân phối được chia nhỏ theo ứng dụng, ngày và nhãn phân tích. Lệnh gọi API sẽ trả về cho mọi tổ hợp ngày, đơn đăng ký và nhãn phân tích. Để ví dụ: một đối tượng JSON androidDeliveryData sẽ có dạng như sau:

 {
  "appId": "1:23456789:android:a93a5mb1234efe56",
  "date": {
    "year": 2021,
    "month": 1,
    "day": 1
  },
  "analyticsLabel": "foo",
  "data": {
    "countMessagesAccepted": "314159",
    "messageOutcomePercents": {
      "delivered": 71,
      "pending": 15
    },
   "deliveryPerformancePercents": {
      "deliveredNoDelay": 45,
      "delayedDeviceOffline": 11
    }
  }

Cách diễn giải các chỉ số

Dữ liệu phân phối cho biết tỷ lệ phần trăm thư phù hợp với từng tiêu chí sau chỉ số. Có thể là một thông điệp phù hợp với nhiều chỉ số. Do những hạn chế về cách chúng tôi thu thập dữ liệu và mức độ chi tiết mà chúng tôi tổng hợp các chỉ số, một số kết quả của thông điệp không được thể hiện trong các chỉ số, nên tỷ lệ phần trăm dưới đây sẽ không cộng lại thành 100%.

Số lượng thư được chấp nhận

Số lượng duy nhất được bao gồm trong tập dữ liệu là số lượng tin nhắn được FCM chấp nhận để phân phối tới thiết bị Android. Tất cả phần trăm đều sử dụng giá trị này làm mẫu số. Xin lưu ý rằng số lượng thư này sẽ không bao gồm tin nhắn nhắm đến những người dùng đã tắt tính năng thu thập thông tin sử dụng và chẩn đoán trên thiết bị của họ.

Tỷ lệ phần trăm kết quả tin nhắn

Các trường có trong phần MessageOutcomePercents cung cấp thông tin về kết quả của lời mời nhắn tin. Các danh mục này loại trừ lẫn nhau. Chiến dịch này có thể trả lời các câu hỏi như "Tin nhắn của tôi có được gửi đi không?" và "Điều gì gây ra tin nhắn bị xoá không?"

Ví dụ: giá trị cao cho trường droppedTooManyPendingMessages có thể tín hiệu cho biết các phiên bản ứng dụng đang nhận được số lượng tin nhắn không thể thu gọn vượt quá giới hạn 100 tin nhắn đang chờ xử lý của FCM. Để giảm thiểu điều này, hãy đảm bảo ứng dụng của bạn xử lý các lệnh gọi đến onDeletedMessages, và cân nhắc việc gửi tin nhắn có thể thu gọn. Tương tự, tỷ lệ phần trăm cao cho droppedDeviceInactive có thể là tín hiệu để cập nhật mã thông báo đăng ký trên máy chủ, xoá mã thông báo cũ và huỷ đăng ký chúng khỏi các chủ đề. Xem Quản lý mã đăng ký FCM để biết các phương pháp hay nhất về lĩnh vực này.

Phần trăm hiệu suất phân phối

Các trường trong DeliveryPerformancePercents đối tượng cung cấp thông tin về các tin nhắn đã được gửi thành công. Nó có thể trả lời các câu hỏi như "Thư của tôi có bị trì hoãn không?" và "Tại sao thư bị trì hoãn?" Ví dụ: giá trị cao cho delayedMessageThrottled sẽ nêu rõ rằng bạn đang vượt quá giới hạn tối đa trên mỗi thiết bị, và nên điều chỉnh tốc độ gửi tin nhắn.

Tỷ lệ phần trăm thông tin chi tiết về tin nhắn

Đối tượng này cung cấp thêm thông tin về tất cả tin nhắn đã gửi. Chiến lược phát hành đĩa đơn Trường priorityLowered thể hiện tỷ lệ phần trăm thông báo được chấp nhận đã giảm mức độ ưu tiên từ HIGH xuống NORMAL. Nếu giá trị này cao, hãy thử gửi ít thư có mức độ ưu tiên cao hơn hoặc đảm bảo rằng bạn sẽ luôn hiển thị thông báo khi thư có mức độ ưu tiên cao được gửi. Hãy xem tài liệu của chúng tôi về mức độ ưu tiên của thông báo để biết thêm thông tin

Dữ liệu này khác với dữ liệu được xuất sang BigQuery như thế nào?

Tính năng BigQuery Export cung cấp các nhật ký thông báo riêng lẻ về việc chấp nhận thông báo, phần phụ trợ FCM và phân phối tin nhắn trong SDK trên thiết bị (Bước 2 và 4 của Kiến trúc FCM). Dữ liệu này rất hữu ích trong việc đảm bảo mỗi thư được chấp nhận và phân phối. Đọc thêm về Xuất dữ liệu vào BigQuery trong phần tiếp theo.

Ngược lại, Firebase Cloud Messaging Data API cung cấp thông tin chi tiết tổng hợp về những gì xảy ra cụ thể trong Lớp truyền tải Android (hoặc Bước 3 của Kiến trúc FCM). Dữ liệu này cung cấp cụ thể thông tin chi tiết về việc phân phối thông báo từ phần phụ trợ FCM đến SDK Android. Điều này đặc biệt hữu ích cho hiển thị xu hướng như tại sao thư bị trì hoãn hoặc bị bỏ qua trong quá trình truyền tải này.

Trong một số trường hợp, có thể hai tập dữ liệu này không hoàn toàn khớp nhau do những nguyên nhân sau:

  • Các chỉ số tổng hợp chỉ lấy mẫu một phần của tất cả các thông báo
  • Các chỉ số tổng hợp được làm tròn
  • Chúng tôi không trình bày các chỉ số thấp hơn ngưỡng về quyền riêng tư
  • Một phần kết quả của tin nhắn bị thiếu do chúng tôi tối ưu hoá cách quản lý khối lượng lớn lưu lượng truy cập.

Các giới hạn của API

Tiến trình tổng hợp dữ liệu

API sẽ trả về dữ liệu trong quá khứ trong 7 ngày; tuy nhiên, dữ liệu mà API này trả về sẽ bị trễ đến 5 ngày. Ví dụ: bật Từ ngày 20 tháng 1, dữ liệu từ ngày 9 đến ngày 15 tháng 1 sẽ có sẵn, nhưng không có dữ liệu cho tháng 1 Ngày 16 trở đi. Ngoài ra, chúng tôi cố gắng hết sức có thể để cung cấp dữ liệu. Trong trường hợp khi dữ liệu ngừng hoạt động, FCM sẽ nỗ lực khắc phục trong tương lai và sẽ không bổ sung dữ liệu sau sự cố đã được khắc phục. Trong những trường hợp ngừng dịch vụ lớn hơn, dữ liệu có thể không có sẵn trong một tuần trở lên.

Mức độ phù hợp của dữ liệu

Các chỉ số do Firebase Cloud Messaging Data API cung cấp nhằm cung cấp thông tin chi tiết về các xu hướng gửi tin nhắn rộng rãi. Tuy nhiên, chúng không cung cấp mức độ phù hợp 100% trong tất cả các tình huống thông báo. Các trường hợp sau kết quả đã biết không được phản ánh trong các chỉ số.

Tin nhắn đã hết hạn

Nếu Thời gian tồn tại (TTL) hết hạn sau ngày kết thúc của ngày ghi nhật ký đã cho, tin nhắn đó sẽ không được tính là droppedTtlExpired vào ngày này.

Thông báo đến thiết bị không hoạt động

Tin nhắn gửi đến thiết bị không hoạt động có thể xuất hiện hoặc không xuất hiện trong tập dữ liệu tuỳ thuộc vào đường dẫn dữ liệu mà chúng truy cập. Điều này có thể dẫn đến việc tính sai trong Trường droppedDeviceInactivepending.

Thông báo cho các thiết bị có các lựa chọn ưu tiên nhất định của người dùng

Người dùng đã tắt tính năng thu thập thông tin sử dụng và chẩn đoán trên thiết bị của họ sẽ không được tính vào số lượng tin nhắn của chúng tôi, trong khi vẫn duy trì với lựa chọn ưu tiên của họ.

Làm tròn và tối thiểu

FCM cố ý làm tròn và loại trừ số lượng khi số lượng không lớn đủ.

Xuất dữ liệu BigQuery

Bạn có thể xuất dữ liệu tin nhắn sang BigQuery để phân tích thêm. BigQuery cho phép bạn phân tích dữ liệu bằng BigQuery SQL, xuất dữ liệu sang một đám mây khác hoặc sử dụng dữ liệu cho mô hình học máy tuỳ chỉnh. Xuất sang BigQuery bao gồm mọi dữ liệu có sẵn cho tin nhắn, bất kể hoặc liệu thông báo được gửi qua API hay trình soạn Thông báo.

Đối với các thông báo gửi đến các thiết bị có SDK FCM tối thiểu sau đây phiên bản, bạn có thể chọn bật tính năng xuất thông báo dữ liệu phân phối cho ứng dụng của bạn:

  • Android 20.1.0 trở lên.
  • iOS 8.6.0 trở lên
  • Firebase Web SDK 9.0.0 trở lên

Hãy xem bên dưới để biết thông tin chi tiết về cách bật tính năng xuất dữ liệu cho AndroidiOS.

Để bắt đầu, hãy liên kết dự án của bạn với BigQuery:

  1. Chọn một trong các tùy chọn sau:

    • Đang mở cửa trình soạn Thông báo, rồi nhấp vào Truy cập vào BigQuery ở cuối trang.

    • Từ Các công cụ tích hợp trong bảng điều khiển của Firebase, hãy nhấp vào Liên kết trong BigQuery .

      Trang này hiển thị các tuỳ chọn xuất FCM cho tất cả Các ứng dụng hỗ trợ FCM trong dự án.

  2. Làm theo hướng dẫn trên màn hình để bật BigQuery.

Hãy tham khảo bài viết Liên kết Firebase với BigQuery để biết thêm thông tin.

Khi bạn bật tính năng BigQuery Export cho giải pháp Gửi thông báo qua đám mây:

  • Firebase xuất dữ liệu của bạn sang BigQuery. Ghi chú thì quá trình truyền dữ liệu ban đầu để xuất có thể mất đến 48 giờ để đã hoàn tất.

  • Sau khi tập dữ liệu được tạo, vị trí không thể thay đổi, nhưng bạn có thể sao chép tập dữ liệu sang một vị trí khác hoặc di chuyển (tạo lại) tập dữ liệu ở một vị trí khác theo cách thủ công. Để tìm hiểu khác, hãy xem phần Thay đổi vị trí tập dữ liệu.

  • Firebase thiết lập quá trình đồng bộ hoá dữ liệu thường xuyên từ dự án Firebase của bạn để BigQuery. Các hoạt động xuất dữ liệu hằng ngày này bắt đầu lúc 4 giờ sáng theo Giờ Thái Bình Dương và thường kết thúc trong vòng 24 giờ.

  • Theo mặc định, tất cả các ứng dụng trong dự án của bạn đều được liên kết với BigQuery và bất kỳ mà sau này bạn thêm vào dự án sẽ tự động được liên kết BigQuery. Bạn có thể quản lý ứng dụng gửi dữ liệu.

Cách huỷ kích hoạt tính năng BigQuery Export: huỷ liên kết dự án trong bảng điều khiển của Firebase.

Bật tính năng xuất dữ liệu gửi thư

Thiết bị iOS có FCM SDK 8.6.0 trở lên có thể bật tính năng xuất dữ liệu gửi tin nhắn của ứng dụng. FCM hỗ trợ xuất dữ liệu cho cả thông báo cảnh báo và thông báo trong nền. Trước khi bật các tuỳ chọn này, đầu tiên bạn phải tạo Liên kết FCM-BiqQuery cho dự án của bạn như được mô tả trong Xuất dữ liệu vào BigQuery.

Bật tính năng xuất dữ liệu phân phối cho thông báo cảnh báo

Vì chỉ thông báo khi có cảnh báo mới có thể kích hoạt ứng dụng dịch vụ thông báo tiện ích mở rộng, bạn phải thêm tiện ích dịch vụ thông báo vào ứng dụng và cuộc gọi của mình API này bên trong tiện ích dịch vụ để bật tính năng theo dõi tin nhắn hiển thị. Xem Tài liệu của Apple về việc Sửa đổi nội dung trong thông báo mới gửi.

Lệnh gọi sau phải được thực hiện cho mọi thông báo nhận được:

Swift

// For alert notifications, call the API inside the service extension:
class NotificationService: UNNotificationServiceExtension {
  override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
  Messaging.extensionHelper()
      .exportDeliveryMetricsToBigQuery(withMessageInfo:request.content.userInfo)
  }
}

Objective-C

// For alert notifications, call the API inside the service extension:
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
                   withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:request.content.userInfo];
}
@end

Nếu bạn đang tạo yêu cầu gửi bằng API HTTP v1, hãy nhớ chỉ định mutable-content = 1 trong đối tượng tải trọng.

Bật tính năng xuất dữ liệu phân phối cho thông báo trong nền

Đối với thông báo ở chế độ nền mà bạn nhận được khi ứng dụng chạy ở nền trước hoặc trong nền, bạn có thể gọi API xuất dữ liệu bên trong trình xử lý thông báo dữ liệu của ứng dụng chính. Cuộc gọi này phải được thực hiện cho mọi thông báo nhận được:

Swift

// For background notifications, call the API inside the UIApplicationDelegate or NSApplicationDelegate method:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
  Messaging.extensionHelper().exportDeliveryMetricsToBigQuery(withMessageInfo:userInfo)
}

Objective-C

// For background notifications, call the API inside the UIApplicationDelegate or NSApplicationDelegate method:
@implementation AppDelegate
- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}
@end

Dữ liệu nào được xuất sang BigQuery?

Xin lưu ý rằng việc nhắm mục tiêu các mã thông báo cũ hoặc đăng ký không hoạt động có thể làm tăng một số các số liệu thống kê này.

Giản đồ của bảng đã xuất là:

_PHẦN THAM GIA DẤU THỜI GIAN Cột giả này chứa dấu thời gian cho thời điểm bắt đầu ngày (theo giờ UTC) nơi dữ liệu được tải. Đối với phân vùng YYYYMMDD, cột giả này chứa giá trị TIMESTAMP('YYYY-MM-DD').
event_timestamp DẤU THỜI GIAN Dấu thời gian của sự kiện do máy chủ ghi lại
số_dự_án INTEGER Số dự án xác định dự án đã gửi thông báo
message_id STRING Mã nhận dạng của thông báo xác định một thông báo. Được tạo từ Mã ứng dụng và thì mã nhận dạng thư có thể (trong một số trường hợp) không phải là duy nhất trên toàn hệ thống.
mã_thực_tế STRING Mã nhận dạng duy nhất của ứng dụng nhận thông báo (nếu có). Có thể mã phiên bản hoặc mã cài đặt Firebase.
loại tin nhắn STRING Loại tin nhắn. Có thể là Tin nhắn thông báo hoặc Tin nhắn dữ liệu. Chủ đề được dùng để xác định tin nhắn gốc cho một chủ đề hoặc chiến dịch được gửi; các tin nhắn tiếp theo là thông báo hoặc tin nhắn dữ liệu.
nền tảng SDK STRING Nền tảng của ứng dụng người nhận
tên_ứng_dụng STRING Tên gói đối với ứng dụng Android hoặc mã nhận dạng gói đối với ứng dụng iOS
khoá_thu gọn STRING Phím thu gọn xác định một nhóm thư có thể thu gọn được. Khi thiết bị không được kết nối, chỉ thông báo cuối cùng với một lần thu gọn nhất định khoá được đưa vào hàng đợi để phân phối lần cuối
tuyển sinh ưu tiên INTEGER Mức độ ưu tiên của thông báo. Giá trị hợp lệ là "bình thường" và "cao". Trên iOS, các giá trị này tương ứng với mức độ ưu tiên của APN 5 và 10
ttl INTEGER Tham số này chỉ định thời lượng (tính bằng giây) mà tin nhắn sẽ được lưu giữ trong bộ nhớ FCM nếu thiết bị không có kết nối mạng
chủ đề STRING Tên chủ đề mà thư được gửi đến (nếu có)
mã số hàng loạt INTEGER Mã nhận dạng hàng loạt xác định một nhóm thư có liên quan, chẳng hạn như một nhóm gửi đến một chủ đề
sự kiện STRING Loại sự kiện. Các giá trị có thể có là:
  • MESSAGE_supported: thông báo đã được nhận bởi máy chủ FCM và yêu cầu hợp lệ;
  • MESSAGE_DELIVERED: thông báo đã được gửi tới SDK FCM của ứng dụng vào thiết bị. Theo mặc định, trường này không được áp dụng. Để bật, hãy làm theo hướng dẫn trong setDeliveryMetricsExportToBigQuery(boolean).
  • MISSING_REGISTRATIONS: yêu cầu đã bị từ chối do thiếu thông tin đăng ký;
  • UNAUTHORIZED_REGISTRATION: thư đã bị từ chối vì người gửi là không được phép gửi đăng ký;
  • MESSAGE_GET_INTERNAL_ERROR: đã xảy ra lỗi không xác định khi xử lý yêu cầu nhắn tin;
  • MISMATCH_SENDER_ID: yêu cầu gửi thư đã bị từ chối do một không khớp giữa id người gửi gửi thư và id được khai báo cho điểm cuối;
  • QUOTA_EXCEEDED: yêu cầu gửi tin nhắn đã bị từ chối do không đủ hạn mức;
  • INVALID_REGISTRATION: yêu cầu gửi tin nhắn đã bị từ chối do đăng ký không hợp lệ;
  • INVALID_PACKAGE_NAME: yêu cầu gửi thư đã bị từ chối do tên gói không hợp lệ;
  • INVALID_APNS_CREDENTIAL: yêu cầu gửi tin nhắn đã bị từ chối do chứng chỉ APNS không hợp lệ;
  • INVALID_ParametersS: yêu cầu gửi thư đã bị từ chối do tham số không hợp lệ;
  • PAYTẢI_TOO_LARGE: yêu cầu gửi thư đã bị từ chối do tải trọng lớn hơn giới hạn;
  • XÁC THỰC_ERROR: yêu cầu gửi thư đã bị từ chối do lỗi xác thực (kiểm tra Khoá API dùng để gửi thông báo);
  • INVALID_TTL: yêu cầu gửi thư đã bị từ chối do không hợp lệ Thời gian tồn tại
nhãn_phân_tích STRING Với API HTTP phiên bản 1, bạn có thể đặt nhãn phân tích khi gửi thư, để đánh dấu thông báo cho mục đích phân tích

Bạn có thể làm gì với dữ liệu đã xuất?

Các phần sau đây cung cấp ví dụ về các truy vấn mà bạn có thể chạy trong BigQuery dựa trên dữ liệu FCM đã xuất của bạn.

Số lượng tin nhắn đã gửi theo ứng dụng

SELECT app_name, COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_id != ''
GROUP BY 1;

Đếm số phiên bản ứng dụng riêng biệt được nhắm mục tiêu theo tin nhắn

SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED';

Đếm số tin nhắn thông báo đã gửi

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DISPLAY_NOTIFICATION';

Số lượng thông báo dữ liệu đã gửi

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DATA_MESSAGE';

Đếm tin nhắn được gửi đến một chủ đề hoặc chiến dịch

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND bulk_id = your bulk id AND message_id != '';

Để theo dõi sự kiện của một thư được gửi đến chủ đề cụ thể, hãy sửa đổi truy vấn này thành thay thế AND message_id != '' bằng AND message_id = <your message id>;.

Tính toán thời lượng fanout cho một chủ đề hoặc chiến dịch cụ thể

Thời gian bắt đầu fanout là khi người dùng nhận được yêu cầu ban đầu và kết thúc thời gian là thời gian thông báo riêng lẻ cuối cùng nhắm mục tiêu đến một phiên bản sẽ được tạo.

SELECT
  TIMESTAMP_DIFF(
    end_timestamp, start_timestamp, MILLISECOND
  ) AS fanout_duration_ms,
  end_timestamp,
  start_timestamp
FROM (
    SELECT MAX(event_timestamp) AS end_timestamp
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = your bulk id
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS start_timestamp
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = your bulk id
      AND message_type = 'TOPIC'
  ) initial_message;

Đếm phần trăm tin nhắn đã gửi

SELECT
  messages_sent,
  messages_delivered,
  messages_delivered / messages_sent * 100 AS percent_delivered
FROM (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_sent
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_delivered
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND (event = 'MESSAGE_DELIVERED'
      AND message_id
      IN (
        SELECT message_id FROM `project ID.firebase_messaging.data`
        WHERE
          _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
          AND event = 'MESSAGE_ACCEPTED'
        GROUP BY 1
      )
  ) delivered;

Theo dõi tất cả các sự kiện cho một mã thông báo và mã trường hợp cụ thể

SELECT *
FROM `project ID.firebase_messaging.data`
WHERE
    _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
    AND message_id = 'your message id'
    AND instance_id = 'your instance id'
ORDER BY event_timestamp;

Tính toán độ trễ cho một mã thông báo và mã phiên bản cụ thể

SELECT
  TIMESTAMP_DIFF(
    MAX(delivered_time), MIN(accepted_time), MILLISECOND
  ) AS latency_ms
FROM (
    SELECT event_timestamp AS accepted_time
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND message_id = 'your message id'
      AND instance_id = 'your instance id'
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS delivered_time
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND
      message_id = 'your message id' AND instance_id = 'your instance id'
      AND (event = 'MESSAGE_DELIVERED'
  ) delivered;