İleti teslimini anlama

Devam eden mesaj yayınlama hatalarıyla ilgili sorunları gidermek için FCM sorun gidericisini kullanın ve mesajınızı görememenizin farklı nedenlerini anlamak için bu blog yayınını inceleyin. Ayrıca, FCM'yi etkileyen devam eden hizmet kesintileri olup olmadığını belirlemek için FCM durum kontrol paneli'ni de ziyaret edebilirsiniz.

FCM, mesajlaşma başarısı ve stratejisinin kapsamlı değerlendirmesi hakkında bilgi edinmenize yardımcı olacak üç araç seti de sunar:

  • Firebase konsol mesajı teslim raporu
  • Firebase Cloud Messaging Veri API'sinden alınan toplu Android SDK yayın metrikleri
  • Google BigQuery'ye kapsamlı veri aktarma

BigQuery veri dışa aktarma ve Firebase konsolundaki Raporlar sekmesinin çalışması için Google Analytics gereklidir. Projenizde Google Analytics etkin değilse Firebase proje ayarlarınızın entegrasyonlar sekmesinden ayarlayabilirsiniz. Birleştirilmiş Teslimat Verileri'nin çalışması için Google Analytics gerekmez.

Bu sayfadaki birçok istatistiğin raporlanmasının, analiz verilerinin gruplandırılması nedeniyle 24 saate kadar gecikebileceğini unutmayın.

İleti teslimi raporları

Firebase konsolundaki Raporlar sekmesinde, Android veya Apple platformu FCM SDK'larına gönderilen mesajlarla ilgili aşağıdaki verileri (Bildirim Oluşturucu ve FCM API'leri üzerinden gönderilenler dahil) görüntüleyebilirsiniz:

  • Gönderildi (Sends): Veri mesajı veya bildirim mesajı, teslim edilmek üzere sıraya alınmıştır ya da teslim edilmek üzere APNs gibi bir üçüncü taraf hizmetine başarıyla iletilmiştir. Gönderme istatistiklerinde birkaç saatlik gecikme yaşanabileceğini unutmayın. Daha fazla bilgi için ileti ömrü başlıklı makaleyi inceleyin.
  • Alındı (yalnızca Android cihazlarda kullanılabilir): Veri mesajı veya bildirim mesajı uygulama tarafından alınmıştır. Bu veri, alıcı Android cihazda FCM SDK 18.0.1 veya daha yüksek bir sürüm yüklüyse kullanılabilir.
  • Gösterimler (yalnızca Android cihazlardaki bildirim mesajları için kullanılabilir): Uygulama arka plandayken cihazda görüntüleme bildirimi gösterilmiştir.
  • Açmalar: Kullanıcı, bildirim iletisini açtı. Yalnızca uygulama arka plandayken alınan bildirimler için raporlanır.

Bu veriler, bildirim yükü içeren tüm iletiler ve tüm etiketli veri mesajları için kullanılabilir. Etiketler hakkında daha fazla bilgi edinmek için İletilere Analytics etiketleri ekleme başlıklı makaleyi inceleyin.

İleti raporlarını görüntülerken, gösterilen veriler için bir tarih aralığı belirleyebilir ve verileri CSV dosyasına aktarabilirsiniz. Ayrıca şu ölçütlere göre de filtreleme yapabilirsiniz:

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

İletilere analiz etiketi ekleme

İletileri etiketlemek, özel analiz için çok yararlıdır. Bu sayede, teslimat istatistiklerini etiketlere veya etiket gruplarına göre filtreleyebilirsiniz. HTTP v1 API'si üzerinden gönderilen iletilere, fcmOptions.analyticsLabel alanını message nesnesinde veya platforma özel AndroidFcmOptions ya da ApnsFcmOptions alanlarında ayarlayarak etiket ekleyebilirsiniz.

Analiz etiketleri, ^[a-zA-Z0-9-_.~%]{1,50}$ biçimindeki metin dizeleridir. Etiketler küçük ve büyük harf, rakam ve şu simgeleri içerebilir:

  • -
  • ~
  • %

