İleti teslimini anlama

FCM, mesaj teslimiyle ilgili bilgi edinmenize yardımcı olacak üç araç seti sunar:

  • Firebase konsolu mesaj teslimi raporları
  • Şuradan toplanan Android SDK yayınlama metrikleri: Firebase Cloud Messaging Veri API'si
  • Google BigQuery'ye kapsamlı veri aktarımı
ziyaret edin.

Bu sayfada açıklanan raporlama araçlarının tümü için Google Analytics gereklidir gerekir. Projenizde Google Analytics etkin değilse bu adımları takip etmek için entegrasyonlar Firebase proje ayarlarınızın sekmesini açın.

Bu sayfadaki istatistiklerin çoğunun raporlanmasının, analiz verilerinin toplu olarak işlenmesi nedeniyle 24 saate varan gecikmeler olabilir.

İleti teslimi raporları

Raporlar Firebase konsolunda yer alan "Tüm Uygulamalar" sekmesinde Android veya Apple platform FCM SDK'larına gönderilen mesajlarla ilgili aşağıdaki veriler Bildirimler oluşturucu ve FCM API'leri aracılığıyla gönderilenler de dahil olmak üzere:

  • Gönderildi — Veri mesajı veya bildirim mesajı şunun için sıraya alındı: veya APNs gibi üçüncü taraf bir hizmete başarıyla aktarılmış olmalıdır. teslimat için. Bir mesajın ömrünü görüntüleme konulu videomuzu izleyin.
  • Alındı (yalnızca Android cihazlarda kullanılabilir): Veri mesajı veya bildirim mesajının uygulama tarafından alındığından emin olun. Bu veriler kullanılabilir Alıcı Android cihazda FCM SDK 18.0.1 veya daha yüksek yüklü.
  • Gösterim sayısı (yalnızca Android cihazlarda bildirim mesajları için kullanılabilir) — Uygulama şu anda cihazda gösterilirken bildirim ekranı arka planda çalışır.
  • Aç - Kullanıcı, bildirim mesajını açmıştır. Yalnızca şunun için raporlandı: Uygulama arka plandayken alınan bildirimler

Bu veriler, bildirim yükü olan tüm mesajlar için kullanılabilir ve tüm etiketli veri mesajları için de geçerlidir. Etiketler hakkında daha fazla bilgi edinmek için bkz. İletilere analiz etiketleri ekleme.

Mesaj raporlarını görüntülerken, görüntülenen veriler için bir tarih aralığı ayarlayabilirsiniz. CSV'ye aktarma seçeneğiyle birlikte. Şu ölçütlere göre de filtreleme yapabilirsiniz:

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

İletilere Analytics etiketleri ekleme

İletileri etiketlemek özel analizde çok yararlıdır. yayınlanma istatistiklerini etiketlere veya etiket gruplarına göre filtreleyebilirsiniz. Bir web sitesi için HTTP v1 API aracılığıyla gönderilen tüm iletilere etiket eklemek için fcmOptions.analyticsLabel alanı message nesnesinde veya platforma özgü AndroidFcmOptions veya ApnsFcmOptions alanlarını içerir.

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

  • -
  • ~
  • %

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

Firebase konsolundaki mesajlaşma Raporlar sekmesinde, listesi oluşturup filtre uygulamak için bunları tek tek veya kombinasyon halinde uygulayın gösterilen istatistikler.

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

Firebase Cloud Messaging Data API, Android'i hedefleyen mesaj isteklerinin sonuçlarını anlamanıza yardımcı olur izin verir. API, tüm veriler genelinde birleştirilmiş veriler sunar. bir projede koleksiyonun etkin olduğu Android cihazlar. Bu, projenin nasıl ortaya çıktığını teslim edilen iletilerin yüzdesi Ayrıca, bu süre içinde kaç iletinin geciktiğini veya atıldığını Android Taşıma Katmanı. Bu verileri değerlendirmek, ileti teslimindeki geniş eğilimleri ortaya çıkarabilir ve ve gönderme isteklerinizin performansını iyileştirmenin etkili yollarını bulabilirsiniz. Raporlardaki tarih aralığı kullanılabilirliği hakkında bilgi için Toplu veri zaman çizelgeleri konusuna bakın.

