Catch up on highlights from Firebase at Google I/O 2023. Learn more

Mesaj teslimini anlama

FCM, mesaj teslimi hakkında fikir edinmenize yardımcı olacak üç araç seti sağlar:

  • Firebase konsol mesajı teslim raporları
  • Firebase Cloud Messaging Data API'den birleştirilmiş Android SDK teslim ölçümleri
  • Google BigQuery'ye kapsamlı veri aktarımı

Bu sayfada açıklanan raporlama araçlarının tümü, çalışabilmesi için Google Analytics'i gerektirir. Projeniz için Google Analytics etkinleştirilmemişse, Firebase proje ayarlarınızın entegrasyonlar sekmesinde ayarlayabilirsiniz.

Bu sayfadaki birçok istatistiğin raporlanmasının, analiz verilerinin gruplanması nedeniyle 24 saate kadar gecikmelere tabi olduğunu unutmayın.

Mesaj teslim raporları

Firebase konsolundaki Raporlar sekmesinde, Notifications bestecisi ve FCM API'leri aracılığıyla gönderilenler 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 iletildi. Daha fazla bilgi için bir mesajın ömrü konusuna 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 üstü yüklü olduğunda kullanılabilir.
  • Gösterimler (yalnızca Android cihazlarda bildirim mesajları için kullanılabilir) — Ekran bildirimi, uygulama arka planda çalışırken cihazda görüntülendi.
  • Açar — 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 Mesajlara analiz etiketleri ekleme bölümüne bakın.

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

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

Mesajlara analiz etiketleri ekleme

İletileri etiketleme, özel analiz için çok kullanışlıdır ve teslim istatistiklerini etiketlere veya etiket kümelerine göre filtrelemenize olanak tanır. İleti nesnesinde veya platforma özel AndroidFcmOptions veya ApnsFcmOptions alanlarında fcmOptions.analyticsLabel alanını ayarlayarak HTTP v1 API aracılığıyla gönderilen herhangi bir iletiye etiket ekleyebilirsiniz.

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

  • -
  • ~
  • %

Maksimum uzunluk 50 karakterdir. Günde en fazla 100 benzersiz etiket belirtebilirsiniz; bu sınırı aşan etiketlere sahip iletiler raporlanmaz.

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

FCM Data API aracılığıyla birleştirilmiş teslimat verileri

Firebase Cloud Messaging Data API, Android uygulamalarını hedefleyen 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 birleştirilmiş veriler sağlar. Bu, gecikmeden iletilen iletilerin yüzdesinin yanı sıra kaç iletinin Android Aktarım Katmanı içinde ertelendiği veya bırakıldığıyla ilgili ayrıntıları içerir. Bu verileri değerlendirmek, mesaj teslimindeki geniş eğilimleri ortaya çıkarabilir ve gönderme isteklerinizin performansını iyileştirmenin etkili yollarını bulmanıza yardımcı olabilir. Raporlardaki tarih aralığı kullanılabilirliği hakkında bilgi için Toplu veri zaman çizelgelerine bakın.

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

Veriler nasıl parçalanır?

Teslim verileri uygulama, tarih ve analiz etiketine göre ayrılır. API'ye yapılan bir çağrı, her tarih, uygulama ve analiz etiketi kombinasyonu için veri döndürür. Ö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?

İletim verileri, aşağıdaki metriklerin her birine uyan mesajların yüzdesini gösterir. Tek bir mesajın birden çok metriğe uyması mümkündür. Verileri nasıl topladığımızdaki sınırlamalar ve ölçümleri topladığımız ayrıntı düzeyi nedeniyle, bazı mesaj sonuçları ölçümlerde hiç temsil edilmez, bu nedenle aşağıdaki yüzdelerin toplamı %100 olmayacaktır.

Kabul Edilen Mesajları Say

