Mesaj teslimini anlama

FCM mesajın teslimi fikir sahibi olmak yardım araçları üç set sağlamaktadır:

  • Firebase konsol mesajı iletim raporları
  • Firebase Bulut Mesajlaşma Veri API Toplanan Android SDK teslim ölçümlerini
  • Google BigQuery'ye Kapsamlı veri ihracat

bu sayfada açıklanan raporlama araçları tüm işleve amacıyla Google Analytics gerektirir. Google Analytics proje için etkin değilse, sen bunu ayarlayabilirsiniz entegrasyonlar da Firebase proje ayarlarının sekme.

Bu sayfadaki istatistiklerin birçok raporlanması nedeniyle analitik verilerin harmanlanmasından 24 saat gecikmeleri konuyu olduğunu unutmayın.

İleti iletim raporları

Gelen Raporlar Firebase konsolunda sekmesi, size Bildirimler besteci ve FCM API'ler üzerinden bu gönderilenle dahil Android veya Apple platformu FCM SDK'larıyla, gönderilen mesajlar için aşağıdaki verileri görüntüleyebilir:

  • Gönderir - veri mesajı veya bildirim mesajı teslimatı için kuyruğa edilmiş veya başarılı teslimat için APN gibi bir üçüncü taraf hizmetine geçirildi. Bkz Bir mesajın ömrünü daha fazla bilgi için.
  • (Sadece Android cihazlarda kullanılabilecek) Alındı - veri mesajı veya bildirim mesajı uygulaması tarafından alınmıştır. alıcı Android cihazı FCM SDK 18.0.1 sahiptir ya da daha yüksek yüklü olduğunda bu veriler mevcuttur.
  • (Yalnızca Android cihazlarda bildirim mesajları için kullanılabilir) Gösterimler - Uygulama arka planda açıkken ekran bildirim cihazda gösterilmiştir.
  • Açılış - kullanıcı bildirim mesajı açtı. yalnızca uygulama arka planda olduğunda alınan bildirimler için bildirilmiş.

Bu veriler, bir bildirim yükü ve etiketli tüm mesajlar için kullanılabilir veri mesajlarının . Bkz Etiketler hakkında daha fazla bilgi edinmek için iletilere analitik etiketleri ekleme .

mesajı Raporları görüntülerken veri CSV olarak dışa seçeneğiyle birlikte görüntülenen için, bir tarih aralığı ayarlayabilirsiniz. Ayrıca bu kriterlere göre filtreleme yapabilirsiniz:

  • Platformu (iOS veya Android)
  • Uygulama
  • Özel analitiği etiketler

analitik ekleme iletilere etiketler

mesajları etiketlemek, etiket veya etiket kümeleri tarafından yayınlanma istatistiklerini filtrelemek için izin özel analiz için çok yararlıdır. Sen ayarlayarak HTTP v1 API yoluyla gönderilen herhangi iletiye etiket ekleyebilirsiniz fcmOptions.analyticsLabel alanına mesajı nesne veya platforma özel AndroidFcmOptions veya ApnsFcmOptions alanlar.

Analytics etiketleri biçiminde metin dizeleri ^[a-zA-Z0-9-_.~%]{1,50}$ . Etiketler alt ve üst harf, sayı ve aşağıdaki simgeleri içerebilir:

  • -
  • ~
  • %

Maksimum uzunluk 50 karakterdir. Günde 100 benzersiz etiket belirtebilirsiniz; bu sınırın ötesine eklenen etiketlerle mesajlar bildirilmez.

Raporlar sekmesini mesajlaşma Firebase konsolunda, var olan tüm etiketlerin listesini arama ve tek veya istatistik görüntülenen filtrelemek için birlikte uygulayabilirsiniz.

FCM Veri API üzerinden bir araya toplanan iletim verileri

Firebase Bulut Mesajlaşma Data API Eğer Android uygulamaları hedeflenebilir mesaj isteklerinin sonuçları anlamanıza yardımcı olabilir bilgilerini almak sağlar. API projedeki tüm veri toplama özellikli Android cihazdaki verileri toplanan sağlar. Kaç ileti gecikmesine veya içinde bırakılan yanı sıra bu gecikmeden teslim mesajların yüzde hakkındaki ayrıntılar bulunuyor Android Taşıma Katmanı . Bu verileri değerlendiren mesajı teslimat ve size gönderme istekleri performansını artırmak için etkili yollar bulmak yardım geniş eğilimleri ortaya çıkarabilir.

