Comprendere la consegna dei messaggi

FCM fornisce tre serie di strumenti per aiutarti a ottenere informazioni dettagliate sulla consegna dei messaggi:

  • Rapporti sulla consegna dei messaggi della console Firebase
  • Metriche aggregate di distribuzione dell'SDK Android dall'API Firebase Cloud Messaging Data
  • Esportazione completa dei dati in Google BigQuery

Gli strumenti di reporting descritti in questa pagina richiedono tutti Google Analytics per funzionare. Se Google Analytics non è abilitato per il tuo progetto, puoi configurarlo nella scheda integrazioni delle impostazioni del tuo progetto Firebase.

Tieni presente che la segnalazione di molte statistiche in questa pagina è soggetta a ritardi fino a 24 ore a causa del raggruppamento di dati analitici.

Rapporti sulla consegna dei messaggi

Nella scheda Report della console Firebase, puoi visualizzare i seguenti dati per i messaggi inviati agli SDK FCM della piattaforma Android o Apple, inclusi quelli inviati tramite il compositore di notifiche e le API FCM:

  • Invia: il messaggio di dati o il messaggio di notifica è stato accodato per la consegna o è stato passato correttamente a un servizio di terze parti come gli APN per la consegna. Per ulteriori informazioni, vedere la durata di un messaggio .
  • Ricevuto (disponibile solo su dispositivi Android): il messaggio dati o il messaggio di notifica è stato ricevuto dall'app. Questi dati sono disponibili quando sul dispositivo Android ricevente è installato FCM SDK 18.0.1 o versione successiva.
  • Impressioni (disponibile solo per i messaggi di notifica sui dispositivi Android): la notifica display è stata visualizzata sul dispositivo mentre l'app è in background.
  • Apre: l'utente ha aperto il messaggio di notifica. Segnalato solo per le notifiche ricevute quando l'app è in background.

Questi dati sono disponibili per tutti i messaggi con un payload di notifica e tutti i messaggi di dati etichettati . Per ulteriori informazioni sulle etichette, consulta Aggiunta di etichette di analisi ai messaggi .

Quando visualizzi i rapporti sui messaggi, puoi impostare un intervallo di date per i dati visualizzati, con l'opzione di esportarli in CSV. Puoi anche filtrare in base a questi criteri:

  • Piattaforma (iOS o Android)
  • App
  • Etichette di analisi personalizzate

Aggiunta di etichette di analisi ai messaggi

L'etichettatura dei messaggi è molto utile per l'analisi personalizzata, poiché consente di filtrare le statistiche di consegna in base a etichette o set di etichette. Puoi aggiungere un'etichetta a qualsiasi messaggio inviato tramite l'API HTTP v1 impostando il campo fcmOptions.analyticsLabel nell'oggetto del messaggio o nei campi AndroidFcmOptions o ApnsFcmOptions specifici della piattaforma.

Le etichette di Analytics sono stringhe di testo nel formato ^[a-zA-Z0-9-_.~%]{1,50}$ . Le etichette possono includere lettere minuscole e maiuscole, numeri e i seguenti simboli:

  • -
  • ~
  • %

La lunghezza massima è di 50 caratteri. Puoi specificare fino a 100 etichette univoche al giorno; i messaggi con etichette aggiunte oltre tale limite non vengono segnalati.

Nella scheda Rapporti di messaggistica della console Firebase, puoi cercare un elenco di tutte le etichette esistenti e applicarle singolarmente o in combinazione per filtrare le statistiche visualizzate.

Dati di consegna aggregati tramite l'API dati FCM

L'API Firebase Cloud Messaging Data ti consente di recuperare informazioni che possono aiutarti a comprendere i risultati delle richieste di messaggi destinate alle applicazioni Android. L'API fornisce dati aggregati su tutti i dispositivi Android abilitati alla raccolta dati in un progetto. Ciò include dettagli sulla percentuale di messaggi consegnati senza ritardi e quanti messaggi sono stati ritardati o eliminati all'interno di Android Transport Layer . La valutazione di questi dati può rivelare tendenze generali nella consegna dei messaggi e aiutarti a trovare modi efficaci per migliorare le prestazioni delle tue richieste di invio. Consulta Sequenze temporali dei dati aggregati per informazioni sulla disponibilità dell'intervallo di date nei report.

