Comprendre la livraison des messages

FCM fournit trois ensembles d'outils pour vous aider à mieux comprendre la transmission des messages :

  • Rapports de remise des messages de la console Firebase
  • Métriques de diffusion du SDK Android agrégées à partir de l'API Firebase Cloud Messaging Data
  • Exportation complète des données vers Google BigQuery

Les outils de reporting décrits sur cette page nécessitent tous Google Analytics pour fonctionner. Si Google Analytics n'est pas activé pour votre projet, vous pouvez le configurer dans l'onglet intégrations des paramètres de votre projet Firebase.

Gardez à l'esprit que la communication de nombreuses statistiques sur cette page est sujette à des retards allant jusqu'à 24 heures en raison du regroupement des données analytiques.

Rapports de remise des messages

Dans l'onglet Rapports de la console Firebase, vous pouvez afficher les données suivantes pour les messages envoyés aux SDK FCM de la plate-forme Android ou Apple, y compris ceux envoyés via l'éditeur de notifications et les API FCM :

  • Envoies — Le message de données ou le message de notification a été mis en file d'attente pour être distribué ou a été transmis avec succès à un service tiers tel qu'un APN pour être distribué. Voir durée de vie d'un message pour plus d'informations.
  • Reçu (disponible uniquement sur les appareils Android) — Le message de données ou le message de notification a été reçu par l'application. Ces données sont disponibles lorsque l'appareil Android récepteur dispose du SDK FCM 18.0.1 ou supérieur.
  • Impressions (disponible uniquement pour les messages de notification sur les appareils Android) — La notification d'affichage a été affichée sur l'appareil lorsque l'application est en arrière-plan.
  • Ouvre — L'utilisateur a ouvert le message de notification. Signalé uniquement pour les notifications reçues lorsque l'application est en arrière-plan.

Ces données sont disponibles pour tous les messages avec une charge utile de notification et tous les messages de données étiquetés . Pour en savoir plus sur les étiquettes, consultez Ajout d'étiquettes d'analyse aux messages .

Lors de l'affichage des rapports de messages, vous pouvez définir une plage de dates pour les données affichées, avec la possibilité d'exporter au format CSV. Vous pouvez également filtrer selon ces critères :

  • Plateforme (iOS ou Android)
  • Application
  • Étiquettes d'analyse personnalisées

Ajout d'étiquettes d'analyse aux messages

L'étiquetage des messages est très utile pour une analyse personnalisée, vous permettant de filtrer les statistiques de diffusion par étiquettes ou ensembles d'étiquettes. Vous pouvez ajouter une étiquette à n'importe quel message envoyé via l'API HTTP v1 en définissant le champ fcmOptions.analyticsLabel dans l'objet de message ou dans les champs AndroidFcmOptions ou ApnsFcmOptions spécifiques à la plateforme.

Les étiquettes Analytics sont des chaînes de texte au format ^[a-zA-Z0-9-_.~%]{1,50}$ . Les étiquettes peuvent inclure des lettres minuscules et majuscules, des chiffres et les symboles suivants :

  • -
  • ~
  • %

La longueur maximale est de 50 caractères. Vous pouvez spécifier jusqu'à 100 étiquettes uniques par jour ; les messages avec des étiquettes ajoutées au-delà de cette limite ne sont pas signalés.

Dans l'onglet Rapports de messagerie de la console Firebase, vous pouvez rechercher une liste de toutes les étiquettes existantes et les appliquer individuellement ou en combinaison pour filtrer les statistiques affichées.

Données de livraison agrégées via l'API FCM Data

L'API Firebase Cloud Messaging Data vous permet de récupérer des informations qui peuvent vous aider à comprendre les résultats des demandes de messages ciblées sur les applications Android. L'API fournit des données agrégées sur tous les appareils Android compatibles avec la collecte de données dans un projet. Cela inclut des détails sur le pourcentage de messages livrés sans délai ainsi que le nombre de messages retardés ou abandonnés au sein de la couche de transport Android . L'évaluation de ces données peut révéler les grandes tendances en matière de transmission des messages et vous aider à trouver des moyens efficaces d'améliorer les performances de vos demandes d'envoi. Voir Chronologies des données agrégées pour plus d'informations sur la disponibilité des plages de dates dans les rapports.

