Nachrichtenzustellung

Verwenden Sie zur Fehlerbehebung bei anhaltenden Problemen mit der Nachrichtenzustellung die FCM-Fehlerbehebung und lesen Sie diesen Blogbeitrag, um die verschiedenen Gründe dafür zu verstehen, warum Sie Ihre Nachricht möglicherweise nicht sehen. Sie können auch das FCM-Status-Dashboard aufrufen, um festzustellen, ob es aktuelle Dienstunterbrechungen gibt, die sich auf FCM auswirken.

FCM bietet außerdem drei Toolsets, mit denen Sie den Erfolg und die Strategie von Nachrichten umfassend analysieren können:

  • Firebase Konsolennachrichten-Zustellberichte
  • Aggregierte Messwerte zur Bereitstellung von Android-SDKs aus der Firebase Cloud Messaging Data API
  • Umfassender Datenexport nach Google BigQuery

Für den BigQuery-Datenexport und den Tab Berichte in der Firebase-Konsole ist Google Analytics erforderlich. Wenn Google Analytics für Ihr Projekt nicht aktiviert ist, können Sie es in den Firebase-Projekteinstellungen auf dem Tab Integrationen einrichten. Für Aggregated Delivery Data ist Google Analytics nicht erforderlich.

Beachten Sie, dass es bei der Berichterstellung für viele Statistiken auf dieser Seite aufgrund der Batchverarbeitung von Analysedaten zu Verzögerungen von bis zu 24 Stunden kommen kann.

Berichte zur E-Mail-Zustellung

Auf dem Tab Berichte in der Firebase-Konsole können Sie die folgenden Daten für Nachrichten ansehen, die an FCM-SDKs für Android- oder Apple-Plattformen gesendet wurden, einschließlich der Nachrichten, die über den Benachrichtigungs-Composer und die FCM-APIs gesendet wurden:

  • Sendet: Die Daten- oder Benachrichtigungsnachricht wurde für die Zustellung in die Warteschlange gestellt oder erfolgreich an einen Drittanbieterdienst wie APNs zur Zustellung übergeben. Hinweis: Es kann einige Stunden dauern, bis die Statistiken zu Sendungen aktualisiert werden. Weitere Informationen finden Sie unter Lebensdauer einer Nachricht.
  • Empfangen (nur auf Android-Geräten verfügbar): Die Daten- oder Benachrichtigungsnachricht wurde von der App empfangen. Diese Daten sind verfügbar, wenn auf dem empfangenden Android-Gerät FCM SDK 18.0.1 oder höher installiert ist.
  • Impressionen (nur für Benachrichtigungen auf Android-Geräten verfügbar): Die Benachrichtigung wurde auf dem Gerät angezeigt, während die App im Hintergrund ausgeführt wurde.
  • Öffnungen: Der Nutzer hat die Benachrichtigung geöffnet. Wird nur für Benachrichtigungen erfasst, die eingehen, wenn die App im Hintergrund ausgeführt wird.

Diese Daten sind für alle Nachrichten mit einer Benachrichtigungsnutzlast und alle gelabelten Datennachrichten verfügbar. Weitere Informationen zu Labels finden Sie unter Analyselabel zu Nachrichten hinzufügen.

Wenn Sie sich Berichte zu Mitteilungen ansehen, können Sie einen Zeitraum für die angezeigten Daten festlegen und die Daten als CSV-Datei exportieren. Sie können auch nach diesen Kriterien filtern:

  • Plattform (iOS oder Android)
  • App
  • Benutzerdefinierte Analytik-Labels

Nachrichten Analyselabels hinzufügen

Das Labeln von Nachrichten ist sehr nützlich für benutzerdefinierte Analysen, da Sie Zustellungsstatistiken nach Labels oder Gruppen von Labels filtern können. Sie können jeder Nachricht, die über die HTTP v1 API gesendet wird, ein Label hinzufügen, indem Sie das Feld fcmOptions.analyticsLabel im Objekt message oder in den plattformspezifischen Feldern AndroidFcmOptions oder ApnsFcmOptions festlegen.