API, belirli bir uygulama için mevcut tüm verileri sağlar. Bkz. API referans belgeleri.

Verilerin dökümü nasıl?

Yayınlanma verileri; uygulama, tarih ve analiz etiketine göre ayrılır. API'ye yapılan bir çağrı döndürülür uygulama ve analiz etiketi kombinasyonlarının tüm verileri için geçerlidir. Örneğin, örnek, 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
    }
  }

Metrikleri Yorumlama

Teslim verileri, aşağıdakilerin her birine uyan iletilerin yüzdesini gösterir kullanabilirsiniz. Tek bir mesaj birden çok metriğe sığabilir. Verileri toplama yöntemlerimizle ilgili sınırlamalar nedeniyle metrikleri birleştirdiğimiz ayrıntı düzeyi, Bazı mesaj sonuçları metriklerde hiç gösterilmese de Bu nedenle aşağıdaki yüzdelerin toplamı %100 olmaz.

Kabul Edilen İletilerin Sayısı

Veri kümesine dahil edilen tek sayı, Android cihazlara teslimat için FCM tarafından kabul edilmiştir. Tüm yüzdeler bu değeri kullanır payda olarak kullanabilirsiniz. Bu sayıya, iletilerin dahil edilmediğini unutmayın en az bir haftalık şurada kullanım ve teşhis bilgilerinin toplanması özelliği devre dışı bırakıldı: cihazlar.

Mesaj Sonucu Yüzdeleri

Dahil edilen alanlar MessageOutcomePercents nesne, bu öğe hakkında netleştirmelerine yardımcı olur. Bu kategorilerin tümü birlikte kullanılamaz. O da "İletilerim teslim ediliyor mu?" "Neden bu sorunun atlanacak mı?" diye soruyor.

Örneğin, droppedTooManyPendingMessages alanı için yüksek bir değer sinyale dayanıyor. Bu sinyal, uygulama örneklerinin daraltılamayan mesajlar FCM'nin bekleyen 100 mesaj sınırını aşıyor. Bu sorunu azaltmak için uygulamanızın onDeletedMessages, daraltılabilir mesajlar gönderebilirsiniz. Benzer şekilde, droppedDeviceInactive, hesabınızdaki kayıt jetonlarını güncellemeniz için bir sinyal olabilir eski jetonları kaldırma ve bunların konulardaki aboneliklerini iptal etme. Görüntüleyin FCM kayıt jetonlarını yönetme inceleyebilirsiniz.

Yayın Performansı Yüzdeleri

DeliveryPerformancePercents'daki alanlar nesne başarıyla teslim edilen iletiler hakkında bilgi sağlar. Google "İletilerim gecikti mi?" ve "İletiler neden gecikiyor?" Örneğin, delayedMessageThrottled, sınırı aştığınızı açıkça belirtir cihaz başına maksimum sınırlar ileti gönderme hızınızı da ayarlamalıdır.

Mesaj Analizi Yüzdeleri

Bu nesne, tüm ileti gönderme işlemleri hakkında ek bilgiler sağlar. İlgili içeriği oluşturmak için kullanılan priorityLowered alanı, HIGH olan öncelik NORMAL değerine düşürüldü. Bu değer yüksekse daha az yüksek öncelikli ileti göndermeyi deneyin veya Yüksek öncelikli bir mesaj gönderildiğinde her zaman bir bildirim görürsünüz. Daha fazla bilgi için mesaj önceliğiyle ilgili dokümanlarımıza göz atın

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

BigQuery Export, mesajın kabul edilmesiyle ilgili bağımsız mesaj günlüklerini sağlar. cihazdaki SDK'da FCM arka ucu ve mesaj teslimi (Adım 2 ve 4 FCM Mimarisi). Bu veriler, tek tek iletilerin doğru olduğundan emin olmak için teslim edilir. Daha fazla bilgi: BigQuery verilerini dışa aktarma başlıklı makaleyi inceleyin.

