Mesaj teslimini anlama

FCM, mesaj teslimine ilişkin bilgi edinmenize yardımcı olacak üç araç seti sağlar:

  • Firebase konsolu mesaj teslim raporları
  • Firebase Cloud Messaging Data API'den toplu Android SDK dağıtım ölçümleri
  • Google BigQuery'ye kapsamlı veri aktarımı

Bu sayfada açıklanan raporlama araçlarının tamamının çalışabilmesi için Google Analytics gerekir. Projeniz için Google Analytics etkinleştirilmemişse bunu Firebase proje ayarlarınızın entegrasyonlar sekmesinden yapabilirsiniz.

Bu sayfadaki birçok istatistiğin raporlanmasının, analitik verilerinin toplu hale getirilmesi nedeniyle 24 saate kadar gecikmelere tabi olabileceğini unutmayın.

Mesaj teslim raporları

Firebase konsolundaki Raporlar sekmesinde, Bildirimler oluşturucusu ve FCM API'leri aracılığıyla gönderilenler de dahil olmak üzere Android veya Apple platformu FCM SDK'larına gönderilen iletiler için aşağıdaki verileri görüntüleyebilirsiniz:

  • Gönderimler — Veri mesajı veya bildirim mesajı teslimat için kuyruğa alındı ​​veya teslimat için APN'ler gibi üçüncü taraf bir hizmete başarıyla aktarıldı. Daha fazla bilgi için bir mesajın kullanım ömrüne bakın.
  • Alındı ​​(yalnızca Android cihazlarda kullanılabilir) — Veri mesajı veya bildirim mesajı uygulama tarafından alındı. Bu veriler, alıcı Android cihazında FCM SDK 18.0.1 veya üzeri yüklü olduğunda kullanılabilir.
  • Gösterimler (yalnızca Android cihazlarda bildirim mesajları için kullanılabilir) — Uygulama arka plandayken cihazda ekran bildirimi görüntülendi.
  • Açılır — Kullanıcı bildirim mesajını açtı. Yalnızca uygulama arka plandayken alınan bildirimler için raporlanır.

Bu veriler, bildirim yüküne sahip tüm iletiler ve tüm etiketli veri iletileri için kullanılabilir. Etiketler hakkında daha fazla bilgi edinmek için bkz. İletilere analiz etiketleri ekleme .

Mesaj raporlarını görüntülerken, CSV'ye aktarma seçeneğiyle birlikte görüntülenen veriler için bir tarih aralığı belirleyebilirsiniz. Ayrıca şu kriterlere göre de filtreleyebilirsiniz:

  • Platform (iOS veya Android)
  • Uygulama
  • Özel analiz etiketleri

Mesajlara analiz etiketleri ekleme

İletileri etiketlemek, özel analiz için çok kullanışlıdır; dağıtım istatistiklerini etiketlere veya etiket kümelerine göre filtrelemenize olanak tanır. Mesaj nesnesindeki fcmOptions.analyticsLabel alanını veya platforma özel AndroidFcmOptions ya da ApnsFcmOptions alanlarını ayarlayarak HTTP v1 API aracılığıyla gönderilen herhangi bir mesaja etiket ekleyebilirsiniz.

Analytics etiketleri ^[a-zA-Z0-9-_.~%]{1,50}$ biçimindeki metin dizeleridir. Etiketlerde küçük ve büyük harfler, sayılar ve aşağıdaki simgeler bulunabilir:

  • -
  • ~
  • %

Maksimum uzunluk 50 karakterdir. Günde en fazla 100 benzersiz etiket belirtebilirsiniz; Bu sınırın ötesinde etiket eklenmiş iletiler raporlanmaz.

Firebase konsolu mesajlaşma Raporları sekmesinde, mevcut tüm etiketlerin bulunduğu bir listede arama yapabilir ve görüntülenen istatistikleri filtrelemek için bunları tek tek veya birlikte uygulayabilirsiniz.

FCM Data API aracılığıyla toplu teslimat verileri

Firebase Cloud Messaging Data API, Android uygulamalarına yönelik mesaj isteklerinin sonuçlarını anlamanıza yardımcı olabilecek bilgileri almanızı sağlar. API, bir projedeki tüm veri toplama özellikli Android cihazlarda toplu veriler sağlar. Bu, gecikmeden teslim edilen mesajların yüzdesinin yanı sıra Android Aktarım Katmanı'nda kaç mesajın geciktiği veya bırakıldığıyla ilgili ayrıntıları içerir. Bu verileri değerlendirmek, mesaj dağıtımındaki genel eğilimleri ortaya çıkarabilir ve gönderme isteklerinizin performansını iyileştirmenin etkili yollarını bulmanıza yardımcı olabilir. Raporlarda tarih aralığının kullanılabilirliği hakkında bilgi için Toplu veri zaman çizelgelerine bakın.