L'API fournit toutes les données disponibles pour une application donnée. Consultez la documentation de référence de l'API .

Comment les données sont-elles réparties ?

Les données de livraison sont ventilées par application, date et étiquette d'analyse . Un appel à l'API renverra des données pour chaque combinaison de date, d'application et d'étiquette d'analyse. Par exemple, un seul objet JSON androidDeliveryData ressemblerait à ceci :

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

Comment interpréter les métriques

Les données de diffusion indiquent le pourcentage de messages qui correspondent à chacune des mesures suivantes. Il est possible qu'un seul message corresponde à plusieurs métriques. En raison des limites de la manière dont nous collectons les données et du niveau de granularité auquel nous avons regroupé les métriques, certains résultats de messages ne sont pas du tout représentés dans les métriques, de sorte que les pourcentages ci-dessous ne totaliseront pas 100 %.

Compter les messages acceptés

Le seul décompte inclus dans l’ensemble de données est le nombre de messages acceptés par FCM pour être distribués aux appareils Android. Tous les pourcentages utilisent cette valeur comme dénominateur. Gardez à l'esprit que ce décompte n'inclut pas les messages destinés aux utilisateurs qui ont désactivé la collecte d'informations d'utilisation et de diagnostic sur leurs appareils.

Pourcentages de résultats des messages

Les champs inclus dans l'objet MessageOutcomePercents fournissent des informations sur les résultats des demandes de message. Les catégories s’excluent toutes mutuellement. Il peut répondre à des questions telles que « Mes messages sont-ils livrés ? et "Qu'est-ce qui provoque la suppression des messages ?"

Par exemple, une valeur élevée pour le champ droppedTooManyPendingMessages pourrait signaler que les instances d'application reçoivent des volumes de messages non réductibles dépassant la limite de 100 messages en attente de FCM. Pour atténuer ce problème, assurez-vous que votre application gère les appels à onDeletedMessages et envisagez d'envoyer des messages réductibles. De même, des pourcentages élevés pour droppedDeviceInactive pourraient être un signal pour mettre à jour les jetons d'enregistrement sur votre serveur, en supprimant les jetons obsolètes et en les désabonnant des sujets. Consultez Gérer les jetons d’enregistrement FCM pour connaître les meilleures pratiques dans ce domaine.

Pourcentages de performances de livraison

Les champs de l'objet DeliveryPerformancePercents fournissent des informations sur les messages qui ont été remis avec succès. Il peut répondre à des questions telles que « Mes messages ont-ils été retardés ? et "Pourquoi les messages sont-ils retardés ?" Par exemple, une valeur élevée pour delayedMessageThrottled indiquerait clairement que vous dépassez les limites maximales par appareil et devrait ajuster la vitesse à laquelle vous envoyez des messages.

Pourcentages d'informations sur les messages

Cet objet fournit des informations supplémentaires sur tous les messages envoyés. Le champ priorityLowered exprime le pourcentage de messages acceptés dont la priorité a été abaissée de HIGH à NORMAL . Si cette valeur est élevée, essayez d'envoyer moins de messages hautement prioritaires ou assurez-vous de toujours afficher une notification lorsqu'un message hautement prioritaire est envoyé. Consultez notre documentation sur la priorité des messages pour plus d'informations

En quoi ces données diffèrent-elles des données exportées vers BigQuery ?

L'exportation BigQuery fournit des journaux de messages individuels sur l'acceptation des messages par le backend FCM et la livraison des messages dans le SDK sur l'appareil (étapes 2 et 4 de l' architecture FCM ). Ces données sont utiles pour garantir que les messages individuels ont été acceptés et livrés. En savoir plus sur l'exportation de données BigQuery dans la section suivante.