Buna karşılık Firebase Cloud Messaging Data API, hakkında daha fazla bilgi edinmek için FCM Mimarisi). Bu veriler, özellikle de müşteri ilişkileri yönetimi FCM arka uçlarından Android SDK'ya göndermemizi sağlar. Özellikle proje başlatma belgenize ve iletilerin bu aktarım sırasında neden geciktiğine veya atıldığına ilişkin trendleri gösteriyor.

Bazı durumlarda, iki veri kümesi tam olarak eşleşmeyebilir şunlara bağlı olarak:

  • Toplu metrikler tüm mesajların yalnızca bir kısmını örnek olarak alır
  • Toplu metrikler yuvarlanır
  • Gizlilik eşiğinin altındaki metrikleri sunmayız
  • E-postalarda yaptığımız optimizasyonlar nedeniyle yönetmek demektir.

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 gecikecektir. Örneğin, 20 Ocak'ta 9 Ocak - 15 Ocak'a ait veriler kullanılabilir olacak ama Ocak için geçerli değil 16. veya sonraki bir ay. Ayrıca, veriler en iyi şekilde sağlanmıştır. Fesih bir veri kesintisi yaşarsa FCM, sorunları düzeltmek için çalışır ve sorun çözülmüştür. Daha büyük kesintilerde veriler bir hafta boyunca kullanılamayabilir. veya daha fazla.

Veri Kapsamı

Firebase Cloud Messaging Data API tarafından sağlanan metriklerin amacı, ileti tesliminin genel eğilimleriyle ilgili analiz sağlar. Ancak, tüm mesaj senaryolarını% 100 kapsamaktadır. Aşağıdaki senaryolar şunlardır: metriklerde yansıtılmayan bilinen sonuçlar.

Süresi dolan iletiler

Geçerlilik Süresi (TTL) sona ererse belirtilen günlük tarihinin sonundan sonra ileti, Bu tarihte droppedTtlExpired.

Etkin olmayan cihazlara mesajlar

Etkin olmayan cihazlara gönderilen mesajlar veri kümesinde gösterilebilir veya görünmeyebilir farklı satın alma işlemleri gerçekleştirmelerine yardımcı olur. Bu durum, ekip e-postasında droppedDeviceInactive ve pending alanları için geçerlidir.

Belirli kullanıcı tercihlerine sahip cihazlara mesajlar

Kullanım ve teşhis bilgilerinin toplanmasını devre dışı bırakan kullanıcılar cihazlarındaki mesajlar, sayımımıza dahil edilmez. tercih edebilirsiniz.

Yuvarlama ve Minimum Değerler

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

BigQuery verilerini dışa aktarma

Mesaj verilerinizi BigQuery'yi seçin. BigQuery Verileri BigQuery SQL kullanarak analiz etmenize, başka bir buluta aktarmanıza olanak tanır. veya özel makine öğrenimi modelleriniz için verileri kullanın. BigQuery'ye aktarma mesajlar için kullanılabilir tüm verileri içerir mesaj türünden ya da mesajın API üzerinden mi yoksa bildirim oluşturucuyu açar.

Aşağıdaki minimum FCM SDK'sına sahip cihazlara gönderilen mesajlar için dışa aktarma işlemini etkinleştirme seçeneği de bulunur. Uygulamanızın yayınlanma verileri:

  • Android 20.1.0 veya sonraki sürümler.
  • iOS 8.6.0 veya sonraki sürümler
  • Firebase Web SDK 9.0.0 veya sonraki sürümler

Veri dışa aktarımını etkinleştirmeyle ilgili ayrıntıları aşağıda bulabilirsiniz. Android ve iOS

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

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

    • Bildirim oluşturucu, Ardından sayfanın en altında BigQuery'ye Eriş'i tıklayın.

    • Şuradan: Entegrasyonlar Firebase konsolunda, BigQuery'de Bağla'yı tıklayın. kartını inceleyebilirsiniz.

      Bu sayfada, tüm reklamverenler için FCM dışa aktarma seçenekleri Projedeki FCM özellikli uygulamalar.

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