Maksimum uzunluk 50 karakterdir. Günde en fazla 100 benzersiz etiket belirtebilirsiniz. Bu sınırın ötesinde eklenen etiketlere sahip iletiler raporlanmaz.

FirebaseKonsol mesajlaşması Raporlar sekmesinde, mevcut tüm etiketlerin listesinde arama yapabilir ve görüntülenen istatistikleri filtrelemek için etiketleri tek tek veya birlikte uygulayabilirsiniz.

FCM Veri API'si kullanılarak toplanan yayın 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 veri toplama özelliği etkin tüm Android cihazlarda toplanan verileri sağlar. Bu bilgiler arasında, iletilerin ne kadarının gecikmeden teslim edildiği ve Android Transport Layer'da kaç iletinin geciktiği veya bırakıldığıyla ilgili ayrıntılar yer alır. Bu verileri değerlendirmek, ileti teslimiyle ilgili genel trendleri ortaya çıkarabilir ve gönderme isteklerinizin performansını artırmanın etkili yollarını bulmanıza yardımcı olabilir. Raporlardaki tarih aralığı kullanılabilirliği hakkında bilgi için Toplu veri zaman çizelgeleri başlıklı makaleyi inceleyin.

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

Veriler nasıl ayrıştırılır?

Yayın verileri uygulamaya, tarihe ve Analytics etiketine göre ayrılır. API'ye yapılan bir çağrı, tarih, uygulama ve analiz etiketi kombinasyonlarının her biri için veri döndürür. Örneğin, tek bir androidDeliveryData JSON nesnesi şu şekilde 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

Teslimat verileri, aşağıdaki metriklerin her birine uyan iletilerin yüzdesini gösterir. Tek bir mesaj birden fazla metriğe uyabilir. Verileri toplama şeklimizdeki sınırlamalar ve metrikleri topladığımız ayrıntı düzeyi nedeniyle bazı mesaj sonuçları metriklerde hiç gösterilmez. Bu nedenle, aşağıdaki yüzdelerin toplamı %100 olmaz.

Kabul Edilen Mesajların Sayısı

Veri kümesine dahil edilen tek sayı, Android cihazlara teslim için FCM tarafından kabul edilen ileti sayısıdır. Tüm yüzdelerde bu değer payda olarak kullanılır. Bu sayının, cihazlarında kullanım ve teşhis bilgilerinin toplanmasını devre dışı bırakan kullanıcılara yönelik mesajları içermeyeceğini unutmayın.

Mesaj Sonucu Yüzdeleri

MessageOutcomePercents nesnesine dahil edilen alanlar, mesaj isteklerinin sonuçları hakkında bilgi sağlar. Kategorilerin tümü birbirini dışlar. "Mesajlarım teslim ediliyor mu?" ve "Mesajların bırakılmasına ne neden oluyor?" gibi soruları yanıtlayabilir.

Örneğin, droppedTooManyPendingMessages alanı için yüksek bir değer, uygulama örneklerinin FCM'ın 100 bekleyen mesaj sınırını aşan miktarlarda daraltılamayan mesajlar aldığını gösterebilir. Bunu önlemek için uygulamanızın onDeletedMessages aramalarını 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 jetonlarını güncellemek, eski jetonları kaldırmak ve bu jetonları konulardan çıkarmak için bir sinyal olabilir. Bu alandaki en iyi uygulamalar için FCM kayıt jetonlarını yönetme başlıklı makaleyi inceleyin.

Yayınlama Performansı Yüzdeleri

DeliveryPerformancePercents nesnesindeki alanlar, başarıyla teslim edilen iletiler hakkında bilgi sağlar. "İletilerim gecikti mi?" ve "İletiler neden gecikiyor?" gibi soruları yanıtlayabilir. Örneğin, delayedMessageThrottled için yüksek bir değer, cihaz başına maksimum sınırları aştığınızı net bir şekilde gösterir ve mesaj gönderme sıklığını ayarlamanız gerekir.

Mesaj Analizi Yüzdeleri