Analytics-Labels sind Textstrings im Format ^[a-zA-Z0-9-_.~%]{1,50}$. Labels können Groß- und Kleinbuchstaben, Zahlen und die folgenden Symbole enthalten:

  • -
  • ~
  • %

Darf maximal 50 Zeichen lang sein. Sie können bis zu 100 eindeutige Labels pro Tag angeben. Nachrichten mit Labels, die über dieses Limit hinaus hinzugefügt wurden, werden nicht gemeldet.

Auf dem Tab Firebase-Konsolenbenachrichtigungen Berichte können Sie in einer Liste aller vorhandenen Labels suchen und sie einzeln oder in Kombination anwenden, um die angezeigten Statistiken zu filtern.

Aggregierte Auslieferungsdaten mit der FCM Data API

Mit der Firebase Cloud Messaging Data API können Sie Informationen abrufen, die Ihnen helfen, die Ergebnisse von Nachrichtenanfragen für Android-Anwendungen nachzuvollziehen. Die API stellt zusammengefasste Daten für alle Android-Geräte in einem Projekt bereit, auf denen die Datenerhebung aktiviert ist. Dazu gehören Details zum Prozentsatz der Nachrichten, die ohne Verzögerung zugestellt wurden, sowie zur Anzahl der Nachrichten, die innerhalb der Android Transport Layer verzögert oder verworfen wurden. Wenn Sie diese Daten auswerten, können Sie allgemeine Trends bei der Zustellung von Nachrichten erkennen und effektive Möglichkeiten zur Verbesserung der Leistung Ihrer Sendeanfragen finden. Informationen zur Verfügbarkeit von Zeiträumen in den Berichten finden Sie unter Zeitachse für aggregierte Daten.

Die API stellt alle für eine bestimmte Anwendung verfügbaren Daten bereit. Weitere Informationen finden Sie in der API-Referenzdokumentation.

Wie werden die Daten aufgeschlüsselt?

Die Auslieferungsdaten sind nach Anwendung, Datum und Analytics-Label aufgeschlüsselt. Bei einem Aufruf der API werden Daten für jede Kombination aus Datum, Anwendung und Analyselabel zurückgegeben. Ein einzelnes androidDeliveryData-JSON-Objekt sieht beispielsweise so aus:

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

Messwerte interpretieren

Die Zustellungsdaten geben den Prozentsatz der Nachrichten an, die den einzelnen Messwerten entsprechen. Es ist möglich, dass eine einzelne Nachricht zu mehreren Messwerten passt. Aufgrund von Einschränkungen bei der Datenerhebung und des Detaillierungsgrads, mit dem wir die Messwerte aggregiert haben, sind einige Ergebnisse von Mitteilungen in den Messwerten nicht enthalten. Die unten aufgeführten Prozentsätze ergeben daher nicht 100%.

Anzahl der akzeptierten Nachrichten

Die einzige Anzahl, die im Dataset enthalten ist, ist die Anzahl der Nachrichten, die von FCM für die Zustellung an Android-Geräte akzeptiert wurden. Alle Prozentsätze verwenden diesen Wert als Nenner. Beachten Sie, dass in dieser Anzahl keine Nachrichten enthalten sind, die an Nutzer gesendet werden, die die Erhebung von Nutzungs- und Diagnosedaten auf ihren Geräten deaktiviert haben.

Prozentsätze für Nachrichtenergebnisse

Die Felder im Objekt MessageOutcomePercents enthalten Informationen zu den Ergebnissen von Nachrichtenanfragen. Die Kategorien schließen sich gegenseitig aus. Sie können damit Fragen wie „Werden meine Nachrichten zugestellt?“ und „Warum werden Nachrichten nicht zugestellt?“ beantworten.

Ein hoher Wert für das Feld droppedTooManyPendingMessages kann beispielsweise darauf hinweisen, dass App-Instanzen eine große Anzahl von nicht minimierbaren Nachrichten empfangen, die das Limit von 100 ausstehenden Nachrichten für FCM überschreiten. Um dies zu verhindern, muss Ihre App Aufrufe von onDeletedMessages verarbeiten. Außerdem sollten Sie minimierbare Nachrichten senden. Ebenso können hohe Prozentsätze für droppedDeviceInactive ein Signal dafür sein, dass Sie Registrierungstokens auf Ihrem Server aktualisieren, alte Tokens entfernen und sie von Themen abmelden sollten. Best Practices für diesen Bereich finden Sie unter FCM-Registrierungstokens verwalten.

