Informazioni sulla consegna dei messaggi

FCM fornisce tre insiemi di strumenti per aiutarti a ottenere informazioni sull'invio dei messaggi:

  • Firebase report sulla consegna dei messaggi della console
  • Metriche di pubblicazione aggregate dell'SDK Android da API di dati Firebase Cloud Messaging
  • Esportazione completa dei dati in Google BigQuery

Per funzionare, tutti gli strumenti di generazione di report descritti in questa pagina richiedono Google Analytics. Se Google Analytics non è abilitato per il tuo progetto, puoi configurarlo integrazioni delle impostazioni del progetto Firebase.

Tieni presente che la generazione di report per molte delle statistiche riportate in questa pagina è soggetta a ritardi fino a 24 ore a causa dell'aggregazione dei dati di analisi.

Report Consegna messaggi

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

  • Invii: il messaggio di dati o di notifica è stato inserito in coda per la consegna o è stato trasmesso correttamente a un servizio di terze parti come gli APN per la consegna. Per saperne di più, consulta la sezione Vita utile di un messaggio.
  • Ricevuto (disponibile solo su dispositivi Android): il messaggio di dati o il messaggio di notifica è stato ricevuto dall'app. Questi dati sono disponibili quando sul dispositivo Android di destinazione è installato l'SDK FCM 18.0.1 o versioni successive.
  • Impressioni (disponibili solo per i messaggi di notifica sui dispositivi Android): La notifica del display è stata visualizzata sul dispositivo mentre l'app era in background.
  • Apre: l'utente ha aperto il messaggio di notifica. Segnalato solo per notifiche ricevute quando l'app è in background.

Questi dati sono disponibili per tutti i messaggi con un payload per le notifiche e tutte le etichette messaggi di dati. Per scoprire di più sulle etichette, consulta Aggiungere etichette di analisi ai messaggi.

Quando visualizzi i report sui messaggi, puoi impostare un intervallo di date per i dati visualizzati, con la possibilità di esportarli in formato CSV. Puoi anche filtrare in base ai seguenti criteri:

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

Aggiunta di etichette di analisi ai messaggi

L'etichettatura dei messaggi è molto utile per l'analisi personalizzata, consentendoti di filtrare le statistiche di pubblicazione in base a etichette o insiemi di etichette. Puoi aggiungere a qualsiasi messaggio inviato tramite l'API HTTP v1 impostando il campo fcmOptions.analyticsLabel nel message oppure nell'oggetto campi AndroidFcmOptions o ApnsFcmOptions specifici della piattaforma.

Le etichette di analisi 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 uniche al giorno. i messaggi con etichette aggiunte oltre questo limite non vengono segnalati.

Nella scheda Report della messaggistica della Firebaseconsole, 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 di dati di FCM