En revanche, l'API Firebase Cloud Messaging Data fournit des détails agrégés sur ce qui se passe spécifiquement dans la couche de transport Android (ou l'étape 3 de l' architecture FCM ). Ces données fournissent spécifiquement un aperçu de la transmission des messages des backends FCM au SDK Android. C'est particulièrement utile pour montrer les tendances expliquant pourquoi les messages ont été retardés ou abandonnés pendant ce transport.

Dans certains cas, il est possible que les deux ensembles de données ne correspondent pas précisément pour les raisons suivantes :

  • Les métriques agrégées n'échantillonnent qu'une partie de tous les messages
  • Les métriques agrégées sont arrondies
  • Nous ne présentons pas de mesures en dessous d'un seuil de confidentialité
  • Une partie des résultats des messages est manquante en raison d'optimisations dans la façon dont nous gérons le grand volume de trafic.

Limites de l'API

Chronologie des données agrégées

L'API renverra 7 jours de données historiques ; cependant, les données renvoyées par cette API seront retardées jusqu'à 5 jours. Par exemple, le 20 janvier, les données pour la période du 9 au 15 janvier seraient disponibles, mais pas pour le 16 janvier ou une date ultérieure. De plus, les données sont fournies au mieux. En cas de panne de données, FCM s'efforcera de résoudre le problème et ne remplira pas les données une fois le problème résolu. En cas de pannes plus importantes, les données peuvent être indisponibles pendant une semaine ou plus.

Couverture des données

Les métriques fournies par l'API Firebase Cloud Messaging Data sont destinées à fournir un aperçu des grandes tendances en matière de livraison de messages. Cependant, ils ne couvrent pas à 100 % tous les scénarios de messages. Les scénarios suivants sont des résultats connus qui ne sont pas reflétés dans les mesures.

Messages réduits

Les messages qui ont été réduits par un autre message n'apparaissent pas dans l'ensemble de données.

Messages aux appareils inactifs

Les messages envoyés aux appareils inactifs peuvent ou non apparaître dans l'ensemble de données en fonction du chemin de données qu'ils empruntent. Cela peut entraîner des erreurs de comptage dans les champs droppedDeviceInactive et pending .

Messages aux appareils avec certaines préférences utilisateur

Les utilisateurs qui ont désactivé la collecte d'informations d'utilisation et de diagnostic sur leurs appareils ne verront pas leurs messages inclus dans notre comptage, conformément à leurs préférences.

Arrondis et minimums

FCM arrondit et exclut délibérément les décomptes lorsque les volumes ne sont pas suffisamment importants.

Exportation de données BigQuery

Vous pouvez exporter les données de vos messages dans BigQuery pour une analyse plus approfondie. BigQuery vous permet d'analyser les données à l'aide de BigQuery SQL, de les exporter vers un autre fournisseur de cloud ou d'utiliser les données pour vos modèles ML personnalisés. Une exportation vers BigQuery inclut toutes les données disponibles pour les messages, quel que soit le type de message ou si le message est envoyé via l'API ou l'éditeur de notifications.

Pour les messages envoyés aux appareils dotés des versions minimales suivantes du SDK FCM, vous avez la possibilité supplémentaire d'activer l'exportation des données de remise des messages pour votre application :

  • Android 20.1.0 ou supérieur.
  • iOS 8.6.0 ou supérieur
  • Firebase Web SDK 9.0.0 ou version ultérieure

Voir ci-dessous pour plus de détails sur l'activation de l'exportation de données pour Android et iOS .

Pour commencer, associez votre projet à BigQuery :

  1. Choisissez l'une des options suivantes :

    • Ouvrez le composeur de notifications , puis cliquez sur Accéder à BigQuery en bas de la page.

    • Sur la page Intégrations de la console Firebase, cliquez sur Lien dans la carte BigQuery .

      Cette page affiche les options d'exportation FCM pour toutes les applications compatibles FCM du projet.

  2. Suivez les instructions à l'écran pour activer BigQuery.

Reportez-vous à Associer Firebase à BigQuery pour plus d'informations.