Prozentsätze der Auslieferungsleistung

Die Felder im DeliveryPerformancePercents-Objekt enthalten Informationen zu Nachrichten, die erfolgreich zugestellt wurden. Sie kann Fragen wie „Haben sich meine Nachrichten verzögert?“ und „Warum haben sich Nachrichten verzögert?“ beantworten. Ein hoher Wert für delayedMessageThrottled würde beispielsweise darauf hinweisen, dass Sie die maximalen Grenzwerte pro Gerät überschreiten. Sie sollten die Rate, mit der Sie Nachrichten senden, entsprechend anpassen.

Prozentsätze für Nachrichtenstatistiken

Dieses Objekt enthält zusätzliche Informationen zu allen gesendeten Nachrichten. Das Feld priorityLowered gibt den Prozentsatz der akzeptierten Nachrichten an, deren Priorität von HIGH auf NORMAL gesenkt wurde. Wenn dieser Wert hoch ist, sollten Sie weniger Nachrichten mit hoher Priorität senden oder dafür sorgen, dass immer eine Benachrichtigung angezeigt wird, wenn eine Nachricht mit hoher Priorität gesendet wird. Weitere Informationen zur Nachrichtenpriorität

Wie unterscheiden sich diese Daten von Daten, die nach BigQuery exportiert werden?

Der BigQuery-Export enthält einzelne Nachrichtenprotokolle zur Nachrichtenannahme durch das FCM-Backend und zur Nachrichtenzustellung im SDK auf dem Gerät (Schritte 2 und 4 der FCM-Architektur). Diese Daten sind nützlich, um sicherzustellen, dass einzelne Nachrichten akzeptiert und zugestellt wurden. Weitere Informationen zum BigQuery-Datenexport

Die Firebase Cloud Messaging Data API bietet dagegen aggregierte Details dazu, was genau in der Android-Transportschicht (oder Schritt 3 der FCM-Architektur) passiert. Diese Daten geben Aufschluss über die Zustellung von Nachrichten von FCM-Back-Ends an das Android SDK. Das ist besonders nützlich, um Trends zu erkennen, warum Nachrichten während dieses Transports verzögert oder verworfen wurden.

In einigen Fällen stimmen die beiden Datasets möglicherweise nicht genau überein. Das kann folgende Gründe haben:

  • Die aggregierten Messwerte basieren nur auf einer Stichprobe aller Nachrichten.
  • Die zusammengefassten Messwerte werden gerundet.
  • Messwerte unterhalb eines bestimmten Schwellenwerts werden nicht angezeigt.
  • Ein Teil der Nachrichtenergebnisse fehlt aufgrund von Optimierungen bei der Verarbeitung des großen Trafficvolumens.

Einschränkungen der API

Zeitachse für aggregierte Daten

Die API gibt historische Daten für 7 Tage zurück. Die von dieser API zurückgegebenen Daten sind jedoch um bis zu 5 Tage verzögert. Am 20. Januar sind beispielsweise die Daten für den Zeitraum vom 9. bis zum 15. Januar verfügbar, nicht aber für den 16. Januar oder später. Außerdem werden die Daten nach bestem Wissen und Gewissen bereitgestellt. Bei einem Datenausfall wird FCM das Problem beheben, aber die Daten nach der Behebung des Problems nicht rückwirkend auffüllen. Bei größeren Ausfällen können die Daten eine Woche oder länger nicht verfügbar sein.

Datenabdeckung

Die von der Firebase Cloud Messaging Data API bereitgestellten Messwerte sollen Einblicke in allgemeine Trends bei der Nachrichtenzustellung geben. Sie decken jedoch nicht alle Nachrichtenszenarien ab. Die folgenden Szenarien sind bekannte Ergebnisse, die nicht in den Messwerten berücksichtigt werden.

Abgelaufene Nachrichten

Wenn die Gültigkeitsdauer (TTL) nach dem Ende des angegebenen Protokolldatums abläuft, wird die Nachricht an diesem Datum nicht als droppedTtlExpired gezählt.