Bu nesne, tüm ileti gönderme işlemleri hakkında ek bilgiler sağlar. priorityLowered alanı, önceliği HIGH'den NORMAL'ye düşürülen kabul edilmiş iletilerin yüzdesini ifade eder. Bu değer yüksekse daha az sayıda yüksek öncelikli mesaj göndermeyi deneyin veya yüksek öncelikli bir mesaj gönderildiğinde her zaman bildirim gösterdiğinizden emin olun. İleti önceliğiyle ilgili dokümanımızı inceleyerek daha fazla bilgi edinin.

Bu veriler, BigQuery'ye aktarılan verilerden nasıl farklıdır?

BigQuery Export, FCM arka ucu tarafından iletilerin kabul edilmesi ve cihazdaki SDK'da iletilerin teslim edilmesiyle ilgili ayrı ileti günlükleri sağlar (FCM mimarisinin 2. ve 4. adımları). Bu veriler, tek tek iletilerin kabul edilip teslim edildiğinden emin olmak için yararlı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 Transport Layer'da (veya FCM mimarisinin 3. adımında) neler olduğuyla ilgili toplu ayrıntılar sağlar. Bu veriler, özellikle FCM arka uçlarından Android SDK'ya ileti teslimi hakkında bilgi sağlar. Bu özellik, iletilerin bu aktarım sırasında neden geciktiğini veya bırakıldığını gösteren trendleri göstermek için özellikle yararlıdır.

Bazı durumlarda, aşağıdaki nedenlerden dolayı iki veri kümesi tam olarak eşleşmeyebilir:

  • Toplanan metrikler, tüm iletilerin yalnızca bir bölümünü örnekler.
  • Toplu metrikler yuvarlanır.
  • Gizlilik eşiğinin altındaki metrikleri göstermeyiz.
  • Yüksek hacimli trafiği yönetme şeklimizdeki optimizasyonlar nedeniyle ileti 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 gecikebilir. Örneğin, 20 Ocak'ta 9 Ocak-15 Ocak tarihleri arasındaki veriler kullanılabilir ancak 16 Ocak veya sonraki tarihlere ait veriler kullanılamaz. Ayrıca, veriler en iyi girişim temel alınarak sağlanır. Veri kesintisi durumunda FCM, sorunu düzeltmek için çalışır ve sorun düzeltildikten sonra verileri doldurmaz. 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, ileti teslimatıyla ilgili genel eğilimler hakkında bilgi vermeyi amaçlar. Ancak tüm mesaj senaryolarında% 100 kapsama alanı sağlamazlar. Aşağıdaki senaryolar, metriklerde yansıtılmayan bilinen sonuçlardır.

Süresi dolmuş iletiler

Geçerlilik süresi (TTL), belirtilen günlük tarihinin bitiminden sonra sona ererse ileti bu tarihte droppedTtlExpired olarak sayılmaz.

Etkin olmayan cihazlara gönderilen mesajlar

Etkin olmayan cihazlara gönderilen mesajlar, hangi veri yolunu kullandıklarına bağlı olarak veri kümesinde gösterilebilir veya gösterilmeyebilir. Bu durum, 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ı, tercihlerine uygun olarak sayımımıza dahil edilmez.

Yuvarlama ve minimum değerler

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

BigQuery veri dışa aktarma

İleti verilerinizi daha ayrıntılı analiz için BigQuery'ye aktarabilirsiniz. BigQuery, verileri BigQuery SQL kullanarak analiz etmenize, başka bir bulut sağlayıcıya aktarmanıza veya özel makine öğrenimi modelleriniz için kullanmanıza olanak tanır. BigQuery'ye yapılan dışa aktarma işlemlerinde, mesaj türü veya mesajın API ya da Bildirim Oluşturucu üzerinden gönderilip gönderilmediğine bakılmaksızın mesajlarla ilgili tüm veriler yer alır.