Veri kümesine dahil edilen tek sayı, Android cihazlara teslim edilmek üzere FCM tarafından kabul edilen iletilerin sayısıdır. Tüm yüzdeler payda olarak bu değeri kullanır. Bu sayıya, cihazlarında kullanım ve teşhis bilgilerinin toplanmasını devre dışı bırakan kullanıcıları hedefleyen mesajların dahil edilmediğini unutmayın.

Mesaj Sonuç Yüzdeleri

MessageOutcomePercents nesnesinde bulunan alanlar, mesaj isteklerinin sonuçları hakkında bilgi sağlar. Kategorilerin tümü birbirini dışlar. "Mesajlarım teslim ediliyor mu?" gibi soruları yanıtlayabilir. ve "Mesajların düşmesine neden olan nedir?"

Örneğin, droppedTooManyPendingMessages alanı için yüksek bir değer, uygulama örneklerinin FCM'nin 100 bekleyen mesaj sınırını aşan , daraltılamaz mesaj hacimleri aldığını gösterebilir. Bunu azaltmak için uygulamanızın onDeletedMessages çağrılarını işlediğinden emin olun ve katlanabilir mesajlar göndermeyi düşünün. Benzer şekilde, droppedDeviceInactive için yüksek yüzdeler, sunucunuzdaki kayıt jetonlarını güncellemek, eski jetonları kaldırmak ve konulardan çıkmak için bir sinyal olabilir. Bu alandaki en iyi uygulamalar için bkz . FCM kayıt belirteçlerini yönetme .

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, gönderilen tüm mesajlar hakkında ek bilgi sağlar. priorityLowered alanı, önceliği HIGH NORMAL düşürülen 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 aktarma, FCM arka ucu tarafından ileti kabulü ve cihazdaki SDK'da ileti teslimi hakkında ayrı ileti günlükleri sağlar ( FCM Mimarisinin 2. ve 4. Adımları). Bu veriler, bireysel mesajların kabul edildiğinden ve teslim edildiğinden emin olmak için kullanışlıdır. Bir 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) neler olduğu hakkında birleştirilmiş ayrıntılar sağlar. Bu veriler özellikle, mesajların FCM arka uçlarından Android SDK'ya teslimi hakkında bilgi sağlar. Bu aktarım sırasında iletilerin neden geciktiğine veya bırakıldığına ilişkin eğilimleri göstermek açısından özellikle kullanışlıdır.

Bazı durumlarda, iki veri setinin aşağıdakilerden dolayı tam olarak eşleşmemesi mümkündür:

  • Birleştirilmiş metrikler, tüm mesajların yalnızca bir kısmını örnek alır
  • Birleştirilmiş metrikler yuvarlanır
  • Bir gizlilik eşiğinin altındaki ölçümleri sunmuyoruz
  • Büyük trafik hacmini yönetme şeklimizde yaptığımız optimizasyonlar nedeniyle mesaj sonuçlarının bir kısmı eksik.

API sınırlamaları

Toplu Veri Zaman Çizelgeleri

API, 7 günlük geçmiş verilerini döndürür; 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ı veriler kullanılabilir, ancak 16 Ocak veya sonrası için kullanılamaz. Ek olarak, veriler en iyi şekilde sağlanır. Bir veri kesintisi durumunda, FCM düzeltmeye devam edecek ve sorun giderildikten sonra verileri tekrar 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 metrikler, mesaj teslimine ilişkin geniş eğilimler hakkında bilgi sağlamayı amaçlamaktadır. Ancak, tüm mesaj senaryolarının %100 kapsamını sağlamazlar. 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.

Aktif olmayan cihazlara 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 alanlarda bazı yanlış sayımlara yol açabilir.

Belirli kullanıcı tercihlerine sahip cihazlara mesajlar

Cihazlarında kullanım ve teşhis bilgilerinin toplanmasını devre dışı bırakan kullanıcıların mesajları, tercihlerine uygun olarak sayımımıza dahil edilmeyecektir.

Yuvarlama ve Minimumlar

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