Lorsque vous activez l'exportation BigQuery pour Cloud Messaging :

  • Firebase exporte vos données vers BigQuery. Notez que la propagation initiale des données à exporter peut prendre jusqu'à 48 heures.

  • Une fois l’ensemble de données créé, l’emplacement ne peut pas être modifié, mais vous pouvez copier l’ensemble de données vers un autre emplacement ou déplacer (recréer) manuellement l’ensemble de données vers un autre emplacement. Pour en savoir plus, consultez Modifier l'emplacement du jeu de données .

  • Firebase configure des synchronisations régulières de vos données de votre projet Firebase vers BigQuery. Ces opérations d'exportation quotidiennes commencent à 4 heures du matin, heure du Pacifique, et se terminent généralement en 24 heures.

  • Par défaut, toutes les applications de votre projet sont liées à BigQuery et toutes les applications que vous ajoutez ultérieurement au projet sont automatiquement liées à BigQuery. Vous pouvez gérer quelles applications envoient des données .

Pour désactiver l'exportation BigQuery, dissociez votre projet dans la console Firebase.

Activer l'exportation des données de livraison des messages

Les appareils Android dotés du SDK FCM 20.1.0 ou version ultérieure peuvent activer l'exportation des données de diffusion des messages de leur application. L'exportation des données est désactivée par défaut au niveau de l'application . L'activer par programme au niveau de l'instance d'application vous permet de demander aux utilisateurs finaux l'autorisation d'analyser leurs données de livraison de messages (recommandé). Lorsque les deux sont définis, la valeur au niveau de l’instance d’application remplace la valeur au niveau de l’application.

Avant d'activer ces options, vous devez d'abord créer le lien FCM-BiqQuery pour votre projet, comme décrit dans Exportation de données BigQuery .

Activer l'exportation des données de livraison pour les instances d'application

Dans la plupart des cas, nous vous recommandons d'activer l'exportation des données de remise des messages uniquement au niveau de l'instance d'application et de la laisser désactivée au niveau de l'application.

 FirebaseMessaging.getInstance().setDeliveryMetricsExportToBigQuery(true)

Activer l'exportation des données de livraison pour une application

Si vous préférez activer l'exportation au niveau de l'application, veillez à ne pas appeler la méthode setDeliveryMetricsExportToBigQuery et ajoutez la propriété suivante à l'objet d'application dans le manifeste de votre application :

<application>
  <meta-data android:name="delivery_metrics_exported_to_big_query_enabled"
      android:value="true" />
</application>

Quelles données sont exportées vers BigQuery ?

Notez que le ciblage des jetons obsolètes ou des inscriptions inactives peut gonfler certaines de ces statistiques.

Le schéma de la table exportée est :