Firebase'i BigQuery'ye bağlama başlıklı makaleyi inceleyin. konulu videomuzu izleyin.

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

  • Firebase, verilerinizi BigQuery'ye aktarır. Not verilerin dışa aktarılmak üzere ilk yayılmasının 48 saati bulabileceğini belirir.

  • Veri kümesi oluşturulduktan sonra konum değiştirilemez, ancak veri kümesini farklı bir konuma kopyalayabilirsiniz ya da veri kümesini farklı bir konuma manuel olarak taşıyın (yeniden oluşturun). Öğrenmek için daha fazla bilgi için Veri kümesi konumunu değiştirme bölümüne bakın.

  • Firebase, Firebase projenizden Firebase'e veri aktarıp BigQuery'ye gidin. Bu günlük dışa aktarma işlemleri Pasifik Saati ile 04:00'te başlar ve genellikle 24 saatte tamamlanır.

  • Varsayılan olarak, projenizdeki tüm uygulamalar BigQuery'ye ve projeye daha sonra eklediğiniz uygulamalar otomatik olarak bağlanır BigQuery'ye gidin. Şunları yapabilirsiniz: hangi uygulamaların veri göndereceğini yönetin.

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

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

FCM SDK 8.6.0 veya sonraki sürümlere sahip iOS cihazlar uygulamasının mesaj teslimi verilerinin dışa aktarımını etkinleştirebilir. FCM hem uyarı hem de arka plan bildirimleri için veri dışa aktarmayı destekler. Bu seçenekleri etkinleştirmeden önce Projeniz için FCM-BiqQuery bağlantısı (burada açıklandığı gibi) BigQuery verilerini dışa aktarma.

Uyarı bildirimleri için teslim verilerini dışa aktarmayı etkinleştir

Bildirim hizmeti uygulamasını yalnızca uyarı bildirimleri tetikleyebildiği için uzantıları için uygulamanıza bir bildirim hizmeti uzantısı eklemeniz mesaj izlemeyi etkinleştirmek için bu API'yi bir hizmet uzantısına ekleyin. Görüntüleyin Apple'ın Yeni Gönderilen Bildirimlerde İçeriği Değiştirme ile ilgili dokümanları.

Aşağıdaki çağrı, alınan her bildirim için yapılmalıdır:

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

HTTP v1 API kullanarak gönderme istekleri oluşturuyorsanız mutable-content = 1 öğesini yük nesnesi.

Arka plan bildirimleri için iletim verilerini dışa aktarmayı etkinleştir

Uygulama ön veya arka plandayken alınan arka plan mesajlarında ana uygulamanın veri mesajı işleyicisinin içinden Data Export API'yi çağırabilirsiniz. Bu arama, alınan her bildirim için yapılmalıdır:

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

BigQuery'ye hangi veriler aktarılır?

Eski jetonların veya etkin olmayan kayıtların hedeflenmesiyle, bu istatistiklere bir göz atalım.

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