API belirli bir uygulama için kullanılabilir tüm veri sağlar. Bkz API referans belgeleri .

Nasıl veri bozuldu?

Teslim veri uygulaması, tarih ve tarafından bozuldu analiz etiket . API çağrısı tarih, uygulama ve analiz etiketin her kombinasyon için verileri döndürür. Örneğin, tek bir androidDeliveryData JSON nesnesi şu şekilde görünecektir:

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

Ölçümleri'ni yorumlama nasıl

Teslimat verileri aşağıdaki ölçümlerin her birini uygun mesajların yüzde özetliyor. Tek bir mesaj birden çok ölçü uyuyor olması mümkündür. Yüzdeler aşağıda toplamının% 100 olmaz bu yüzden veri ve biz ölçümleri toplanmış hangi ayrıntı düzeyini toplamak nasıl sınırlamalarından dolayı, bazı mesaj sonuçları, hiç metriklerdeki temsil edilmemektedir.

Sayım Mesajları Kabul

Sadece veri kümesi dahil sayısı Android cihazlar teslim edilmek üzere FCM tarafından kabul edildi mesajların sayısıdır. Bütün yüzdeler payda olarak bu değeri kullanın. Bu sayım cihazlarında kullanım toplama ve teşhis bilgilerini devre dışı bırakan kullanıcılara hedeflenen iletileri içermez unutmayın.

İleti Sonuç Yüzdeler

Bulunan alanların MessageOutcomePercents mesajı isteklerinin sonuçları hakkında bilgi vermek nesnesi. kategorileri tüm dışlar. Bu "İletilerimin teslim ediliyor?" Gibi sorulara cevap verebilir ve "Ne iletileri neden olan kesilmesini?"

Örneğin, için yüksek bir değer droppedTooManyPendingMessages alan uygulama örnekleri hacimleri almalarını sinyal olabilir katlanamayan mesajları 100 bekleyen mesaj FCM sınırını aşan. Bu azaltmak için, mutlaka uygulama kolları çağrı yapmak onDeletedMessages ve katlanabilir mesaj gönderme düşünün. Benzer şekilde, yüksek yüzdeler droppedDeviceInactive bayat belirteçleri çıkarmadan ve konular onları aboneliği iptal, sunucu üzerinde güncelleme kaydı jeton bir sinyal olabilir. Bkz FCM kayıt belirteçleri Yönetme bu alanda en iyi uygulamalar için.

Teslim Performans okta

Alanlar DeliveryPerformancePercents başarıyla teslim edildi mesajları hakkında bilgi vermek nesnesi. Bu "İletilerimin gecikmeli mıydı?" Gibi sorulara cevap verebilir ve "Neden mesajlar gecikiyor?" Örneğin, için yüksek bir değer delayedMessageThrottled açıkça aşan olduğunu işaret eder cihaz başına azami limitleri ve mesaj göndermek hızlarını ayarlamak gerekir.

İleti Insight Percentagess

Bu nesne tüm mesaj gönderir konusunda ek bilgi sağlar. priorityLowered alan öncelik gelen indirdi kabul mesajların yüzdesini ifade HIGH için NORMAL . Bu değer yüksek ise, daha az yüksek öncelikli mesajlar göndermeyi deneyin veya yüksek öncelikli mesajı gönderildiğinde her zaman bir bildirim görüntüler emin olun. Bkz fazla bilgi için mesaj önceliği bizim belgelere

Bu nasıl veri BigQuery'e ihraç verilerden farklıdır?