L'API fornisce tutti i dati disponibili per una determinata applicazione. Consulta la documentazione di riferimento dell'API .

Come vengono suddivisi i dati?

I dati di consegna sono suddivisi per applicazione, data ed etichetta di analisi . Una chiamata all'API restituirà i dati per ogni combinazione di data, applicazione ed etichetta di analisi. Ad esempio, un singolo oggetto JSON androidDeliveryData sarebbe simile al seguente:

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

Come interpretare le metriche

I dati di consegna delineano la percentuale di messaggi che soddisfano ciascuna delle seguenti metriche. È possibile che un singolo messaggio soddisfi più metriche. A causa delle limitazioni nel modo in cui raccogliamo i dati e del livello di granularità con cui abbiamo aggregato le metriche, alcuni risultati dei messaggi non sono affatto rappresentati nelle metriche, quindi le percentuali seguenti non corrisponderanno al 100%.

Conteggio messaggi accettati

L'unico conteggio incluso nel set di dati è il conteggio dei messaggi accettati da FCM per il recapito ai dispositivi Android. Tutte le percentuali utilizzano questo valore come denominatore. Tieni presente che questo conteggio non includerà i messaggi destinati agli utenti che hanno disattivato la raccolta di informazioni sull'utilizzo e sulla diagnostica sui propri dispositivi.

Percentuali di risultato del messaggio

I campi inclusi nell'oggetto MessageOutcomePercents forniscono informazioni sugli esiti delle richieste di messaggi. Le categorie si escludono a vicenda. Può rispondere a domande come "I miei messaggi vengono consegnati?" e "Che cosa causa la perdita dei messaggi?"

Ad esempio, un valore elevato per il campo droppedTooManyPendingMessages potrebbe segnalare che le istanze dell'app stanno ricevendo volumi di messaggi non comprimibili che superano il limite di 100 messaggi in sospeso di FCM. Per mitigare questo problema, assicurati che la tua app gestisca le chiamate a onDeletedMessages e considera l'invio di messaggi comprimibili. Allo stesso modo, percentuali elevate di droppedDeviceInactive potrebbero essere un segnale per aggiornare i token di registrazione sul tuo server, rimuovendo i token obsoleti e annullando la loro iscrizione agli argomenti. Vedi Gestire i token di registrazione FCM per le migliori pratiche in quest'area.

Percentuali di prestazione di consegna

I campi nell'oggetto DeliveryPerformancePercents forniscono informazioni sui messaggi recapitati correttamente. Può rispondere a domande come "I miei messaggi hanno subito ritardi?" e "Perché i messaggi vengono ritardati?" Ad esempio, un valore elevato per delayedMessageThrottled indicherebbe chiaramente che stai superando i limiti massimi per dispositivo e dovresti modificare la velocità con cui invii i messaggi.

Percentuale di informazioni dettagliate sui messaggi

Questo oggetto fornisce informazioni aggiuntive su tutti i messaggi inviati. Il campo priorityLowered esprime la percentuale di messaggi accettati la cui priorità è stata abbassata da HIGH a NORMAL . Se questo valore è alto, prova a inviare meno messaggi ad alta priorità o assicurati di visualizzare sempre una notifica quando viene inviato un messaggio ad alta priorità. Consulta la nostra documentazione sulla priorità dei messaggi per maggiori informazioni

In cosa differiscono questi dati dai dati esportati in BigQuery?

L'esportazione BigQuery fornisce log di messaggi individuali sull'accettazione dei messaggi da parte del backend FCM e sulla consegna dei messaggi nell'SDK sul dispositivo (passaggi 2 e 4 dell'architettura FCM ). Questi dati sono utili per garantire che i singoli messaggi siano stati accettati e recapitati. Scopri di più sull'esportazione dei dati BigQuery nella sezione successiva.

Al contrario, l'API Firebase Cloud Messaging Data fornisce dettagli aggregati su ciò che accade nello specifico nel livello di trasporto Android (o passaggio 3 dell'architettura FCM ). Questi dati forniscono in particolare informazioni dettagliate sulla consegna dei messaggi dai backend FCM all'SDK Android. È particolarmente utile per mostrare le tendenze relative al motivo per cui i messaggi sono stati ritardati o eliminati durante questo trasporto.