Nachrichten an inaktive Geräte

Nachrichten, die an inaktive Geräte gesendet werden, werden je nach Datenpfad möglicherweise im Dataset angezeigt. Dies kann zu Fehlern bei der Zählung in den Feldern droppedDeviceInactive und pending führen.

Nachrichten an Geräte mit bestimmten Nutzereinstellungen

Bei Nutzern, die die Erhebung von Nutzungs- und Diagnoseinformationen auf ihren Geräten deaktiviert haben, werden ihre Nachrichten gemäß ihren Einstellungen nicht in unsere Zählung einbezogen.

Rundung und Mindestbeträge

In FCM werden Zählungen bewusst gerundet und ausgeschlossen, wenn die Mengen nicht groß genug sind.

BigQuery-Datenexport

Sie können Ihre Nachrichtendaten zur weiteren Analyse in BigQuery exportieren. Mit BigQuery können Sie die Daten mit BigQuery SQL analysieren, zu einem anderen Cloud-Anbieter exportieren oder für Ihre benutzerdefinierten ML-Modelle verwenden. Ein Export nach BigQuery umfasst alle verfügbaren Daten für Nachrichten, unabhängig vom Nachrichtentyp oder davon, ob die Nachricht über die API oder den Benachrichtigungs-Composer gesendet wird.

Bei Nachrichten, die an Geräte mit den folgenden FCM SDK-Mindestversionen gesendet werden, haben Sie die zusätzliche Option, den Export von Daten zur Nachrichtenzustellung für Ihre App zu aktivieren:

  • Android 20.1.0 oder höher.
  • iOS 8.6.0 oder höher
  • Firebase Web SDK 9.0.0 oder höher

Unten finden Sie Informationen zum Aktivieren des Datenexports für Android und iOS.

So verknüpfen Sie Ihr Projekt mit BigQuery:

  1. Wählen Sie eine der folgenden Optionen aus:

    • Öffnen Sie das Tool zum Erstellen von Benachrichtigungen und klicken Sie unten auf der Seite auf Auf BigQuery zugreifen.

    • Klicken Sie in der Firebase-Konsole auf der Seite Integrationen auf der Karte BigQuery auf Verknüpfen.

      Auf dieser Seite werden die FCM-Exportoptionen für alle FCM-fähigen Apps im Projekt angezeigt.

  2. Folgen Sie der Anleitung auf dem Bildschirm, um BigQuery zu aktivieren.

Weitere Informationen finden Sie unter Firebase mit BigQuery verknüpfen.

Wenn Sie den BigQuery-Export für Cloud Messaging aktivieren, gilt Folgendes:

  • Firebase exportiert Ihre Daten nach BigQuery. Die erste Übertragung von Daten für den Export kann bis zu 48 Stunden dauern.

  • Nachdem das Dataset erstellt wurde, kann der Standort nicht mehr geändert werden. Sie können das Dataset aber an einen anderen Standort kopieren oder es manuell verschieben, d. h. an einem anderen Standort neu erstellen. Weitere Informationen finden Sie unter Dataset-Speicherort ändern.

  • Firebase richtet regelmäßige Synchronisierungen Ihrer Daten aus Ihrem Firebase-Projekt mit BigQuery ein. Diese täglichen Exportvorgänge beginnen um 4:00 Uhr Pacific Time und sind in der Regel innerhalb von 24 Stunden abgeschlossen.

  • Standardmäßig werden alle Apps in Ihrem Projekt mit BigQuery verknüpft. Alle Apps, die Sie dem Projekt später hinzufügen, werden ebenfalls automatisch mit BigQuery verknüpft. Sie können festlegen, welche Apps Daten senden.

Wenn Sie den BigQuery-Export deaktivieren möchten, heben Sie die Verknüpfung Ihres Projekts in der Firebase-Konsole auf.

Export von Daten zur Nachrichtenzustellung aktivieren