API, belirli bir uygulama için mevcut tüm verileri sağlar. API referans belgelerine bakın.

Veriler nasıl parçalanıyor?

Yayınlanma verileri uygulamaya, tarihe ve analiz etiketine göre bölünmüştür. API'ye yapılan bir çağrı, her tarih, uygulama ve analiz etiketi kombinasyonuna ilişkin verileri döndürecektir. Örneğin, tek bir androidDeliveryData JSON nesnesi şuna benzer:

 {
  "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
    }
  }

Metrikler Nasıl Yorumlanır?

Teslim verileri, aşağıdaki ölçümlerin her birine uyan mesajların yüzdesini özetlemektedir. Tek bir mesajın birden fazla ölçüme uyması mümkündür. Verileri toplama şeklimizdeki sınırlamalar ve metrikleri bir araya getirdiğimiz ayrıntı düzeyi nedeniyle, bazı mesaj sonuçları metriklerde hiç temsil edilmiyor, dolayısıyla aşağıdaki yüzdelerin toplamı %100 olmayacaktır.

Kabul Edilen Mesajları Say

Veri kümesinde yer alan tek sayı, FCM tarafından Android cihazlara teslim edilmek üzere kabul edilen mesajların sayısıdır. Tüm yüzdelerde payda olarak bu değer kullanılır. Bu sayının, cihazlarında kullanım ve teşhis bilgilerinin toplanmasını devre dışı bırakmış kullanıcıları hedefleyen mesajları içermeyeceğini unutmayın.

Mesaj Sonuç Yüzdeleri

MessageOutcomePercents nesnesinin içerdiği alanlar, mesaj isteklerinin sonuçları hakkında bilgi sağlar. Kategorilerin tümü birbirini dışlar. "Mesajlarım iletiliyor mu?" gibi sorulara yanıt verebiliyor. ve "İletilerin atlanmasına ne sebep oluyor?"

Örneğin, droppedTooManyPendingMessages alanı için yüksek bir değer, uygulama örneklerinin, FCM'nin 100 bekleyen mesaj sınırını aşan hacimlerde daraltılamayan mesaj aldığının sinyalini verebilir. Bunu azaltmak için uygulamanızın onDeletedMessages çağrılarını yönettiğinden emin olun ve daraltılabilir mesajlar göndermeyi düşünün. Benzer şekilde, droppedDeviceInactive yüksek yüzdeleri, sunucunuzdaki kayıt belirteçlerini güncellemek, eski belirteçleri kaldırmak ve konulardaki aboneliğinizi iptal etmek için bir sinyal olabilir. Bu alandaki en iyi uygulamalar için FCM kayıt belirteçlerini yönetme konusuna bakın.

Teslimat Performansı Yüzdeleri

DeliveryPerformancePercents nesnesindeki alanlar başarıyla teslim edilen iletiler hakkında bilgi sağlar. "Mesajlarım gecikti mi?" gibi sorulara cevap verebiliyor. ve "Mesajlar neden gecikiyor?" Örneğin, delayedMessageThrottled için yüksek bir değer , cihaz başına maksimum sınırları aştığınızı açıkça gösterir ve mesaj gönderme hızınızı ayarlamanız gerekir.

Mesaj İçgörü Yüzdeleri

Bu nesne tüm mesaj gönderimleri hakkında ek bilgi sağlar. priorityLowered alanı, önceliği HIGH NORMAL düşürülmüş kabul edilen mesajların yüzdesini ifade eder. Bu değer yüksekse, daha az yüksek öncelikli mesaj göndermeyi deneyin veya yüksek öncelikli bir mesaj gönderildiğinde her zaman bir bildirim görüntülediğinizden emin olun. Daha fazla bilgi için mesaj önceliğine ilişkin belgelerimize bakın

Bu verilerin BigQuery'ye aktarılan verilerden farkı nedir?

BigQuery dışa aktarımı, mesajların FCM arka ucu tarafından kabulü ve cihazdaki SDK'da mesaj teslimi hakkında ayrı mesaj günlükleri sağlar ( FCM Mimarisinin 2. ve 4. Adımları). Bu veriler, bireysel mesajların kabul edilmesini ve iletilmesini sağlamak için kullanışlıdır. Sonraki bölümde BigQuery verilerini dışa aktarma hakkında daha fazla bilgi edinin.