In alcuni casi, è possibile che i due set di dati non corrispondano esattamente a causa di quanto segue:

  • Le metriche aggregate campionano solo una parte di tutti i messaggi
  • Le metriche aggregate sono arrotondate
  • Non presentiamo parametri al di sotto di una soglia di privacy
  • Una parte dei risultati dei messaggi manca a causa delle ottimizzazioni nel modo in cui gestiamo l'ampio volume di traffico.

Limitazioni dell'API

Cronologia dei dati aggregati

L'API restituirà 7 giorni di dati storici; tuttavia, i dati restituiti da questa API subiranno un ritardo massimo di 5 giorni. Ad esempio, il 20 gennaio, sarebbero disponibili i dati per il periodo dal 9 al 15 gennaio, ma non per il 16 gennaio o versioni successive. Inoltre, i dati vengono forniti al meglio. In caso di interruzione dei dati, FCM si adopererà per risolvere il problema e non recupererà i dati una volta risolto il problema. In caso di interruzioni più estese, i dati potrebbero non essere disponibili per una settimana o più.

Copertura dei dati

Le metriche fornite dall'API Firebase Cloud Messaging Data hanno lo scopo di fornire informazioni dettagliate sulle tendenze generali della consegna dei messaggi. Tuttavia, non forniscono una copertura del 100% di tutti gli scenari dei messaggi. I seguenti scenari sono risultati noti non riflessi nelle metriche.

Messaggi compressi

I messaggi che sono stati compressi da un altro messaggio non vengono visualizzati nel set di dati.

Messaggi ai dispositivi inattivi

I messaggi inviati a dispositivi inattivi potrebbero o meno essere visualizzati nel set di dati a seconda del percorso dati che seguono. Ciò può portare ad alcuni errori di conteggio nei campi droppedDeviceInactive e pending .

Messaggi ai dispositivi con determinate preferenze dell'utente

Gli utenti che hanno disabilitato la raccolta di informazioni di utilizzo e diagnostiche sui propri dispositivi non vedranno i propri messaggi inclusi nel nostro conteggio, in linea con le loro preferenze.

Arrotondamenti e minimi

FCM arrotonda ed esclude deliberatamente i conteggi laddove i volumi non sono sufficientemente grandi.

Esportazione dei dati BigQuery

Puoi esportare i dati dei messaggi in BigQuery per ulteriori analisi. BigQuery ti consente di analizzare i dati utilizzando BigQuery SQL, esportarli in un altro provider cloud o utilizzare i dati per i tuoi modelli ML personalizzati. Un'esportazione in BigQuery include tutti i dati disponibili per i messaggi, indipendentemente dal tipo di messaggio o dal fatto che il messaggio venga inviato tramite l'API o il compositore delle notifiche.

Per i messaggi inviati a dispositivi con le seguenti versioni minime dell'SDK FCM, hai la possibilità aggiuntiva di abilitare l'esportazione dei dati di consegna dei messaggi per la tua app:

  • Android 20.1.0 o versione successiva.
  • iOS 8.6.0 o versione successiva
  • Firebase Web SDK 9.0.0 o versione successiva

Vedi di seguito per i dettagli sull'abilitazione dell'esportazione dei dati per Android e iOS .

Per iniziare, collega il tuo progetto a BigQuery:

  1. Scegli una delle seguenti opzioni:

    • Apri il compositore delle notifiche , quindi fai clic su Accedi a BigQuery nella parte inferiore della pagina.

    • Dalla pagina Integrazioni nella console Firebase, fai clic su Collegamento nella scheda BigQuery .

      Questa pagina visualizza le opzioni di esportazione FCM per tutte le app abilitate per FCM nel progetto.

  2. Segui le istruzioni visualizzate sullo schermo per abilitare BigQuery.

Per ulteriori informazioni, consulta Collegamento di Firebase a BigQuery .