_BÖLÜM SÜRESİ ZAMAN DAMGASI Bu yapay sütun, günün başlangıcı için bir zaman damgası (UTC) içerir verilerin yüklendiği yeri belirtir. YYYYAAGG bölümü için bu sözde sütun TIMESTAMP('YYYY-AA-GG') değerini içerir.
event_timestamp ZAMAN DAMGASI Sunucu tarafından kaydedilen etkinlik zaman damgası
proje_numarası TAM SAYI Proje numarası, mesajı gönderen projeyi tanımlar
message_id DİZE İleti kimliği bir iletiyi tanımlar. Uygulama kimliğinden oluşturulur ve zaman damgası, ileti kimliği ise bazı durumlarda genel olarak benzersiz olmayabilir.
ornek_kimliği DİZE Mesajın gönderildiği uygulamanın benzersiz kimliği (varsa). Bu, örnek kimliği veya Firebase kurulum kimliği.
mesaj_türü DİZE Mesajın türü. Bildirim mesajı veya Veri mesajı olabilir. Konu Bir konunun veya kampanyanın gönderdiği orijinal mesajı tanımlamak için kullanılır. sonraki mesajlar ya bir bildirim ya da veri mesajıdır.
sdk_platformu DİZE Alıcı uygulamanın platformu
uygulama_adı DİZE Android uygulamaları için paket adı veya iOS uygulamaları için paket kimliği
daraltma_anahtarı DİZE Daraltma anahtarı, daraltılabilen bir ileti grubunu tanımlar. Bir cihaz bağlı değilken, yalnızca belirli bir daralma durumuna sahip son mesaj anahtar nihai teslim için sıraya alındı
öncelik TAM SAYI Mesajın önceliği. Geçerli değerler "normal"dir ve "yüksek" olarak derecelendirilir. iOS'te bunlar, APN 5 ve 10 önceliklerine karşılık gelir
ttl TAM SAYI Bu parametre, mesajın ne kadar süre (saniye cinsinden) saklanması gerektiğini belirtir Cihaz çevrimdışıysa FCM depolama alanında
konu DİZE Mesajın gönderildiği konunun adı (varsa)
toplu_kimlik TAM SAYI Toplu kimlik, ilgili iletilerden oluşan bir grubu tanımlar (örneğin, belirli bir bir konuya gönder
etkinlik DİZE Etkinliğin türü. Olası değerler:
  • MESSAGE_KABUL EDİLDİ: İleti FCM sunucusu tarafından alındı ve istek geçerli olmalıdır;
  • MESSAGE_DELIVERED: Mesaj, uygulamanın FCM SDK'sına şu tarihte teslim edildi: için geçerlidir. Varsayılan olarak bu alan dağıtılmaz. Etkinleştirmek için şu adımları uygulayın: setDeliveryMetricsExportToBigQuery(boolean) adresindeki talimatlara bakın.
  • MISSING_REGISTRATIONS: istek eksik bir veri nedeniyle reddedildi tescil;
  • UNAUTHORIZED_REGISTRATION: Gönderen, bu nedenle tescile gönderme yetkisine sahip olmadığını;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: mesaj isteğini işleme koymalıdır;
  • MISMATCH_SENDER_ID: ileti gönderme isteği iletiyi gönderen kimliği ile uç nokta;
  • QUOTA_EXCEEDED: Mesaj gönderme isteği şu nedenle reddedildi: yetersiz kota;
  • INVALID_REGISTRATION: mesaj gönderme isteği geçersiz kayıt;
  • INVALID_PACKAGE_NAME: mesaj gönderme isteği geçersiz paket adı;
  • INVALID_APNS_CREDENTIAL: mesaj gönderme isteği şu nedenle reddedildi: geçersiz bir APNS sertifikası;
  • INVALID_PARAMETERS: ileti gönderme isteği geçersiz parametreler;
  • PAYLOAD_TOO_LARGE: ileti gönderme isteği Yük sınırın üzerinde olması;
  • AUTHENTICATION_ERROR: ileti gönderme isteği kimlik doğrulama hatası (mesajı göndermek için kullanılan API Anahtarını kontrol edin);
  • INVALID_TTL: ileti gönderme isteği geçersiz bir TTL.
analytics_label DİZE HTTP v1 API ile analitik etiketi iletiyi gönderirken ayarlanabilir. mesajı analiz etmek amacıyla

Dışa aktarılan verilerle ne yapabilirsiniz?

Aşağıdaki bölümlerde, BigQuery'de çalıştırabileceğiniz sorgu örnekleri sunulmaktadır karşılaştırabilirsiniz.

Gönderilen mesajları uygulamaya göre 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ı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ın sayısını öğrenin

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 iletilerinin sayısı

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

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 iletiye ilişkin etkinlikleri izlemek için bu sorguyu şu şekilde değiştirin: AND message_id != '' değerini AND message_id = <your message id>; ile değiştirin.

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

Dağılma başlangıç zamanı, orijinal isteğin alındığı ve bitiş tarihinin de saat, tek bir örneği hedefleyen son tek mesajın zamanıdır ile başlar.

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 iletilerin sayısı

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 izleme

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;