Buna karşılık, Firebase Bulut Mesajlaşma Veri API'si, özellikle Android Aktarım Katmanında (veya FCM Mimarisinin 3. Adımında) olup bitenler hakkında toplu ayrıntılar sağlar. Bu veriler özellikle mesajların FCM arka uçlarından Android SDK'ya iletilmesine ilişkin bilgi sağlar. Bu aktarım sırasında iletilerin neden geciktiğine veya atlandığına ilişkin eğilimleri göstermek açısından özellikle yararlıdır.

Bazı durumlarda, aşağıdaki nedenlerden dolayı iki veri kümesinin tam olarak eşleşmemesi mümkündür:

  • Toplanan metrikler tüm mesajların yalnızca bir kısmını örnekliyor
  • Toplanan metrikler yuvarlanır
  • Gizlilik eşiğinin altındaki ölçümleri sunmuyoruz
  • Büyük miktarda trafiği yönetme şeklimizdeki optimizasyonlar nedeniyle mesaj sonuçlarının bir kısmı eksik.

API sınırlamaları

Veri Zaman Çizelgelerini Toplulaştırın

API, 7 günlük geçmiş verilerini döndürecektir; ancak bu API tarafından döndürülen veriler 5 güne kadar gecikecektir. Örneğin, 20 Ocak'ta 9 Ocak - 15 Ocak arasındaki veriler mevcut olacak, ancak 16 Ocak veya sonrası için mevcut olmayacak. Ayrıca veriler en iyi şekilde sağlanmaktadır. Veri kesintisi durumunda FCM, sorunu düzeltmek için çalışacak ve sorun çözüldükten sonra verileri geri doldurmayacaktır. Daha büyük kesintilerde veriler bir hafta veya daha uzun süre kullanılamayabilir.

Veri Kapsamı

Firebase Cloud Messaging Data API tarafından sağlanan ölçümlerin amacı, mesaj teslimindeki geniş eğilimlere ilişkin öngörü sağlamaktır. Ancak tüm mesaj senaryolarını %100 kapsamamaktadırlar. Aşağıdaki senaryolar, metriklere yansıtılmayan bilinen sonuçlardır.

Daraltılmış Mesajlar

Başka bir mesaj tarafından daraltılan mesajlar veri kümesinde görünmez.

Etkin olmayan cihazlara gönderilen mesajlar

Etkin olmayan cihazlara gönderilen mesajlar, kullandıkları veri yoluna bağlı olarak veri kümesinde görünebilir veya görünmeyebilir. Bu, droppedDeviceInactive ve pending alanlarında bazı yanlış sayımlara yol açabilir.

Belirli kullanıcı tercihlerine sahip cihazlara gönderilen mesajlar

Cihazlarında kullanım ve teşhis bilgilerinin toplanmasını devre dışı bırakan kullanıcıların mesajları, tercihleri ​​doğrultusunda sayımımıza dahil edilmeyecektir.

Yuvarlama ve Minimumlar

FCM, hacimlerin yeterince büyük olmadığı durumlarda sayıları kasıtlı olarak yuvarlar ve hariç tutar.

BigQuery verilerini dışa aktarma

Daha ayrıntılı analiz için mesaj verilerinizi BigQuery'ye aktarabilirsiniz. BigQuery, verileri BigQuery SQL kullanarak analiz etmenize, başka bir bulut sağlayıcıya aktarmanıza veya verileri özel makine öğrenimi modelleriniz için kullanmanıza olanak tanır. BigQuery'ye dışa aktarma, mesaj türüne veya mesajın API ya da Bildirimler oluşturucu aracılığıyla gönderilip gönderilmediğine bakılmaksızın mesajlara ilişkin mevcut tüm verileri içerir.

Aşağıdaki minimum FCM SDK sürümlerine sahip cihazlara gönderilen mesajlar için, uygulamanız için mesaj teslim verilerinin dışa aktarılmasını etkinleştirme yönünde ek seçeneğiniz vardır:

  • Android 20.1.0 veya üzeri.
  • iOS 8.6.0 veya üzeri
  • Firebase Web SDK 9.0.0 veya üzeri

Android ve iOS için veri aktarımını etkinleştirmeyle ilgili ayrıntılar için aşağıya bakın.