Auf iOS-Geräten mit dem FCM SDK 8.6.0 oder höher kann der Export von Daten zur Nachrichtenübermittlung für die App aktiviert werden. FCM unterstützt den Datenexport für Benachrichtigungen sowohl für Warnungen als auch für Hintergrundbenachrichtigungen. Bevor Sie diese Optionen aktivieren, müssen Sie zuerst die FCM-BigQuery-Verknüpfung für Ihr Projekt erstellen, wie unter BigQuery-Datenexport beschrieben.

Export von Zustellungsdaten für Benachrichtigungen aktivieren

Da nur Benachrichtigungen für Warnungen App-Erweiterungen für Benachrichtigungsdienste auslösen können, müssen Sie Ihrer App eine Erweiterung für Benachrichtigungsdienste hinzufügen und diese API in einer Dienst-Erweiterung aufrufen, um das Tracking von Display-Nachrichten zu aktivieren. Weitere Informationen finden Sie in der Apple-Dokumentation unter Modifying Content in Newly Delivered Notifications.

Der folgende Aufruf muss für jede empfangene Benachrichtigung erfolgen:

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

Wenn Sie Sendeanfragen mit der HTTP v1 API erstellen, müssen Sie mutable-content = 1 im Nutzlastobjekt angeben.

Export von Zustellungsdaten für Hintergrundbenachrichtigungen aktivieren

Bei Hintergrundnachrichten, die empfangen werden, wenn sich die App im Vorder- oder Hintergrund befindet, können Sie die Data Export API im Daten-Nachrichten-Handler der Haupt-App aufrufen. Dieser Aufruf muss für jede empfangene Benachrichtigung erfolgen:

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

Welche Daten werden nach BigQuery exportiert?

Wenn Sie auf alte Tokens oder inaktive Registrierungen ausrichten, können einige dieser Statistiken höher ausfallen.

Das Schema der exportierten Tabelle ist:

_PARTITIONTIME TIMESTAMP Diese Pseudospalte enthält einen Zeitstempel für den Beginn des Tages (in UTC), an dem die Daten geladen wurden. Für die YYYYMMDD-Partition enthält diese Pseudospalte den Wert TIMESTAMP('YYYY-MM-DD').
event_timestamp TIMESTAMP Zeitstempel des Ereignisses, wie vom Server aufgezeichnet
project_number INTEGER Die Projektnummer identifiziert das Projekt, aus dem die Nachricht gesendet wurde.
message_id STRING Die Nachrichten-ID identifiziert eine Nachricht. Die aus der App-ID und dem Zeitstempel generierte Nachrichten-ID ist in einigen Fällen möglicherweise nicht global eindeutig.
instance_id STRING Die eindeutige ID der App, an die die Nachricht gesendet wird (sofern verfügbar). Es kann sich um eine Instanz-ID oder eine Firebase-Installations-ID handeln.
message_type STRING Der Typ der Nachricht. Kann eine Benachrichtigungs- oder Datennachricht sein. Das Thema wird verwendet, um die ursprüngliche Nachricht für einen Themen- oder Kampagnenversand zu identifizieren. Die nachfolgenden Nachrichten sind entweder Benachrichtigungen oder Datennachrichten.
sdk_platform STRING Die Plattform der Empfänger-App
app_name STRING Den Paketnamen für Android-Apps oder die Bundle-ID für iOS-Apps
collapse_key STRING Der Collapse-Schlüssel identifiziert eine Gruppe von Nachrichten, die minimiert werden können. Wenn ein Gerät nicht verbunden ist, wird nur die letzte Nachricht mit einem bestimmten collapse_key in die Warteschlange gestellt, um sie später zu senden.
Priorität INTEGER Die Priorität der Nachricht. Gültige Werte sind „normal“ und „high“. Unter iOS entsprechen diese den APNs-Prioritäten 5 und 10.
ttl INTEGER Dieser Parameter gibt an, wie lange die Nachricht im FCM-Speicher aufbewahrt werden soll, wenn das Gerät offline ist.
Thema STRING Der Name des Themas, an das eine Nachricht gesendet wurde (falls zutreffend)
bulk_id INTEGER Die Bulk-ID kennzeichnet eine Gruppe verwandter Nachrichten, z. B. eine bestimmte Nachricht, die an ein Thema gesendet wurde.
event STRING Der Typ des Ereignisses. Mögliche Werte:
  • MESSAGE_ACCEPTED: Die Nachricht wurde vom FCM-Server empfangen und die Anfrage ist gültig.
  • MESSAGE_DELIVERED: Die Nachricht wurde an das FCM SDK der App auf dem Gerät gesendet. Standardmäßig wird dieses Feld nicht weitergegeben. Folgen Sie der Anleitung in setDeliveryMetricsExportToBigQuery(boolean), um die Funktion zu aktivieren.
  • MISSING_REGISTRATIONS: Die Anfrage wurde aufgrund einer fehlenden Registrierung abgelehnt.
  • UNAUTHORIZED_REGISTRATION: Die Nachricht wurde abgelehnt, weil der Absender nicht berechtigt ist, Nachrichten an die Registrierung zu senden.
  • MESSAGE_RECEIVED_INTERNAL_ERROR: Beim Verarbeiten der Nachrichtenanfrage ist ein nicht näher bezeichneter Fehler aufgetreten.
  • MISMATCH_SENDER_ID: Die Anfrage zum Senden einer Nachricht wurde abgelehnt, weil die Absender-ID, mit der die Nachricht gesendet wurde, nicht mit der für den Endpunkt deklarierten ID übereinstimmt.
  • QUOTA_EXCEEDED: Die Anfrage zum Senden einer Nachricht wurde aufgrund unzureichenden Kontingents abgelehnt.
  • INVALID_REGISTRATION: Die Anfrage zum Senden einer Nachricht wurde aufgrund einer ungültigen Registrierung abgelehnt.
  • INVALID_PACKAGE_NAME: Die Anfrage zum Senden einer Nachricht wurde aufgrund eines ungültigen Paketnamens abgelehnt.
  • INVALID_APNS_CREDENTIAL: Die Anfrage zum Senden einer Nachricht wurde aufgrund eines ungültigen APNS-Zertifikats abgelehnt.
  • INVALID_PARAMETERS: Die Anfrage zum Senden einer Nachricht wurde aufgrund ungültiger Parameter abgelehnt.
  • PAYLOAD_TOO_LARGE: Die Anfrage zum Senden einer Nachricht wurde aufgrund einer Nutzlast, die das Limit überschreitet, abgelehnt.
  • AUTHENTICATION_ERROR: Die Anfrage zum Senden einer Nachricht wurde aufgrund eines Authentifizierungsfehlers abgelehnt. Überprüfen Sie den API-Schlüssel, der zum Senden der Nachricht verwendet wurde.
  • INVALID_TTL: Die Anfrage zum Senden einer Nachricht wurde aufgrund einer ungültigen TTL abgelehnt.
analytics_label STRING Mit der HTTP v1 API kann das Analyselabel beim Senden der Nachricht festgelegt werden, um die Nachricht für Analysezwecke zu kennzeichnen.

Was kann ich mit den exportierten Daten tun?

In den folgenden Abschnitten finden Sie Beispiele für Abfragen, die Sie in BigQuery für Ihre exportierten FCM-Daten ausführen können.

Anzahl der gesendeten Nachrichten nach 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;

Anzahl der einzelnen App-Instanzen zählen, die auf Nachrichten ausgerichtet sind

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

Anzahl der gesendeten Benachrichtigungen

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

Anzahl der gesendeten Datennachrichten

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

An ein Thema oder eine Kampagne gesendete Nachrichten zählen

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

Wenn Sie Ereignisse für eine Nachricht erfassen möchten, die an ein bestimmtes Thema gesendet wurde, ersetzen Sie in dieser Abfrage AND message_id != '' durch AND message_id = <your message id>;.

Fanout-Dauer für ein bestimmtes Thema oder eine bestimmte Kampagne berechnen

Die Startzeit für den Fanout ist der Zeitpunkt, zu dem die ursprüngliche Anfrage empfangen wird. Die Endzeit ist der Zeitpunkt, zu dem die letzte einzelne Nachricht für eine einzelne Instanz erstellt wird.

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;

Prozentsatz der zugestellten Nachrichten

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;

Alle Ereignisse für eine bestimmte Nachrichten-ID und Instanz-ID erfassen

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;

Latenz für eine bestimmte Nachrichten-ID und Instanz-ID berechnen

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;