FCM fornisce tre set di strumenti per aiutarti a ottenere informazioni dettagliate sulla consegna dei messaggi:
- Rapporti sulla consegna dei messaggi della console Firebase
- Metriche di consegna dell'SDK Android aggregate dall'API dei dati di Firebase Cloud Messaging
- Esportazione completa dei dati in Google BigQuery
Gli strumenti di reportistica 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 delle statistiche in questa pagina è soggetta a ritardi fino a 24 ore a causa del raggruppamento dei dati di analisi.
Rapporti di 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. Vedere la durata di un messaggio per ulteriori informazioni.
- 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 ricevente è installato FCM SDK 18.0.1 o versioni successive.
- Impression (disponibile solo per i messaggi di notifica sui dispositivi Android): la notifica di visualizzazione è 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 per tutti i messaggi di dati etichettati . Per ulteriori informazioni sulle etichette, consulta Aggiunta di etichette di analisi ai messaggi .
Quando si visualizzano i rapporti sui messaggi, è possibile impostare un intervallo di date per i dati visualizzati, con l'opzione di esportazione in CSV. Puoi anche filtrare in base a questi criteri:
- Piattaforma (iOS o Android)
- App
- Etichette analitiche 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 per 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 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 FCM Data API
L'API dei dati di Firebase Cloud Messaging 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 su tutti i dispositivi Android abilitati alla raccolta dati in un progetto. Ciò include i dettagli sulla percentuale di messaggi recapitati senza ritardi e sul numero di messaggi 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. Per informazioni sulla disponibilità dell'intervallo di date nei rapporti, consulta Tempistiche dei dati aggregati .
L'API fornisce tutti i dati disponibili per una determinata applicazione. Consulta la documentazione di riferimento dell'API .
Come vengono scomposti 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
avrebbe 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 delineano la percentuale di messaggi che soddisfano ciascuna delle seguenti metriche. È possibile che un singolo messaggio si adatti a 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 si sommeranno al 100%.
Conteggio messaggi accettati
L'unico conteggio incluso nel set di dati è il conteggio dei messaggi accettati da FCM per la consegna ai dispositivi Android. Tutte le percentuali usano questo valore come denominatore. Tieni presente che questo conteggio non include i messaggi indirizzati agli utenti che hanno disattivato la raccolta di informazioni diagnostiche e sull'utilizzo sui propri dispositivi.
Percentuali di risultato del messaggio
I campi inclusi nell'oggetto MessageOutcomePercents
forniscono informazioni sui risultati delle richieste di messaggi. Le categorie si escludono a vicenda. Può rispondere a domande come "I miei messaggi vengono recapitati?" e "Cosa sta causando l'eliminazione 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 attesa di FCM. Per mitigare questo problema, assicurati che la tua app gestisca le chiamate a onDeletedMessages
e prendi in considerazione l'invio di messaggi comprimibili. Allo stesso modo, percentuali elevate per droppedDeviceInactive
potrebbero essere un segnale per aggiornare i token di registrazione sul tuo server, rimuovendo i token obsoleti e cancellandoli dagli argomenti. Vedere Gestire i token di registrazione FCM per le best practice in quest'area.
Percentuali delle prestazioni di consegna
I campi nell'oggetto DeliveryPerformancePercents
forniscono informazioni sui messaggi che sono stati recapitati correttamente. Può rispondere a domande come "I miei messaggi sono stati ritardati?" e "Perché i messaggi sono in ritardo?" Ad esempio, un valore elevato per delayedMessageThrottled
indicherebbe chiaramente che stai superando i limiti massimi per dispositivo e dovresti regolare la velocità con cui invii i messaggi.
Percentuali di informazioni sui messaggi
Questo oggetto fornisce informazioni aggiuntive su tutti gli invii di messaggi. Il campo priorityLowered
esprime la percentuale di messaggi accettati che hanno avuto la priorità 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 che modo questi dati differiscono dai dati esportati in BigQuery?
L'esportazione BigQuery fornisce singoli log dei messaggi sull'accettazione dei messaggi da parte del back-end FCM e sulla consegna dei messaggi nell'SDK sul dispositivo (fasi 2 e 4 dell'architettura FCM ). Questi dati sono utili per garantire che i singoli messaggi siano stati accettati e consegnati. Scopri di più sull'esportazione dei dati BigQuery nella sezione successiva.
Al contrario, l'API dei dati di Firebase Cloud Messaging fornisce dettagli aggregati su ciò che accade specificamente nel livello di trasporto Android (o passaggio 3 dell'architettura FCM ). Questi dati forniscono specificamente informazioni 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 metriche al di sotto di una soglia di privacy
- Manca una parte dei risultati dei messaggi a causa delle ottimizzazioni nel modo in cui gestiamo il grande volume di traffico.
Limitazioni dell'API
Timeline 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 saranno disponibili i dati per il 9 gennaio - 15 gennaio, ma non per il 16 gennaio o successivi. Inoltre, i dati vengono forniti al meglio. In caso di interruzione dei dati, FCM si adopererà per risolvere il problema e non eseguirà il backfill dei dati dopo che il problema è stato risolto. In caso di interruzioni maggiori, i dati potrebbero non essere disponibili per una settimana o più.
Copertura dati
Le metriche fornite dall'API dei dati di Firebase Cloud Messaging hanno lo scopo di fornire informazioni sulle tendenze generali della consegna dei messaggi. Tuttavia, non forniscono una copertura del 100% di tutti gli scenari di messaggio. 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 a dispositivi inattivi
I messaggi inviati a dispositivi inattivi possono o meno essere visualizzati nel set di dati a seconda del percorso dei dati che seguono. Questo può portare ad alcuni errori di conteggio nei campi droppedDeviceInactive
e pending
.
Messaggi a dispositivi con determinate preferenze dell'utente
Gli utenti che hanno disabilitato la raccolta di informazioni sull'utilizzo e la diagnostica sui propri dispositivi non vedranno i loro messaggi inclusi nel nostro conteggio, in linea con le loro preferenze.
Arrotondamenti e minimi
FCM deliberatamente arrotonda ed esclude i conteggi in cui i volumi non sono sufficientemente grandi.
Esportazione dati BigQuery
Puoi esportare i dati dei tuoi 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 di notifiche.
Per i messaggi inviati ai dispositivi con le seguenti versioni minime dell'SDK FCM, hai l'opzione aggiuntiva per abilitare l'esportazione dei dati di recapito dei messaggi per la tua app:
- Android 20.1.0 o versioni successive.
- iOS 8.6.0 o superiore
- Firebase Web SDK 9.0.0 o versioni successive
Vedi sotto per i dettagli sull'abilitazione dell'esportazione dei dati per Android e iOS .
Per iniziare, collega il tuo progetto a BigQuery:
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 Link nella scheda BigQuery .
Questa pagina mostra le opzioni di esportazione FCM per tutte le app abilitate per FCM nel progetto.
Segui le istruzioni sullo schermo per abilitare BigQuery.
Per ulteriori informazioni, consulta Collegare 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 può richiedere fino a 48 ore.
- Puoi pianificare manualmente i backfill dei dati fino agli ultimi 30 giorni.
Dopo la creazione del set di dati, la posizione non può essere modificata, ma è possibile copiare il set di dati in una posizione diversa o spostare manualmente (ricreare) il set di dati in una posizione diversa. Per ulteriori informazioni, consulta Modificare la posizione del set di dati .
Firebase imposta sincronizzazioni regolari dei tuoi dati dal tuo progetto Firebase a BigQuery. Queste operazioni di esportazione giornaliere iniziano alle 4:00 AM Pacific Time e di solito terminano in 24 ore.
Per impostazione predefinita, tutte le app nel tuo progetto sono collegate a BigQuery e tutte le app che in seguito aggiungi 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 recapito dei messaggi
I dispositivi iOS con FCM SDK 8.6.0 o versioni successive possono abilitare l'esportazione dei dati di recapito dei messaggi della loro app. FCM supporta l'esportazione dei dati sia per gli avvisi che per le notifiche in background. Prima di abilitare queste opzioni, devi prima creare il collegamento FCM-BiqQuery per il tuo progetto come descritto in BigQuery data export .
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 del contenuto nelle notifiche appena consegnate .
Per ogni notifica ricevuta deve essere effettuata la seguente chiamata:
Rapido
// 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. Questa chiamata deve essere effettuata per ogni notifica ricevuta:
Rapido
// 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 il targeting di token obsoleti o registrazioni inattive può gonfiare alcune di queste statistiche.
Lo schema della tabella esportata è:
_PARTITIONTIME | TIMESTAMP | Questa pseudo colonna contiene un timestamp per l'inizio della giornata (in UTC) in cui i dati sono stati caricati. Per la partizione YYYYMMDD, questa pseudo colonna contiene il valore TIMESTAMP('YYYY-MM-DD'). |
event_timestamp | TIMESTAMP | Timestamp dell'evento registrato dal server |
progetto numero | NUMERO INTERO | Il numero del progetto identifica il progetto che ha inviato il messaggio |
id_messaggio | CORDA | 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. |
id_istanza | CORDA | L'ID univoco dell'app a cui viene inviato il messaggio (se disponibile). Può essere un ID istanza o un ID 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 l'invio di una campagna; i messaggi successivi sono una notifica o un messaggio di dati. |
sdk_platform | CORDA | La piattaforma dell'app del destinatario |
nome dell'applicazione | CORDA | Il nome del pacchetto per le app Android o l'ID bundle per le app iOS |
crollo_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à APN 5 e 10 |
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:
|
etichetta_analisi | CORDA | Con l' API HTTP v1 , l'etichetta di analisi può essere impostata durante l'invio del messaggio, al fine di contrassegnare il messaggio a fini di analisi |
Cosa puoi fare con i dati esportati?
Le seguenti sezioni 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 di app univoche 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';
Conta 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 i 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, modificare 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 è quando viene ricevuta la richiesta originale e l'ora di fine è l'ora in cui viene creato l'ultimo singolo messaggio 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 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;
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;