Başlamak için projenizi BigQuery'ye bağlayın:

  1. Aşağıdaki seçeneklerden birini seçin:

    • Bildirimler oluşturucusunu açın ve ardından sayfanın altındaki BigQuery'ye Eriş'i tıklayın.

    • Firebase konsolundaki Entegrasyonlar sayfasında BigQuery kartındaki Bağlantı'yı tıklayın.

      Bu sayfa, projedeki tüm FCM özellikli uygulamalar için FCM dışa aktarma seçeneklerini görüntüler.

  2. BigQuery'yi etkinleştirmek için ekrandaki talimatları izleyin.

Daha fazla bilgi için Firebase'i BigQuery'ye bağlama konusuna bakın.

Cloud Messaging için BigQuery Export'u etkinleştirdiğinizde:

BigQuery dışa aktarmayı devre dışı bırakmak için Firebase konsolunda projenizin bağlantısını kaldırın .

İleti teslimi verilerini dışa aktarmayı etkinleştir

FCM SDK 8.6.0 veya üzeri sürüme sahip iOS cihazları, uygulamalarının mesaj teslimi verilerinin dışa aktarımını etkinleştirebilir. FCM, hem uyarı hem de arka plan bildirimleri için veri aktarımını destekler. Bu seçenekleri etkinleştirmeden önce, BigQuery verilerini dışa aktarma bölümünde açıklandığı gibi projeniz için FCM-BiqQuery bağlantısını oluşturmanız gerekir.

Uyarı bildirimleri için teslimat verilerinin dışa aktarılmasını etkinleştirin

Bildirim hizmeti uygulama uzantılarını yalnızca uyarı bildirimleri tetikleyebileceğinden, uygulamanıza bir bildirim hizmeti uzantısı eklemeniz ve görüntülü mesaj izlemeyi etkinleştirmek için bu API'yi bir hizmet uzantısı içinde çağırmanız gerekir. Yeni Teslim Edilen Bildirimlerdeki İçeriği Değiştirme hakkındaki Apple belgelerine bakın.

Alınan her bildirim için aşağıdaki çağrının yapılması gerekmektedir:

Süratli

// 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)
  }
}

Amaç-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

HTTP v1 API'sini kullanarak gönderme istekleri oluşturuyorsanız payload nesnesinde mutable-content = 1 belirttiğinizden emin olun.

Arka plan bildirimleri için teslimat verilerinin dışa aktarılmasını etkinleştirin

Uygulama ön planda veya arka plandayken alınan arka plan mesajları için ana uygulamanın veri mesajı işleyicisindeki veri dışa aktarma API'sini çağırabilirsiniz. Bu çağrı alınan her bildirim için yapılmalıdır:

Süratli

// 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)
}

Amaç-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

BigQuery'ye hangi veriler aktarılır?

Eski belirteçleri veya etkin olmayan kayıtları hedeflemenin bu istatistiklerin bazılarını şişirebileceğini unutmayın.

Dışa aktarılan tablonun şeması şöyledir:

_PARTITIONTIME ZAMAN DAMGASI Bu sözde sütun, verilerin yüklendiği günün başlangıcına (UTC cinsinden) ilişkin bir zaman damgası içerir. YYYYMMDD bölümü için bu sözde sütun TIMESTAMP('YYYY-MM-DD') değerini içerir.
event_timestamp ZAMAN DAMGASI Sunucu tarafından kaydedilen olay zaman damgası
Proje numarası TAM SAYI Proje numarası mesajı gönderen projeyi tanımlar
Mesaj Kimliği SİCİM Mesaj kimliği bir mesajı tanımlar. Uygulama Kimliğinden ve zaman damgasından oluşturulan mesaj kimliği bazı durumlarda genel olarak benzersiz olmayabilir.
örnek_kimliği SİCİM Mesajın gönderildiği uygulamanın benzersiz kimliği (varsa). Bu bir örnek kimliği veya Firebase kurulum kimliği olabilir.
mesaj tipi SİCİM Mesajın türü. Bildirim mesajı veya Veri mesajı olabilir. Konu, bir konu veya kampanya gönderimine ilişkin orijinal mesajı tanımlamak için kullanılır; sonraki mesajlar ya bir bildirim ya da veri mesajıdır.
sdk_platform SİCİM Alıcı uygulamasının platformu
uygulama ismi SİCİM Android uygulamaları için paket adı veya iOS uygulamaları için paket kimliği
çöküş_anahtarı SİCİM Daraltma anahtarı, daraltılabilecek bir grup mesajı tanımlar. Bir cihaz bağlı olmadığında, nihai teslim için yalnızca belirli bir daraltma anahtarına sahip son mesaj kuyruğa alınır
öncelik TAM SAYI Mesajın önceliği. Geçerli değerler "normal" ve "yüksek"tir. iOS'ta bunlar APN öncelikleri 5 ve 10'a karşılık gelir
ttl TAM SAYI Bu parametre, cihazın çevrimdışı olması durumunda mesajın FCM deposunda ne kadar süre (saniye olarak) saklanması gerektiğini belirtir
başlık SİCİM Mesajın gönderildiği konunun adı (varsa)
toplu_id TAM SAYI Toplu kimlik, bir konuya belirli bir gönderim gibi bir grup ilgili mesajı tanımlar
etkinlik SİCİM Olayın türü. Olası değerler şunlardır:
  • MESSAGE_ACCEPTED: mesaj FCM sunucusu tarafından alındı ​​ve istek geçerli;
  • MESSAGE_DELIVERED: mesaj, uygulamanın cihazdaki FCM SDK'sına teslim edildi. Varsayılan olarak bu alan yayılmaz. Etkinleştirmek için setDeliveryMetricsExportToBigQuery(boolean) bölümünde sağlanan talimatları izleyin.
  • MISSING_REGISTRATIONS: eksik kayıt nedeniyle istek reddedildi;
  • UNAUTHORIZED_REGISTRATION: gönderenin kayda gönderme yetkisi olmadığı için mesaj reddedildi;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: mesaj isteği işlenirken belirtilmeyen bir hata oluştu;
  • MISMATCH_SENDER_ID: mesajı gönderen gönderen kimliği ile uç nokta için bildirilen kimlik arasındaki uyumsuzluk nedeniyle mesaj gönderme isteği reddedildi;
  • QUOTA_EXCEEDED: mesaj gönderme isteği kotanın yetersiz olması nedeniyle reddedildi;
  • INVALID_REGISTRATION: geçersiz kayıt nedeniyle mesaj gönderme isteği reddedildi;
  • INVALID_PACKAGE_NAME: geçersiz paket adı nedeniyle mesaj gönderme isteği reddedildi;
  • INVALID_APNS_CREDENTIAL: mesaj gönderme isteği geçersiz APNS sertifikası nedeniyle reddedildi;
  • INVALID_PARAMETERS: mesaj gönderme isteği geçersiz parametreler nedeniyle reddedildi;
  • PAYLOAD_TOO_LARGE: mesaj gönderme isteği, sınırı aşan bir yük nedeniyle reddedildi;
  • AUTHENTICATION_ERROR: mesaj gönderme isteği, kimlik doğrulama hatası nedeniyle reddedildi (mesajı göndermek için kullanılan API Anahtarını kontrol edin);
  • INVALID_TTL: Geçersiz TTL nedeniyle mesaj gönderme isteği reddedildi.
analiz_etiketi SİCİM HTTP v1 API ile, mesajı analiz amacıyla işaretlemek için analiz etiketi, mesaj gönderilirken ayarlanabilir.

Dışa aktarılan verilerle ne yapabilirsiniz?

Aşağıdaki bölümlerde BigQuery'de dışa aktarılan FCM verilerinize karşı çalıştırabileceğiniz sorgu örnekleri sunulmaktadır.

Uygulamaya göre gönderilen mesajları say

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;

Mesajların hedeflediği benzersiz uygulama örneklerini sayın

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

Gönderilen bildirim mesajlarını say

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';

Gönderilen veri mesajlarını say

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';

Bir konuya veya kampanyaya gönderilen mesajları sayın

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 != '';

Belirli bir konuya gönderilen bir mesaja ilişkin etkinlikleri izlemek için, bu sorguyu değiştirerek AND message_id != '' yerine AND message_id = <your message id>; .

Belirli bir konu veya kampanya için yayılma süresini hesaplayın

Yayılma başlangıç ​​zamanı, orijinal isteğin alındığı zamandır ve bitiş zamanı, tek bir örneği hedefleyen son bireysel mesajın oluşturulduğu zamandır.

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;

Teslim edilen mesajların yüzdesini sayın

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;

Belirli bir mesaj kimliği ve örnek kimliği için tüm etkinlikleri izleyin

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;

Belirli bir mesaj kimliği ve örnek kimliği için gecikmeyi hesaplayın

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;