_PARTITIONTIME HORODATAGE Cette pseudo-colonne contient un horodatage du début de la journée (en UTC) dans laquelle les données ont été chargées. Pour la partition AAAAMMJJ, cette pseudo colonne contient la valeur TIMESTAMP('YYYY-MM-DD').
événement_horodatage HORODATAGE Horodatage de l'événement tel qu'enregistré par le serveur
numéro de projet ENTIER Le numéro de projet identifie le projet qui a envoyé le message
ID du message CHAÎNE L'ID du message identifie un message. Généré à partir de l’ID d’application et de l’horodatage, l’ID du message peut, dans certains cas, ne pas être globalement unique.
id_instance CHAÎNE L'identifiant unique de l'application à laquelle le message est envoyé (si disponible). Il peut s'agir d'un ID d'instance ou d'un ID d'installation Firebase.
type de message CHAÎNE Le type du message. Peut être un message de notification ou un message de données. Le sujet est utilisé pour identifier le message d'origine pour un sujet ou un envoi de campagne ; les messages suivants sont soit une notification, soit un message de données.
sdk_platform CHAÎNE La plateforme de l'application destinataire
nom de l'application CHAÎNE Le nom du package pour les applications Android ou l'identifiant du bundle pour les applications iOS
clé_effondrement CHAÎNE La clé de réduction identifie un groupe de messages qui peuvent être réduits. Lorsqu'un appareil n'est pas connecté, seul le dernier message avec une clé de réduction donnée est mis en file d'attente pour une éventuelle livraison
priorité ENTIER La priorité du message. Les valeurs valides sont « normal » et « élevé ». Sur iOS, ceux-ci correspondent aux priorités des APN 5 et 10
ttl ENTIER Ce paramètre spécifie combien de temps (en secondes) le message doit être conservé dans le stockage FCM si l'appareil est hors ligne
sujet CHAÎNE Le nom du sujet auquel un message a été envoyé (le cas échéant)
id_vrac ENTIER L'ID groupé identifie un groupe de messages associés, comme un envoi particulier à un sujet
événement CHAÎNE Le type d'événement. Les valeurs possibles sont :
  • MESSAGE_ACCEPTED : le message a été reçu par le serveur FCM et la requête est valide ;
  • MESSAGE_DELIVERED : le message a été transmis au SDK FCM de l'application sur l'appareil. Par défaut, ce champ n'est pas propagé. Pour l'activer, suivez les instructions fournies dans setDeliveryMetricsExportToBigQuery(boolean) .
  • MISSING_REGISTRATIONS : la demande a été rejetée en raison d'une inscription manquante ;
  • UNAUTHORIZED_REGISTRATION : le message a été rejeté car l'expéditeur n'est pas autorisé à envoyer à l'enregistrement ;
  • MESSAGE_RECEIVED_INTERNAL_ERROR : une erreur non spécifiée s'est produite lors du traitement de la demande de message ;
  • MISMATCH_SENDER_ID : la demande d'envoi d'un message a été rejetée en raison d'une incompatibilité entre l'identifiant de l'expéditeur qui envoie le message et celui déclaré pour le point final ;
  • QUOTA_EXCEEDED : la demande d'envoi d'un message a été rejetée en raison d'un quota insuffisant ;
  • INVALID_REGISTRATION : la demande d'envoi d'un message a été rejetée en raison d'un enregistrement invalide ;
  • INVALID_PACKAGE_NAME : la demande d'envoi d'un message a été rejetée en raison d'un nom de package invalide ;
  • INVALID_APNS_CREDENTIAL : la demande d'envoi d'un message a été rejetée en raison d'un certificat APNS invalide ;
  • INVALID_PARAMETERS : la demande d'envoi d'un message a été rejetée en raison de paramètres invalides ;
  • PAYLOAD_TOO_LARGE : la demande d'envoi d'un message a été rejetée en raison d'une charge utile supérieure à la limite ;
  • AUTHENTICATION_ERROR : la demande d'envoi d'un message a été rejetée en raison d'une erreur d'authentification (vérifiez la clé API utilisée pour envoyer le message) ;
  • INVALID_TTL : la demande d'envoi d'un message a été rejetée en raison d'un TTL invalide.
étiquette_analyse CHAÎNE Avec l' API HTTP v1 , l'étiquette d'analyse peut être définie lors de l'envoi du message, afin de marquer le message à des fins d'analyse.

Que pouvez-vous faire avec les données exportées ?

Les sections suivantes proposent des exemples de requêtes que vous pouvez exécuter dans BigQuery sur vos données FCM exportées.

Compter les messages envoyés par application

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;

Compter les instances d'application uniques ciblées par des messages

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

Compter les messages de notification envoyés

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

Compter les messages de données envoyés

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

Compter les messages envoyés à un sujet ou une campagne

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

Pour suivre les événements d'un message envoyé à un sujet particulier, modifiez cette requête pour remplacer AND message_id != '' par AND message_id = <your message id>; .

Calculer la durée de diffusion pour un sujet ou une campagne donnée

L’heure de début de la diffusion correspond à la réception de la demande d’origine et l’heure de fin correspond à l’heure à laquelle le dernier message individuel ciblant une seule instance est créé.

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;

Compter le pourcentage de messages délivré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;

Suivre tous les événements pour un identifiant de message et un identifiant d'instance donnés

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;

Calculer la latence pour un identifiant de message et un identifiant d'instance donnés

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;