L'API Firebase Cloud Messaging Data ti consente di recuperare informazioni che possono aiutarti a comprendere i risultati delle richieste di messaggi indirizzate alle applicazioni Android. L'API fornisce dati aggregati per tutti i dati dispositivi Android abilitati per la raccolta in un progetto. Sono inclusi i dettagli relativi la percentuale di messaggi recapitati senza ritardi e quanti messaggi sono stati ritardati o eliminati all'interno Android Transport Layer. La valutazione di questi dati può rivelare tendenze generali nell'invio dei messaggi e aiutarti a trovare modi efficaci per migliorare il rendimento delle richieste di invio. Consulta la sezione Cronologie 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 importazione sono suddivisi per applicazione, data ed etichetta di analisi. Verrà restituita una chiamata all'API per ogni combinazione di data, applicazione ed etichetta di analisi. Ad esempio, un singolo oggetto JSON androidDeliveryData ha il seguente aspetto:

 {
  "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 recapito illustrano la percentuale di messaggi che rientrano in ciascuna delle seguenti metriche. È possibile che un singolo messaggio soddisfi più metriche. A causa delle limitazioni alla nostra modalità di raccolta dei dati e il livello di granularità a cui abbiamo aggregato le metriche, alcuni risultati dei messaggi non sono rappresentati nelle metriche, pertanto la somma delle percentuali di seguito non sarà pari al 100%.

Numero messaggi accettati

L'unico conteggio incluso nel set di dati è quello dei messaggi che sono stati accettati da FCM per la consegna su dispositivi Android. Tutte le percentuali utilizzano questo valore come denominatore. Tieni presente che questo conteggio non include i messaggi indirizzati agli utenti che hanno disattivato la raccolta di informazioni di Utilizzo e diagnostica sui loro dispositivi.

Percentuali dei risultati dei messaggi

I campi inclusi nei campi MessageOutcomePercents fornire informazioni sul tipo i risultati delle richieste di messaggi. Le categorie sono tutte mutuamente esclusive. Può rispondere a domande come "I miei messaggi vengono consegnati?" e "Qual è la causa di messaggi da eliminare?"

Ad esempio, un valore alto per il campo droppedTooManyPendingMessages potrebbe indica che le istanze di app ricevono volumi messaggi non comprimibili supera il limite di 100 messaggi in attesa di FCM. Per ridurre il problema, assicurati che la tua app gestisca le chiamate a onDeletedMessages, e valuta la possibilità di inviare messaggi comprimibili. Analogamente, percentuali elevate per droppedDeviceInactive potrebbero indicare la necessità di aggiornare i token di registrazione sul tuo server, rimuovendo i token non validi e annullando la sottoscrizione agli argomenti. Consulta Gestire i token di registrazione FCM per le best practice in questo ambito.

Percentuali di rendimento della pubblicazione

I campi in DeliveryPerformancePercents fornisce informazioni sui messaggi recapitati. it Posso rispondere a domande come "I miei messaggi sono stati in ritardo?" e "Perché i messaggi sono in ritardo?" Ad esempio, un valore alto per delayedMessageThrottled indica chiaramente che stai superando limiti massimi per dispositivo, e dovrebbe regolare la frequenza con cui invii i messaggi.

Percentuali di approfondimenti sui messaggi

Questo oggetto fornisce informazioni aggiuntive su tutti gli invii di messaggi. La Il campo priorityLowered indica la percentuale di messaggi accettati che la priorità è stata abbassata da HIGH a NORMAL. Se questo valore è elevato, prova a inviare meno messaggi ad alta priorità o assicurati di visualizzare sempre una notifica quando viene inviato un messaggio ad alta priorità. Per ulteriori informazioni, consulta la nostra documentazione sulla priorità dei messaggi

In che modo questi dati sono diversi da quelli esportati in BigQuery?

L'esportazione BigQuery fornisce i singoli log dei messaggi sull'accettazione dei messaggi il backend FCM e la consegna dei messaggi nell'SDK sul dispositivo (passaggi 2 e 4 della l'architettura FCM). Questi dati sono utili per verificare che i singoli messaggi siano stati accettati e recapitati. Scopri di più su Esportazione dei dati di BigQuery nella sezione successiva.

Al contrario, l'API di dati di Firebase Cloud Messaging fornisce dettagli aggregati su ciò che accade nello specifico nel livello di trasporto Android (o nel passaggio 3 dell'architettura FCM). Questi dati forniscono informazioni specifiche sul recapito 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 persi durante questo trasporto.

In alcuni casi, è possibile che i due set di dati non corrispondano esattamente per i seguenti motivi:

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

Limitazioni dell'API

Sequenza temporale dei dati aggregati

L'API restituirà dati storici di 7 giorni; tuttavia, i dati restituiti da questa API subiranno un ritardo fino a 5 giorni. Ad esempio, su 20 gennaio saranno disponibili i dati dal 9 al 15 gennaio, ma non per gennaio 16° o successiva. Inoltre, i dati vengono forniti nel miglior modo possibile. Nel caso in cui un'interruzione dei dati, FCM cercherà di risolvere il problema in avanti e non eseguirà il backfill dei dati dopo se il problema è stato risolto. In caso di interruzioni più lunghe, i dati potrebbero non essere disponibili per una settimana o più.

Copertura dei dati

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

Messaggi scaduti

Se la durata (TTL) scade dopo la fine della data del log specificata, il messaggio non verrà conteggiato come droppedTtlExpired in questa data.

Messaggi per i dispositivi inattivi