Quando abiliti l'esportazione BigQuery per Cloud Messaging:

  • Firebase esporta i tuoi dati in BigQuery. Tieni presente che il completamento della propagazione iniziale dei dati per l'esportazione potrebbe richiedere fino a 48 ore.

  • Dopo aver creato il set di dati, la posizione non può essere modificata, ma è possibile copiare il set di dati in una posizione diversa o spostare (ricreare) manualmente il set di dati in una posizione diversa. Per ulteriori informazioni, consulta Modificare la posizione del set di dati .

  • Firebase configura sincronizzazioni regolari dei tuoi dati dal tuo progetto Firebase a BigQuery. Queste operazioni di esportazione giornaliere iniziano alle 4:00, ora del Pacifico, e solitamente terminano entro 24 ore.

  • Per impostazione predefinita, tutte le app del tuo progetto sono collegate a BigQuery e tutte le app che aggiungi successivamente al progetto vengono automaticamente collegate a BigQuery. Puoi gestire quali app inviano dati .

Per disattivare l'esportazione BigQuery, scollega il tuo progetto nella console Firebase.

Abilita l'esportazione dei dati di consegna dei messaggi

I dispositivi iOS con FCM SDK 8.6.0 o versione successiva possono abilitare l'esportazione dei dati di consegna dei messaggi della propria app. FCM supporta l'esportazione dei dati sia per le notifiche di avviso che per quelle in background. Prima di abilitare queste opzioni, devi innanzitutto creare il collegamento FCM-BiqQuery per il tuo progetto come descritto in Esportazione dei dati BigQuery .

Abilita l'esportazione dei dati di consegna per le notifiche di avviso

Poiché solo le notifiche di avviso possono attivare le estensioni dell'app del servizio di notifica, devi aggiungere un'estensione del servizio di notifica alla tua app e chiamare questa API all'interno di un'estensione del servizio per abilitare il monitoraggio dei messaggi visualizzati. Consulta la documentazione di Apple sulla modifica dei contenuti nelle notifiche appena inviate .

Per ogni notifica ricevuta dovrà essere effettuata la seguente chiamata:

Veloce

// 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)
  }
}

Obiettivo-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

Se stai creando richieste di invio utilizzando l'API HTTP v1, assicurati di specificare mutable-content = 1 nell'oggetto payload .

Abilita l'esportazione dei dati di consegna per le notifiche in background

Per i messaggi in background ricevuti quando l'app è in primo piano o in background, puoi chiamare l'API di esportazione dei dati all'interno del gestore dei messaggi di dati dell'app principale. Tale chiamata dovrà essere effettuata per ogni notifica ricevuta:

Veloce

// 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)
}

Obiettivo-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

Quali dati vengono esportati in BigQuery?

Tieni presente che prendere di mira token obsoleti o registrazioni inattive potrebbe gonfiare alcune di queste statistiche.

Lo schema della tabella esportata è:

_PARTIZIONE TIMESTAMP Questa pseudo colonna contiene un timestamp per l'inizio del giorno (in UTC) in cui sono stati caricati i dati. Per la partizione AAAAMMGG, questa pseudo colonna contiene il valore TIMESTAMP('AAAA-MM-GG').
evento_timestamp TIMESTAMP Timestamp dell'evento registrato dal server
progetto numero NUMERO INTERO Il numero di progetto identifica il progetto che ha inviato il messaggio
messaggio_id CORDA L'ID messaggio identifica un messaggio. Generato dall'ID dell'app e dal timestamp, l'ID del messaggio potrebbe, in alcuni casi, non essere univoco a livello globale.
ID_istanza CORDA L'ID univoco dell'app a cui viene inviato il messaggio (se disponibile). Può essere un ID istanza o un ID di installazione Firebase.
tipo_messaggio CORDA Il tipo di messaggio. Può essere un messaggio di notifica o un messaggio di dati. L'argomento viene utilizzato per identificare il messaggio originale per un argomento o una campagna inviata; i messaggi successivi sono messaggi di notifica o di dati.
sdk_platform CORDA La piattaforma dell'app ricevente
nome dell'applicazione CORDA Il nome del pacchetto per le app Android o l'ID del pacchetto per le app iOS
collasso_chiave CORDA La chiave di compressione identifica un gruppo di messaggi che possono essere compressi. Quando un dispositivo non è connesso, solo l'ultimo messaggio con una determinata chiave di compressione viene messo in coda per l'eventuale recapito
priorità NUMERO INTERO La priorità del messaggio. I valori validi sono "normale" e "alto". Su iOS, corrispondono alle priorità 5 e 10 degli APN
ttl NUMERO INTERO Questo parametro specifica per quanto tempo (in secondi) il messaggio deve essere conservato nell'archivio FCM se il dispositivo è offline
argomento CORDA Il nome dell'argomento a cui è stato inviato un messaggio (se applicabile)
bulk_id NUMERO INTERO L'ID di massa identifica un gruppo di messaggi correlati, ad esempio un particolare invio a un argomento
evento CORDA Il tipo di evento. I valori possibili sono:
  • MESSAGE_ACCEPTED: il messaggio è stato ricevuto dal server FCM e la richiesta è valida;
  • MESSAGE_DELIVERED: il messaggio è stato recapitato all'SDK FCM dell'app sul dispositivo. Per impostazione predefinita, questo campo non viene propagato. Per abilitarlo, seguire le istruzioni fornite in setDeliveryMetricsExportToBigQuery(boolean) .
  • MISSING_REGISTRATIONS: la richiesta è stata respinta per mancanza di registrazione;
  • UNAUTHORIZED_REGISTRATION: il messaggio è stato rifiutato perché il mittente non è autorizzato all'invio alla registrazione;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: si è verificato un errore non specificato durante l'elaborazione della richiesta del messaggio;
  • MISMATCH_SENDER_ID: la richiesta di invio di un messaggio è stata respinta a causa di una mancata corrispondenza tra l'id del mittente che invia il messaggio e quello dichiarato per l'end-point;
  • QUOTA_EXCEEDED: la richiesta di invio di un messaggio è stata respinta per quota insufficiente;
  • INVALID_REGISTRATION: la richiesta di invio del messaggio è stata respinta a causa di una registrazione non valida;
  • INVALID_PACKAGE_NAME: la richiesta di invio di un messaggio è stata rifiutata a causa di un nome di pacchetto non valido;
  • INVALID_APNS_CREDENTIAL: la richiesta di invio di un messaggio è stata respinta a causa di un certificato APNS non valido;
  • INVALID_PARAMETERS: la richiesta di invio di un messaggio è stata rifiutata a causa di parametri non validi;
  • PAYLOAD_TOO_LARGE: la richiesta di invio di un messaggio è stata respinta a causa di un payload maggiore del limite;
  • AUTHENTICATION_ERROR: la richiesta di invio di un messaggio è stata rifiutata a causa di un errore di autenticazione (verificare la API Key utilizzata per inviare il messaggio);
  • INVALID_TTL: la richiesta di invio di un messaggio è stata respinta a causa di un TTL non valido.
etichetta_analitica CORDA Con l' API HTTP v1 , è possibile impostare l'etichetta di analisi al momento dell'invio del messaggio, in modo da contrassegnare il messaggio per scopi di analisi

Cosa puoi fare con i dati esportati?

Le sezioni seguenti offrono esempi di query che puoi eseguire in BigQuery sui dati FCM esportati.

Conta i messaggi inviati per app

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;

Conta le istanze univoche dell'app prese di mira dai messaggi

SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED';

Conteggio dei messaggi di notifica inviati

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';

Conteggio dei messaggi di dati inviati

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';

Conta i messaggi inviati a un argomento o a una campagna

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 != '';

Per tenere traccia degli eventi per un messaggio inviato a un argomento particolare, modifica questa query per sostituire AND message_id != '' con AND message_id = <your message id>; .

Calcola la durata del fanout per un determinato argomento o campagna

L'ora di inizio del fanout corrisponde al momento in cui viene ricevuta la richiesta originale e l'ora di fine è l'ora in cui viene creato l'ultimo messaggio individuale destinato a una singola istanza.

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;

Contare la percentuale di messaggi consegnati

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;

Tieni traccia di tutti gli eventi per un determinato ID messaggio e ID istanza

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;

Calcola la latenza per un determinato ID messaggio e ID istanza

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;