Aşağıdaki FCM SDK minimum sürümlerinin yüklü olduğu cihazlara gönderilen mesajlar için uygulamanızın mesaj teslimi verilerinin dışa aktarılmasını etkinleştirme seçeneğiniz de vardır:

  • Android 20.1.0 veya sonraki sürümler.
  • iOS 8.6.0 veya sonraki sürümler
  • Firebase Web SDK'sı 9.0.0 veya daha sonraki bir sürüm

Android ve iOS için veri dışa aktarma özelliğini etkinleştirme hakkında ayrıntılı bilgiyi aşağıda bulabilirsiniz.

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

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

    • Bildirim oluşturma aracını açın ve sayfanın alt kısmındaki BigQuery'ye eriş'i tıklayın.

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

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

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

Daha fazla bilgi için Firebase'i BigQuery'ye bağlama başlıklı makaleyi inceleyin.

Cloud Messaging için BigQuery dışa aktarma özelliğini etkinleştirdiğinizde:

  • Firebase, verilerinizi BigQuery'e aktarır. Dışa aktarma için verilerin ilk yayılımının 48 saati bulabileceğini unutmayın.

  • Veri kümesi oluşturulduktan sonra konumu değiştirilemez ancak veri kümesini farklı bir konuma kopyalayabilir veya veri kümesini farklı bir konuma manuel olarak taşıyabilirsiniz (yeniden oluşturma). Daha fazla bilgi için Veri kümesi konumunu değiştirme başlıklı makaleyi inceleyin.

  • Firebase, Firebase projenizdeki verilerinizin BigQuery ile düzenli olarak senkronize edilmesini sağlar. Bu günlük dışa aktarma işlemleri Pasifik saatiyle 04:00'te başlar ve genellikle 24 saat içinde tamamlanır.

  • Varsayılan olarak, projenizdeki tüm uygulamalar BigQuery'ya bağlanır. Daha sonra projeye eklediğiniz tüm uygulamalar da otomatik olarak BigQuery'ya bağlanır. Hangi uygulamaların veri göndereceğini yönetebilirsiniz.

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

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

FCM SDK 8.6.0 veya sonraki sürümlerin yüklü olduğu iOS cihazlarda, uygulamanın mesaj teslimi verileri dışa aktarma özelliği etkinleştirilebilir. FCM Hem uyarı hem de arka plan bildirimleri için veri dışa aktarma özelliğini destekler. Bu seçenekleri etkinleştirmeden önce, BigQuery veri dışa aktarma bölümünde açıklandığı gibi projeniz için FCM-BigQuery bağlantısını oluşturmanız gerekir.

Uyarı bildirimleri için teslimat verilerini dışa aktarmayı etkinleştirme

Bildirim hizmeti uygulama uzantılarını yalnızca uyarı bildirimleri tetikleyebildiğinden, ileti izlemeyi etkinleştirmek için uygulamanıza bir bildirim hizmeti uzantısı eklemeniz ve bu API'yi bir hizmet uzantısının içinde çağırmanız gerekir. Apple'ın Yeni Gönderilen Bildirimlerde İçeriği Değiştirme ile ilgili dokümanına bakın.

Alınan her bildirim için aşağıdaki arama 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'sini kullanarak gönderme istekleri oluşturuyorsanız payload nesnesinde mutable-content = 1 değerini belirttiğinizden emin olun.

Arka plan bildirimleri için yayın verilerini dışa aktarmayı etkinleştirme