I messaggi inviati a dispositivi inattivi possono essere visualizzati o meno nel set di dati a seconda del percorso dati che seguono. Questo può causare alcuni errori di calcolo droppedDeviceInactive e pending campi.

Messaggi per i dispositivi con determinate preferenze dell'utente

In base alle loro preferenze, i messaggi degli utenti che hanno disattivato la raccolta di informazioni sull'utilizzo e sulla diagnostica sui propri dispositivi non verranno inclusi nel nostro conteggio.

Arrotondamento e valori minimi

La funzionalità FCM arrotonda deliberatamente ed esclude i conteggi in cui i volumi non sono sufficientemente elevati.

Esportazione dei dati di BigQuery

Puoi esportare i dati dei messaggi in BigQuery per ulteriori analisi. BigQuery consente di analizzare i dati con BigQuery SQL, esportarli in un altro cloud o usare 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 riquadro di composizione delle notifiche.

Per i messaggi inviati a dispositivi con il seguente SDK minimo pari a FCM versioni successive, puoi abilitare l'esportazione dei messaggi dati di pubblicazione per la tua app:

  • Android 20.1.0 o versioni successive.
  • iOS 8.6.0 o versioni successive
  • SDK web di Firebase 9.0.0 o versioni successive

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

Per iniziare, collega il progetto a BigQuery:

  1. Scegli una delle seguenti opzioni:

    • Apri lo strumento per la creazione di notifiche, quindi fai clic su Accedi a BigQuery in fondo alla pagina.

    • Da Integrazioni nella console Firebase, fai clic su Collega in BigQuery .

      In questa pagina vengono visualizzate le opzioni di esportazione di FCM per tutte App abilitate per FCM nel progetto.

  2. Segui le istruzioni sullo schermo per attivare BigQuery.

Consulta Collegare Firebase a BigQuery per ulteriori informazioni.

Quando attivi l'esportazione di BigQuery per Cloud Messaging:

  • Firebase esporta i dati in BigQuery. Tieni presente che la propagazione iniziale dei dati per l'esportazione può richiedere fino a 48 ore.

  • Dopo aver creato il set di dati, la località non può essere modificato, ma puoi copiare il set di dati in una località diversa oppure spostare manualmente (ricreare) il set di dati in un'altra posizione. Per saperne di più, consulta Modificare la posizione del set di dati.

  • Firebase configura sincronizzazioni regolari dei dati dal progetto Firebase per BigQuery. Queste operazioni di esportazione giornaliere iniziano alle 04:00 del fuso orario del Pacifico e di solito terminano in 24 ore.

  • Per impostazione predefinita, tutte le app del progetto sono collegate a BigQuery e qualsiasi app che aggiungi in seguito viene collegata automaticamente a BigQuery. Puoi gestire le app che inviano dati.

Per disattivare l'esportazione di BigQuery: scollegare il progetto nella console Firebase.

Attivare l'esportazione dei dati di recapito dei messaggi

I dispositivi iOS con l'SDK FCM 8.6.0 o versioni successive possono attivare l'esportazione dei dati di recapito dei messaggi della propria app. FCM supporta l'esportazione dei dati sia per le notifiche di avviso sia per quelle in background. Prima di attivare queste opzioni, devi creare il FCM- Link BigQuery per il tuo progetto come descritto in Esportazione dei dati di BigQuery:

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

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

La chiamata seguente deve essere effettuata per ogni notifica ricevuta:

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

Se crei richieste di invio utilizzando l'API HTTP v1, assicurati di specifica mutable-content = 1 nel oggetto payload.

Attiva l'esportazione dei dati di recapito 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. Questa chiamata deve essere effettuata per ogni notifica ricevuta:

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

Quali dati vengono esportati in BigQuery?

Tieni presente che il targeting di token inattivi o registrazioni inattive può aumentare in parte queste statistiche.

Lo schema della tabella esportata è:

_PARTITIONTIME TIMESTAMP Questa pseudocolonna contiene un timestamp per l'inizio del giorno (in UTC) in cui sono stati caricati i dati. Per la partizione YYYYMMDD, questa pseudocolonna contiene il valore TIMESTAMP('AAAA-MM-GG').
event_timestamp TIMESTAMP Timestamp dell'evento registrato dal server
project_number NUMERO INTERO Il numero del progetto identifica il progetto che ha inviato il messaggio
message_id STRING L'ID messaggio identifica un messaggio. Generato dall'ID app e dal timestamp, l'ID messaggio potrebbe, in alcuni casi, non essere univoco a livello globale.
instance_id STRING L'ID univoco dell'app a cui viene inviato il messaggio (se disponibile). È possibile un ID istanza o un ID installazione Firebase.
message_type STRING 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 l'invio di un argomento o di una campagna. I messaggi successivi sono una notifica o un messaggio di dati.
piattaforma_SDK STRING La piattaforma dell'app del destinatario
app_name STRING Il nome del pacchetto per le app per Android o l'ID pacchetto per le app per iOS
chiave_comprimi STRING 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 chiusura viene messo in coda per l'eventuale invio
priorità NUMERO INTERO La priorità del messaggio. I valori validi sono "normali" e "alta". Su iOS, queste corrispondono alle priorità APN 5 e 10
TTL NUMERO INTERO Questo parametro specifica per quanto tempo (in secondi) il messaggio deve essere conservato nello spazio di archiviazione FCM se il dispositivo è offline
argomento STRING Il nome dell'argomento a cui è stato inviato un messaggio (se applicabile)
collettivo_id NUMERO INTERO L'ID collettivo identifica un gruppo di messaggi correlati, come un messaggio invia a un argomento
evento STRING 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 inviato all'SDK FCM dell'app sul dispositivo. Per impostazione predefinita, questo campo non viene propagato. Per attivarla, segui le istruzioni fornite in setDeliveryMetricsExportToBigQuery(boolean).
  • MISSING_REGISTRATIONS: la richiesta è stata rifiutata a causa di una registrazione mancante.
  • UNAUTHORIZED_REGISTRATION: il messaggio è stato rifiutato perché il mittente è non autorizzata a inviare la registrazione;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: si è verificato un errore non specificato durante l'elaborazione della richiesta di messaggio.
  • MISMATCH_SENDER_ID: la richiesta di invio di un messaggio è stata rifiutata a causa di una mancata corrispondenza tra l'ID mittente che invia il messaggio e quello dichiarato per l'endpoint.
  • QUOTA_EXCEEDED: la richiesta di invio di un messaggio è stata rifiutata a causa di una quota insufficiente.
  • INVALID_REGISTRATION: la richiesta di invio di un messaggio è stata rifiutata a causa di un registrazione non valida;
  • INVALID_PACKAGE_NAME: la richiesta di invio di un messaggio è stata rifiutata a causa di un nome del pacchetto non valido;
  • INVALID_APNS_CREDENTIAL: la richiesta di invio di un messaggio è stata rifiutata 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 rifiutata a causa di un payload più grande del limite.
  • AUTHENTICATION_ERROR: la richiesta di invio di un messaggio è stata rifiutata a causa di un errore di autenticazione (controlla la chiave API utilizzata per inviare il messaggio);
  • INVALID_TTL: la richiesta di invio di un messaggio è stata rifiutata a causa di un TTL non valido.
etichetta_analisi STRING Con l'API HTTP v1, l'etichetta di analisi può essere impostata durante l'invio del messaggio, in modo da contrassegnare il messaggio a fini di analisi.

Che cosa puoi fare con i dati esportati?

Le sezioni seguenti forniscono esempi di query che puoi eseguire in BigQuery rispetto ai dati di FCM esportati.

Numero di 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;

Conteggia le istanze di app univoche scelte come target 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';

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

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

Conteggia 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 monitorare gli eventi relativi a un messaggio inviato a un determinato argomento, modifica questa query sostituendo AND message_id != '' con AND message_id = <your message id>;.

Calcola la durata del fanout per un determinato argomento o una determinata campagna

L'ora di inizio del fanout corrisponde al momento in cui viene ricevuta la richiesta originale e l'ora di fine corrisponde al momento in cui viene creato l'ultimo messaggio singolo che ha come target 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;

Conteggia la percentuale di messaggi recapitati

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;

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