欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

Mesaj teslimini anlama

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

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

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

Bu sayfadaki birçok istatistiğin raporlanmasının, analitik verilerinin gruplandırılması nedeniyle 24 saate kadar gecikmelere tabi olduğunu unutmayın.

Mesaj teslim raporları

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

  • Göndermeler — Veri mesajı veya bildirim mesajı teslim için sıraya alındı ​​veya teslim için APN'ler gibi bir üçüncü taraf hizmetine başarıyla iletildi. Daha fazla bilgi için bir mesajın kullanım ömrüne bakın.
  • Alındı ​​(yalnızca Android cihazlarda bulunur) — 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.
  • İzlenimler (yalnızca Android cihazlarda bildirim mesajları için kullanılabilir) — Uygulama arka plandayken ekran bildirimi cihazda 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ü olan tüm mesajlar ve tüm etiketli veri mesajları için mevcuttur. Etiketler hakkında daha fazla bilgi edinmek için Mesajlara analiz etiketleri ekleme konusuna 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ığı belirleyebilirsiniz. Ayrıca şu kriterlere göre filtreleme yapabilirsiniz:

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

Mesajlara analiz etiketleri ekleme

İletileri etiketlemek, özel analiz için çok kullanışlıdır ve teslim istatistiklerini etiketlere veya etiket kümelerine göre filtrelemenize olanak tanır. İleti nesnesindeki 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.

Analiz etiketleri, ^[a-zA-Z0-9-_.~%]{1,50}$ biçimindeki metin dizeleridir. Etiketler küçük ve büyük harfler, 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 etiketler eklenmiş iletiler rapor edilmez.

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 toplu teslim verileri

Firebase Cloud Messaging Data API, Android uygulamalarını hedefleyen mesaj isteklerinin sonuçlarını anlamanıza yardımcı olabilecek bilgileri almanıza olanak tanır. API, bir projedeki tüm veri toplama özellikli Android cihazlarda toplu veriler sağlar. Bu, gecikme olmaksızın teslim edilen mesajların yüzdesinin yanı sıra Android Aktarım Katmanı içinde kaç mesajın ertelendiği veya bırakıldığı ile 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. Raporlarda tarih aralığı 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 başvuru belgelerine bakın.

Veriler nasıl bölünür?