BigQuery verme cihaz (Aşama 2 ve 4 SDK'sında FCM arka ucu tarafından mesaj kabul ve mesaj teslimatı ile ilgili tek bir ileti günlükleri içerir FCM Mimarisi ). Bu veri kabul ve teslim edildi tek tek mesajları sağlanması için yararlıdır. Hakkında daha fazlasını okuyun BigQuery veri ihracat sonraki bölümde.

Buna karşılık, Firebase Bulut Mesajlaşma Veri API Android Taşıma Katmanı (veya Adım 3'te özellikle ne olduğu hakkında ayrıntı toplanmış sağlar FCM Mimarlık ). Bu veriler özellikle Android SDK FCM backends gelen mesajların iletimine ilişkin bilgi sağlar. Bu mesajlar gecikmiş veya bu taşıma esnasında düştü neden olarak eğilimleri göstermek için özellikle yararlıdır.

Bazı durumlarda, iki veri kümesi nedeniyle aşağıdakilere tam aynı olmayabilir mümkündür:

  • birleştirilmiş ölçümler yalnızca tüm mesajların bir kısmını örnek
  • birleştirilmiş metrikleri yuvarlatılmış
  • Biz bir gizlilik eşiğinin altında değil, mevcut ölçümlerini yapmak
  • mesajı sonuçların bir kısmı biz trafiğin büyük hacimli yönetmek nasıl optimizasyonlar nedeniyle eksik.

API sınırlamaları

Veri Gecikme

Bu API tarafından döndürülen veri 5 güne kadar geciktirilir edilecektir. Örneğin, 10 Ocak'ta, 5 Ocak için veriler olmayabilir, ama 6 Ocak için ya da geç olacaktır. Ayrıca, veri iyi çaba sağlanmaktadır. Bir veri kaybı durumunda, FCM öne düzeltmek için çalışacak ve dolgu koyulduktan sonraki veriler sabittir olmayacaktır. Daha büyük kesintileri, veri bir hafta veya daha uzun süre kullanım dışı olabilir.

Veri Kapsamı

Firebase Bulut Mesajlaşma Veri API tarafından sağlanan ölçümlerini mesaj teslimat geniş eğilimleri hakkında fikir sağlamak içindir. Ancak, hepsi mesaj senaryoları% 100 kapsama vermeyin. Aşağıdaki senaryolar sonuçlar bilinen metrik yansıtılmaz.

Daraltılmış Mesajlar

Edilmiş mesajlar çöktü başka mesajla veri kümesi görünmüyor.

İnaktif cihazlara iletiler

inaktif cihazlara gönderilen mesajlar veya aldıkları hangi veri yolu bağlı veri kümesi gösterilmez veya olmayabilir. Bu bazı yanlış sayma yol açabilir droppedDeviceInactive ve pending alanları.

Belirli kullanıcı tercihlerine sahip cihazlara iletiler

kullanım ve cihazlarında teşhis bilgilerinin toplanmasını devre dışı bırakan kullanıcılar, mesajlarının tercihlerine uygun olarak, bizim sayma dahil olmayacaktır.

Yuvarlama ve Minimumları

FCM kasten mermi ve dışlayan hacimleri yeterince büyük olmayan sayar.

BigQuery veri ihracat

Sen içine mesaj veri verebilirsiniz BigQuery'e daha fazla analiz için. BigQuery Eğer BigQuery SQL kullanarak verileri analiz başka bir bulut sağlayıcısına dışa veya özel ML modelleri için veri kullanmak için izin verir. BigQuery'ye bir ihracat bakılmaksızın mesaj tipi veya mesaj API veya Bildirimler besteci yoluyla gönderilen olsun, mesajlar için mevcut tüm verileri içerir.

Aşağıdaki FCM SDK asgari sürümleri ile cihazlara gönderilen mesajlar için uygulamanız için mesaj iletim veri aktarımını mümkün kılmak için ek seçenek var:

  • Android 20.1.0 veya üstü.
  • IOS 8.6.0 ya da daha yüksek
  • Firebase Web SDK 9.0.0 ya da daha yüksek

Veri etkinleştirerek ilgili ayrıntılar için aşağıya bakın Android ve iOS .

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

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

    • Bildirimler besteci , ardından sayfanın alt kısmında Erişim BigQuery'yi tıklayın.

    • Gönderen Entegrasyonları Firebase konsolundaki sayfasında, BigQuery kartta Linki tıklayın.

      projedeki tüm FCM özellikli uygulamalara yönelik Bu sayfa görüntüler FCM ihracat seçenekleri.

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

Bakınız BigQuery'ye Bağlantı Firebase fazla bilgi için.

Ne zaman Cloud Messaging için BigQuery ihraç edilmesini sağlayacak:

  • Firebase verilerinizi ihraç BigQuery'ye. İhracat ilk veri dağıtılmasının 48 saat kadar sürebilir.

  • Veri kümesi oluşturulduktan sonra, konum değiştirilemez, ancak farklı bir konuma veri kümesi kopyalamak veya elle farklı bir konumda (oluşturmanızı) veri kümesi taşıyabilirsiniz. Daha fazla bilgi için bkz değiştir veri kümesi konumu .

  • BigQuery'ye senin Firebase projesinden verilerinizin düzenli senkronizasyon kadar Firebase setleri. Bu günlük ihracat operasyonları 04:00 Pasifik Saati başlar ve genellikle 24 saat içinde bitirmek.

  • Varsayılan olarak, projedeki tüm uygulamalar BigQuery'ye bağlantılı ve herhangi daha sonra otomatik BigQuery'ye bağlantılıdır projeye eklediğiniz uygulamalar vardır. Sen edebilirsiniz uygulamalar veri göndermek hangi yönetmek .

BigQuery ihracat devre dışı bırakmak için, projenizi bağlantısını kaldırmak Firebase konsolunda.

mesajın gönderilmesi veri ihracat etkinleştirme

FCM SDK 8.6.0 veya daha yüksek olan iOS cihazlar onların uygulamanın mesaj iletim veri ihracat etkinleştirebilirsiniz. FCM hem uyarı ve arka plan bildirimleri için veri dışarıdan alır. Açıklandığı gibi bu seçenekleri etkinleştirmeden önce, ilk olarak proje için FCM-BiqQuery bağlantı oluşturmak gerekir BigQuery veri ihracat .

uyarı bildirimleri için yayınlanma verileri ihracat etkinleştirme

Sadece uyarı bildirimleri bildirim hizmeti uygulama uzantıları tetikleyebilir Çünkü, uygulamanız bir bildirim servisi uzantısı eklemek ve ekran mesajı takibini sağlamak için bir servis uzantısı içinde bu API çağırmalıdır. Apple'ın belgelerine bakın Yeni Teslim bildirimleri değiştirme İçeriğine .

Aşağıdaki çağrı alınan her bildirimde 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)
  }
}

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