Uygulama ön planda veya arka plandayken alınan arka plan mesajları için, ana uygulamanın veri mesajı işleyicisi içinde veri dışa aktarma API'sini ç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ı veya etkin olmayan kayıtları hedeflemenin bu istatistiklerden bazılarının değerini artırabileceğ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 ait zaman damgasını (UTC olarak) içerir. YYYYMMDD 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ı
project_number TAM SAYI Proje numarası, mesajı gönderen projeyi tanımlar.
message_id DİZE İleti kimliği, bir iletiyi tanımlar. Uygulama kimliği ve zaman damgasından oluşturulan ileti kimliği, bazı durumlarda genel olarak benzersiz olmayabilir.
instance_id DİZE İletinin gönderildiği uygulamanın benzersiz kimliği (varsa). Örnek kimliği veya Firebase yükleme kimliği olabilir.
message_type DİZE Mesajın türü. Bildirim mesajı veya veri mesajı olabilir. Konu, bir konu veya kampanya gönderimi için orijinal mesajı tanımlamak üzere kullanılır. Sonraki mesajlar bildirim veya veri mesajıdır.
sdk_platform DİZE Alıcı uygulamasının platformu
app_name DİZE Android uygulamaları için paket adı veya iOS uygulamaları için paket kimliği
collapse_key DİZE Daraltma anahtarı, daraltılabilecek bir ileti grubunu tanımlar. Bir cihaz bağlı değilken, yalnızca belirli bir collapse_key'e sahip son mesaj, nihai teslimat için sıraya alınır.
öncelik TAM SAYI İletinin önceliği. Geçerli değerler "normal" ve "high"dır. iOS'te bunlar, APNs öncelikleri 5 ve 10'a karşılık gelir.
ttl TAM SAYI Bu parametre, cihaz çevrimdışıysa mesajın FCM depolama alanında ne kadar süreyle (saniye cinsinden) tutulacağını belirtir.
konu DİZE İletinin gönderildiği konunun adı (geçerli olduğunda)
bulk_id TAM SAYI Toplu kimlik, ilgili iletilerden oluşan bir grubu (ör. belirli bir konuya gönderilen iletiler) tanımlar.
etkinlik DİZE Etkinliğin türü. Olası değerler:
  • MESSAGE_ACCEPTED: İleti, FCM sunucusu tarafından alındı ve istek geçerli.
  • MESSAGE_DELIVERED: Mesaj, cihazdaki uygulamanın FCM SDK'sına teslim edildi. Bu alan varsayılan olarak yayılmaz. Etkinleştirmek için setDeliveryMetricsExportToBigQuery(boolean) bölümünde verilen talimatları uygulayın.
  • MISSING_REGISTRATIONS: İstek, kayıt eksik olduğu için reddedildi.
  • UNAUTHORIZED_REGISTRATION: İleti, gönderenin kayda ileti göndermeye yetkili olmaması nedeniyle 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önderen kimliği ile uç nokta için beyan edilen kimlik arasında uyuşmazlık olduğu için reddedildi.
  • QUOTA_EXCEEDED: Kota yetersizliği nedeniyle mesaj gönderme isteği reddedildi.
  • INVALID_REGISTRATION: Mesaj gönderme isteği geçersiz kayıt nedeniyle reddedildi.
  • INVALID_PACKAGE_NAME: Mesaj gönderme isteği, geçersiz paket adı nedeniyle reddedildi.
  • INVALID_APNS_CREDENTIAL: İleti gönderme isteği, geçersiz bir APNS sertifikası nedeniyle reddedildi.
  • INVALID_PARAMETERS: Mesaj gönderme isteği, geçersiz parametreler nedeniyle reddedildi.
  • PAYLOAD_TOO_LARGE: İleti gönderme isteği, sınırın üzerinde 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: İleti gönderme isteği, geçersiz TTL nedeniyle reddedildi.
analytics_label DİZE HTTP v1 API ile mesaj, analiz amacıyla işaretlenmek üzere gönderilirken analiz etiketi ayarlanabilir.

Dışa aktarılan verilerle neler yapabilirsiniz?

Aşağıdaki bölümlerde, BigQuery'de dışa aktarılan FCM verilerinizle ilgili olarak çalıştırabileceğiniz sorgulara dair örnekler verilmektedir.

Uygulamaya göre gönderilen ileti sayısı

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 hedeflendiği benzersiz uygulama örneklerinin sayısı

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ı

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ın 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 iletilerdeki etkinlikleri izlemek için bu sorguyu AND message_id != '' yerine AND message_id = <your message id>; koyacak şekilde değiştirin.

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

Yayın başlangıç zamanı, orijinal isteğin alındığı zamandır. Bitiş zamanı ise 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 iletilerin yüzdesini hesaplama

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 ileti 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 ileti kimliği ve örnek kimliği için işlem gecikmesini hesaplama

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;