BigQuery verilerini dışa aktarma

Daha fazla 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ünden veya mesajın API veya Notifications oluşturucu aracılığıyla gönderilip gönderilmediğinden bağımsız olarak, mesajlar için mevcut tüm verileri içerir.

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

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

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:

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

    • Firebase konsolundaki Entegrasyonlar sayfasından, BigQuery kartında 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 bölümüne bakın.

Cloud Messaging için BigQuery dışa aktarmayı etkinleştirdiğinizde:

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

Mesaj teslimi verilerini dışa aktarmayı etkinleştir

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

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

Yalnızca uyarı bildirimleri, bildirim hizmeti uygulama uzantılarını 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çinden çağırmanız gerekir. Apple'ın Yeni Teslim Edilen Bildirimlerdeki İçeriği Değiştirme hakkındaki belgelerine bakın.

Alınan her bildirim için aşağıdaki arama yapılmalıdır:

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, yük 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şleyicisi içindeki veri dışa aktarma API'sini arayabilirsiniz. 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 BİLGİSİ Bu sözde sütun, verilerin yüklendiği günün başlangıcı (UTC'de) için 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 BİLGİSİ Sunucu tarafından kaydedildiği şekliyle 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ği 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). Bir bulut sunucusu kimliği veya bir 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önderimi için orijinal mesajı tanımlamak için kullanılır; sonraki mesajlar bir bildirim veya 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
daraltma_anahtarı SİCİM Kapatma anahtarı, daraltılabilen bir mesaj grubunu tanımlar. Bir cihaz bağlı olmadığında, nihai teslimat için yalnızca belirli bir kapatma 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 çevrimdışıysa mesajın FCM depolamasında ne kadar süre (saniye cinsinden) tutulması gerektiğini belirtir.
başlık SİCİM İletinin gönderildiği konunun adı (varsa)
toplu_kimlik TAM SAYI Toplu kimlik, belirli bir konuya gönderme gibi bir ilgili mesaj grubunu 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) içinde 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 belirtilmemiş bir hata oluştu;
  • MISMATCH_SENDER_ID: Mesaj gönderme isteği, mesajı gönderen gönderici kimliği ile bitiş noktası için bildirilen kimlik arasındaki uyumsuzluk nedeniyle reddedildi;
  • QUOTA_EXCEEDED: yetersiz kota nedeniyle mesaj gönderme isteği reddedildi;
  • INVALID_REGISTRATION: geçersiz bir kayıt nedeniyle mesaj gönderme isteği reddedildi;
  • INVALID_PACKAGE_NAME: geçersiz bir paket adı nedeniyle mesaj gönderme isteği reddedildi;
  • INVALID_APNS_CREDENTIAL: geçersiz bir APNS sertifikası nedeniyle mesaj gönderme isteği reddedildi;
  • INVALID_PARAMETERS: geçersiz parametreler nedeniyle mesaj gönderme isteği reddedildi;
  • PAYLOAD_TOO_LARGE: sınırdan daha büyük bir yük nedeniyle mesaj gönderme isteği reddedildi;
  • AUTHENTICATION_ERROR: bir kimlik doğrulama hatası nedeniyle mesaj gönderme isteği reddedildi (mesajı göndermek için kullanılan API Anahtarını kontrol edin);
  • INVALID_TTL: Geçersiz bir TTL nedeniyle mesaj gönderme isteği reddedildi.
analytics_label SİCİM HTTP v1 API ile, iletiyi analitik amaçlarla işaretlemek için ileti gönderilirken analitik etiketi ayarlanabilir.

Dışa aktarılan verilerle ne yapabilirsiniz?

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

Uygulamaya göre gönderilen mesajları sayın

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 tarafından hedeflenen 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ın

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ın

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 mesajın olaylarını izlemek için, bu sorguyu AND message_id != '' yerine AND message_id = <your message id>; .

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

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 hesaplama gecikmesi

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;