Kullandığınız gönderme isteklerini bina varsa, HTTP v1 API belirtmek için emin olun mutable-content = 1 de yük nesnesi .

arka plan bildirimleri için teslimat veri ihracat etkinleştirme

Uygulamanın ön veya arka planda olduğunda arka plan mesajları alınan için, ana uygulama verileriniz mesajı işleyicisi içinde veri ihracat API çağırabilirsiniz. Bu çağrı alınan her bildirimde 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)
}

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

Hangi veriler BigQuery'ye ihraç edilmektedir?

bayat jetonları veya etkin olmayan kayıtları hedef alan bu istatistiklerin bazılarını şişirmek olabileceğini unutmayın.

ihraç tablonun şeması yer almaktadır:

_PARTITIONTIME TIMESTAMP Bu sözde sütun veri yüklenmiştir ki burada (UTC) Gün başlaması için bir zaman damgası içerir. YYYYMMDD'NIN bölümü için, bu sözde sütun değeri ZAMAN ( 'YYYY-AA-DD) içerir.
event_timestamp TIMESTAMP Sunucu tarafından kaydedildiği şekliyle Olay damgası
Proje numarası INTEGER proje numarası mesajı gönderen projeyi tanımlayan
Mesaj Kimliği SİCİM Mesaj Kimliği Mesaj tanımlar. App ID ve zaman damgası Elde Edilen, mesaj kimliği, bazı durumlarda, genel olarak benzersiz olmayabilir.
instance_id SİCİM mesajı gönderilir uygulamanın benzersiz kimlik (varsa). Bir örnek numarası veya Firebase yükleme kimliği olabilir.
mesaj tipi SİCİM mesajın türü. Bildirim mesajı veya Veri mesajı olabilir. Konuda bir konu veya kampanya gönderme için orijinal mesajı tanımlamak için kullanılır; takip eden mesajlar, ya bir bildirim veya veri mesajı.
sdk_platform SİCİM Alıcı uygulamanın platformu
uygulama ismi SİCİM Android için paket adı uygulamaları veya iOS uygulamaları için paket kimliği
collapse_key SİCİM çökme anahtar katlanabilir mesajların bir grubu tanımlar. Bir aygıt bağlı değilse, belirli bir kapatma anahtarına sahip sadece son mesajı nihai teslimat için sıraya alındı
öncelik INTEGER İletinin önceliği. Geçerli değerler "normal" ve "yüksek". iOS'ta APN bu karşılık gelir öncelikleri 5 ve 10
ttl INTEGER Cihaz çevrimdışı ise mesaj FCM depolama tutulmalıdır ne kadar (saniye cinsinden) Bu parametre belirtir
başlık SİCİM Bir ileti gönderildiği adrese konunun adı (varsa)
bulk_id INTEGER kütle numarası gibi bir konuya özel bir gönderme gibi ilgili mesajları, bir grubunu tarif etmektedir
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çerlidir;
  • MESSAGE_DELIVERED: mesaj cihazda uygulamanın FCM SDK teslim edilmiştir. Varsayılan olarak, bu alan dağıtılır. Etkinleştirmek için verilen talimatları takip setDeliveryMetricsExportToBigQuery(boolean) .
  • MISSING_REGISTRATIONS: istek eksik kayıt nedeniyle reddedildi;
  • UNAUTHORIZED_REGISTRATION: Gönderici kaydına gönderme yetkisi yok çünkü reddedildi;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: ileti isteği işlerken bir belirtilmemiş hata oluştu;
  • MISMATCH_SENDER_ID: bir mesaj göndermek için istek nedeniyle mesaj göndererek gönderici kimliği ve son nokta için ilan biri arasında uyumsuzluğu nedeniyle reddedilmiştir;
  • QUOTA_EXCEEDED: ileti göndermek için istek Yetersiz kota nedeniyle reddedildi;
  • INVALID_REGISTRATION: ileti göndermek için isteği geçersiz kayıt nedeniyle reddedildi;
  • INVALID_PACKAGE_NAME: ileti göndermek için isteği geçersiz paket adına nedeniyle reddedildi;
  • INVALID_APNS_CREDENTIAL: ileti göndermek için isteği geçersiz APNS sertifikası nedeniyle reddedildi;
  • INVALID_PARAMETERS: ileti göndermek için istek nedeniyle geçersiz parametrelere reddedildi;
  • PAYLOAD_TOO_LARGE: ileti göndermek için istek sınırdan daha yüksek bir yük nedeniyle reddedildi;
  • AUTHENTICATION_ERROR: ileti göndermek için istek yüzünden bir kimlik doğrulama hatası (Anahtar mesaj göndermek için kullanılan API çek) reddedildi;
  • INVALID_TTL: ileti göndermek için isteği geçersiz TTL nedeniyle reddedildi.
analytics_label SİCİM İle HTTP v1 API analiz amaçlı mesaj işaretlemek için, mesaj gönderirken, analitik etiket kümesi olabilir

Dışa verilerle ne yapabilir?

Aşağıdaki bölümlerde aktarılan FCM verilerine karşı BigQuery'de çalışabileceği sorgu örnekleri sunuyoruz.

Uygulama tarafından 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 hedeflediği için 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';

Sayım bildirim mesajları gönderdi

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 konu 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 konu gönderilen bir mesaj için olayları takip etmek için değiştirmek için bu sorguyu değiştirin AND message_id != '' VE message_id ile AND message_id = <your message id>; .

belirli bir konu ya da kampanya için Compute ikiye bölme süresi

Orijinal istek alındığında ikiye bölme başlangıç zamanı ve bitiş zamanı tek bir örneğini hedefleyen son bireysel mesajı oluşturulur 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;

gelen mesaj yüzdesini 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;

Verilen mesaj kimliği ve örnek kimliği için tüm olayları takip

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;

Verilen mesaj kimliği ve örnek kimliği için gecikme 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;