Teslimat 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 kombinasyonu için veri döndürür. Örneğin, tek bir androidDeliveryData JSON nesnesi şöyle görünür:

 {
  "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 gösterir. Tek bir mesajın birden fazla metriğe uyması mümkündür. Verileri toplama şeklimizdeki sınırlamalar ve metrikleri topladığımız ayrıntı düzeyi nedeniyle, bazı mesaj sonuçları metriklerde hiç temsil edilmez, bu nedenle aşağıdaki yüzdeler %100'e eşit olmaz.

Kabul Edilen Mesajları Say

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

Mesaj Sonuç Yüzdeleri

MessageOutcomePercents nesnesine dahil edilen alanlar, mesaj isteklerinin sonuçları hakkında bilgi sağlar. Kategorilerin hepsi 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 bekleyen 100 mesaj sınırını aşan hacimlerde daraltılamaz mesaj aldığını gösterebilir. Bunu azaltmak için uygulamanızın onDeletedMessages yapılan aramaları işlediğinden emin olun ve daraltılabilir mesajlar göndermeyi düşünün. Benzer şekilde, droppedDeviceInactive için yüksek yüzdeler, sunucunuzdaki kayıt belirteçlerini güncellemek, eski belirteçleri kaldırmak ve konuların aboneliğinden çıkmak 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 verebilir. ve "Mesajlar neden gecikiyor?" Örneğin, delayedMessageThrottled için yüksek bir değer, cihaz başına maksimum limitleri aştığınızı açıkça gösterir ve mesaj gönderme hızınızı ayarlamanız gerekir.

İleti İçgörü Yüzdesi

Bu nesne, tüm ileti gönderimleri hakkında ek bilgi sağlar. priorityLowered alanı, önceliği NORMAL HIGH 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 veriler, BigQuery'ye aktarılan verilerden nasıl farklıdır?

BigQuery dışa aktarma, FCM arka ucu tarafından mesaj 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 edilip teslim edildiğinden emin olmak 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 Cloud Messaging Data API, özellikle Android Aktarım Katmanında (veya FCM Mimarisinin 3. Adımında) neler olduğu hakkında toplu ayrıntılar sağlar. Bu veriler, özellikle FCM arka uçlarından Android SDK'ya iletilerin teslimi hakkında bilgi sağlar. Bu aktarım sırasında iletilerin neden geciktiği veya düştüğüyle ilgili eğilimleri göstermek için özellikle yararlıdır.

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

  • Toplu metrikler, tüm mesajların yalnızca bir kısmını örnekliyor
  • Birleştirilmiş metrikler yuvarlanır
  • Gizlilik eşiğinin altındaki metrikleri sunmuyoruz
  • Büyük hacimli trafiği yönetme şeklimizdeki optimizasyonlar nedeniyle mesaj sonuçlarının bir kısmı eksik.

API'nin sınırlamaları

Toplu Veri Zaman Çizelgeleri

API, 7 günlük geçmiş verileri döndürür; ancak bu API tarafından döndürülen veriler 5 güne kadar ertelenir. Örneğin, 20 Ocak'ta 9 Ocak - 15 Ocak verileri mevcut olacak, ancak 16 Ocak veya sonrası için mevcut olmayacak. Ek olarak, veriler en iyi şekilde sağlanır. Bir veri kesintisi durumunda, FCM düzeltmek için çalışacak ve sorun giderildikten 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 metrikler, mesaj teslimine ilişkin geniş eğilimler hakkında bilgi sağlamayı amaçlar. 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 setinde görünmez.

Etkin olmayan cihazlara mesajlar

Aktif olmayan cihazlara gönderilen mesajlar, aldıkları veri yoluna bağlı olarak veri setinde görünebilir veya görünmeyebilir. Bu, droppedDeviceInactive ve pending alanlarda bazı yanlış saymalara neden olabilir.

Belirli kullanıcı tercihlerine sahip cihazlara mesajlar

Cihazlarında kullanım ve teşhis bilgilerinin toplanmasını devre dışı bırakan kullanıcılar, tercihlerine uygun olarak mesajları sayıma 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 fazla analiz için mesaj verilerinizi BigQuery'ye aktarabilirsiniz . BigQuery, verileri BigQuery SQL kullanarak analiz etmenize, başka bir bulut sağlayıcısına 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 Bildirim oluşturucu aracılığıyla gönderilip gönderilmediğine bakılmaksızın, 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 için 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 dışa 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, ardından sayfanın alt kısmı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 üstü olan iOS cihazları, uygulamalarının mesaj teslimi verilerini dışa aktarmayı etkinleştirebilir. FCM, hem uyarı hem de arka plan bildirimleri için veri aktarımını destekler. Bu seçenekleri etkinleştirmeden önce, BigQuery veri 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

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

Alınan her bildirim için aşağıdaki çağrı 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, payload nesnesinde mutable-content = 1 belirttiğinizden emin olun.

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

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 jetonları veya etkin olmayan kayıtları hedeflemenin bu istatistiklerin bazılarını şişirebileceğini unutmayın.

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

_PARTITIONTIME ZAMAN DAMGAMI Bu sözde sütun, verilerin yüklendiği günün (UTC cinsinden) başlangıcı için bir zaman damgası içerir. YYYYMMDD bölümü için bu sözde sütun TIMESTAMP('YYYY-AA-GG') değerini içerir.
event_timestamp ZAMAN DAMGAMI 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 ileti kimliği, bazı durumlarda genel olarak benzersiz olmayabilir.
instance_id SİCİM Mesajın gönderildiği uygulamanın benzersiz kimliği (mümkün olduğunda). Bir örnek 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 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 teslimat 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 çevrimdışıysa mesajın FCM deposunda ne kadar süreyle (saniye olarak) tutulması gerektiğini belirtir.
başlık SİCİM İletinin gönderildiği konunun adı (varsa)
toplu_kimlik TAM SAYI Toplu kimlik, bir konuya belirli bir gönderme gibi bir grup ilgili iletiyi 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, cihazdaki uygulamanın 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önderen gönderen kimliği ile son nokta için bildirilen kimlik arasındaki uyumsuzluk nedeniyle mesaj gönderme isteği reddedildi;
  • QUOTA_EXCEEDED: yetersiz kota nedeniyle ileti 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, mesajı analitik amaçlarla işaretlemek için mesaj 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 != '' ile AND message_id = <your message id>; ile değiştirecek şekilde değiştirin. .

Belirli bir konu veya kampanya için yayma 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üzdesi

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 olayları 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 ileti 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;