Entérate de todos los anuncios de Firebase Summit y descubre cómo Firebase puede ayudarte a acelerar el desarrollo de las apps y a ejecutarlas con confianza. Más información

Comprender la entrega de mensajes

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

FCM proporciona tres conjuntos de herramientas para ayudarlo a obtener información sobre la entrega de mensajes:

  • Informes de entrega de mensajes de la consola de Firebase
  • Métricas de entrega agregadas del SDK de Android de Firebase Cloud Messaging Data API
  • Exportación completa de datos a Google BigQuery

Todas las herramientas de informes descritas en esta página requieren Google Analytics para funcionar. Si Google Analytics no está habilitado para su proyecto, puede configurarlo en la pestaña de integraciones de la configuración de su proyecto de Firebase.

Tenga en cuenta que los informes de muchas de las estadísticas de esta página están sujetos a retrasos de hasta 24 horas debido al procesamiento por lotes de los datos analíticos.

Informes de entrega de mensajes

En la pestaña Informes de Firebase console, puede ver los siguientes datos de los mensajes enviados a los SDK de FCM de la plataforma Android o Apple, incluidos los enviados a través del redactor de notificaciones y las API de FCM:

  • Envíos: el mensaje de datos o el mensaje de notificación se ha puesto en cola para su entrega o se ha pasado con éxito a un servicio de terceros como APN para su entrega. Consulte la vida útil de un mensaje para obtener más información.
  • Recibido (disponible solo en dispositivos Android): la aplicación ha recibido el mensaje de datos o el mensaje de notificación. Estos datos están disponibles cuando el dispositivo Android receptor tiene FCM SDK 18.0.1 o superior instalado.
  • Impresiones (disponible solo para mensajes de notificación en dispositivos Android): la notificación de pantalla se ha mostrado en el dispositivo mientras la aplicación está en segundo plano.
  • Se abre: el usuario abrió el mensaje de notificación. Informado solo para las notificaciones recibidas cuando la aplicación está en segundo plano.

Estos datos están disponibles para todos los mensajes con una carga útil de notificación y todos los mensajes de datos etiquetados . Para obtener más información sobre las etiquetas, consulte Agregar etiquetas de análisis a los mensajes .

Al ver informes de mensajes, puede establecer un intervalo de fechas para los datos que se muestran, con la opción de exportar a CSV. También puede filtrar por estos criterios:

  • Plataforma (iOS o Android)
  • aplicación
  • Etiquetas de análisis personalizadas

Agregar etiquetas de análisis a los mensajes

El etiquetado de mensajes es muy útil para el análisis personalizado, ya que le permite filtrar las estadísticas de entrega por etiquetas o conjuntos de etiquetas. Puede agregar una etiqueta a cualquier mensaje enviado a través de la API HTTP v1 configurando el campo fcmOptions.analyticsLabel en el objeto del mensaje o en los campos AndroidFcmOptions o ApnsFcmOptions específicos de la plataforma.

Las etiquetas de análisis son cadenas de texto con el formato ^[a-zA-Z0-9-_.~%]{1,50}$ . Las etiquetas pueden incluir letras mayúsculas y minúsculas, números y los siguientes símbolos:

  • -
  • ~
  • %

La longitud máxima es de 50 caracteres. Puede especificar hasta 100 etiquetas únicas por día; los mensajes con etiquetas agregadas más allá de ese límite no se informan.

En la pestaña Informes de mensajería de Firebase Console, puede buscar una lista de todas las etiquetas existentes y aplicarlas individualmente o en combinación para filtrar las estadísticas que se muestran.

Datos de entrega agregados a través de la API de datos de FCM

La API de datos de Firebase Cloud Messaging le permite recuperar información que puede ayudarlo a comprender los resultados de las solicitudes de mensajes dirigidas a las aplicaciones de Android. La API proporciona datos agregados en todos los dispositivos Android habilitados para la recopilación de datos en un proyecto. Esto incluye detalles sobre el porcentaje de mensajes entregados sin demora, así como cuántos mensajes se retrasaron o se descartaron dentro de la capa de transporte de Android . La evaluación de estos datos puede revelar amplias tendencias en la entrega de mensajes y ayudarlo a encontrar formas efectivas de mejorar el rendimiento de sus solicitudes de envío. Consulte Líneas de tiempo de datos agregados para obtener información sobre la disponibilidad del rango de fechas en los informes.

La API proporciona todos los datos disponibles para una aplicación determinada. Consulte la documentación de referencia de la API .

¿Cómo se desglosan los datos?

Los datos de entrega se desglosan por aplicación, fecha y etiqueta de análisis . Una llamada a la API devolverá datos para cada combinación de fecha, aplicación y etiqueta de análisis. Por ejemplo, un único objeto JSON androidDeliveryData se vería así:

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

Cómo interpretar las métricas

Los datos de entrega describen el porcentaje de mensajes que se ajustan a cada una de las siguientes métricas. Es posible que un solo mensaje se ajuste a varias métricas. Debido a las limitaciones en la forma en que recopilamos los datos y el nivel de granularidad en el que agregamos las métricas, algunos resultados de mensajes no están representados en las métricas, por lo que los porcentajes a continuación no suman el 100 %.

Contar mensajes aceptados

El único recuento incluido en el conjunto de datos es el recuento de mensajes que FCM aceptó para su envío a dispositivos Android. Todos los porcentajes utilizan este valor como denominador. Tenga en cuenta que este conteo no incluirá mensajes dirigidos a usuarios que hayan deshabilitado la recopilación de información de uso y diagnóstico en sus dispositivos.

Porcentajes de resultados de mensajes

Los campos incluidos en el objeto MessageOutcomePercents proporcionan información sobre los resultados de las solicitudes de mensajes. Las categorías son todas mutuamente excluyentes. Puede responder preguntas como "¿Se están entregando mis mensajes?" y "¿Qué está provocando que se eliminen los mensajes?"

Por ejemplo, un valor alto para el campo droppedTooManyPendingMessages podría indicar que las instancias de la aplicación están recibiendo volúmenes de mensajes no plegables que superan el límite de FCM de 100 mensajes pendientes. Para mitigar esto, asegúrese de que su aplicación maneje las llamadas a onDeletedMessages y considere enviar mensajes contraíbles. Del mismo modo, los altos porcentajes de droppedDeviceInactive podrían ser una señal para actualizar los tokens de registro en su servidor, eliminar los tokens obsoletos y cancelar su suscripción a los temas. Consulte Administrar tokens de registro de FCM para conocer las mejores prácticas en esta área.

Porcentajes de rendimiento de entrega

Los campos del objeto DeliveryPerformancePercents proporcionan información sobre los mensajes que se entregaron correctamente. Puede responder preguntas como "¿Se retrasaron mis mensajes?" y "¿Por qué se retrasan los mensajes?" Por ejemplo, un valor alto para delayedMessageThrottled indicaría claramente que está excediendo los límites máximos por dispositivo y debería ajustar la velocidad a la que está enviando mensajes.

Porcentajes de información del mensaje

Este objeto proporciona información adicional sobre todos los envíos de mensajes. El campo priorityLowered expresa el porcentaje de mensajes aceptados a los que se les ha bajado la prioridad de HIGH a NORMAL . Si este valor es alto, intente enviar menos mensajes de alta prioridad o asegúrese de mostrar siempre una notificación cuando se envíe un mensaje de alta prioridad. Consulte nuestra documentación sobre la prioridad de los mensajes para obtener más información.

¿En qué se diferencian estos datos de los datos exportados a BigQuery?

La exportación de BigQuery proporciona registros de mensajes individuales sobre la aceptación de mensajes por parte del backend de FCM y la entrega de mensajes en el SDK del dispositivo (Pasos 2 y 4 de la Arquitectura de FCM ). Estos datos son útiles para asegurar que los mensajes individuales fueron aceptados y entregados. Obtenga más información sobre la exportación de datos de BigQuery en la siguiente sección.

Por el contrario, la API de datos de Firebase Cloud Messaging proporciona detalles agregados sobre lo que sucede específicamente en la capa de transporte de Android (o el paso 3 de la arquitectura FCM ). Estos datos brindan información específica sobre la entrega de mensajes desde los backends de FCM al SDK de Android. Es particularmente útil para mostrar tendencias sobre por qué los mensajes se retrasaron o se cayeron durante este transporte.

En algunos casos, es posible que los dos conjuntos de datos no coincidan exactamente debido a lo siguiente:

  • Las métricas agregadas solo muestran una parte de todos los mensajes.
  • Las métricas agregadas se redondean
  • No presentamos métricas por debajo de un umbral de privacidad
  • Falta una parte de los resultados de los mensajes debido a las optimizaciones en la forma en que administramos el gran volumen de tráfico.

Limitaciones de la API

Líneas de tiempo de datos agregados

La API devolverá 7 días de datos históricos; sin embargo, los datos devueltos por esta API se retrasarán hasta 5 días. Por ejemplo, el 20 de enero, los datos del 9 al 15 de enero estarían disponibles, pero no los del 16 de enero o posteriores. Además, los datos se proporcionan en el mejor esfuerzo. En el caso de una interrupción de datos, FCM trabajará para solucionar el problema y no volverá a llenar los datos una vez que se solucione el problema. En interrupciones más grandes, los datos podrían no estar disponibles durante una semana o más.

Cobertura de datos

Las métricas proporcionadas por Firebase Cloud Messaging Data API están destinadas a brindar información sobre las tendencias generales de la entrega de mensajes. Sin embargo, no brindan una cobertura del 100% de todos los escenarios de mensajes. Los siguientes escenarios son resultados conocidos que no se reflejan en las métricas.

Mensajes contraídos

Los mensajes que han sido contraídos por otro mensaje no aparecen en el conjunto de datos.

Mensajes a dispositivos inactivos

Los mensajes enviados a dispositivos inactivos pueden o no aparecer en el conjunto de datos según la ruta de datos que tomen. Esto puede dar lugar a errores de recuento en los campos droppedDeviceInactive pending

Mensajes a dispositivos con ciertas preferencias de usuario

Los mensajes de los usuarios que hayan deshabilitado la recopilación de información de uso y diagnóstico en sus dispositivos no se incluirán en nuestro conteo, de acuerdo con sus preferencias.

Redondeo y Mínimos

FCM redondea y excluye deliberadamente los recuentos en los que los volúmenes no son lo suficientemente grandes.

Exportación de datos de BigQuery

Puede exportar los datos de su mensaje a BigQuery para un análisis más detallado. BigQuery le permite analizar los datos con BigQuery SQL, exportarlos a otro proveedor de la nube o usar los datos para sus modelos de aprendizaje automático personalizados. Una exportación a BigQuery incluye todos los datos disponibles para los mensajes, independientemente del tipo de mensaje o si el mensaje se envía a través de la API o el redactor de notificaciones.

Para los mensajes enviados a dispositivos con las siguientes versiones mínimas del SDK de FCM, tiene la opción adicional de habilitar la exportación de datos de entrega de mensajes para su aplicación:

  • Android 20.1.0 o superior.
  • iOS 8.6.0 o superior
  • Firebase Web SDK 9.0.0 o superior

Consulte a continuación para obtener detalles sobre cómo habilitar la exportación de datos para Android e iOS .

Para comenzar, vincula tu proyecto a BigQuery:

  1. Elige una de las siguientes opciones:

    • Abra el Redactor de notificaciones y luego haga clic en Acceder a BigQuery en la parte inferior de la página.

    • Desde la página Integraciones en la consola de Firebase, haga clic en Vínculo en la tarjeta de BigQuery .

      Esta página muestra las opciones de exportación de FCM para todas las aplicaciones habilitadas para FCM en el proyecto.

  2. Siga las instrucciones en pantalla para habilitar BigQuery.

Consulte Vincular Firebase a BigQuery para obtener más información.

Cuando habilita la exportación de BigQuery para Cloud Messaging:

  • Firebase exporta tus datos a BigQuery. Tenga en cuenta que la propagación inicial de datos para la exportación puede tardar hasta 48 horas en completarse.

  • Después de crear el conjunto de datos, no se puede cambiar la ubicación, pero puede copiar el conjunto de datos a una ubicación diferente o mover manualmente (recrear) el conjunto de datos en una ubicación diferente. Para obtener más información, consulte Cambiar la ubicación del conjunto de datos .

  • Firebase configura sincronizaciones periódicas de sus datos desde su proyecto de Firebase a BigQuery. Estas operaciones de exportación diarias comienzan a las 4:00 a. m., hora del Pacífico, y generalmente finalizan en 24 horas.

  • De manera predeterminada, todas las aplicaciones de su proyecto están vinculadas a BigQuery y cualquier aplicación que agregue más tarde al proyecto se vincula automáticamente a BigQuery. Puede administrar qué aplicaciones envían datos .

Para desactivar la exportación de BigQuery, desvincula tu proyecto en Firebase console.

Habilitar la exportación de datos de entrega de mensajes

Los dispositivos iOS con FCM SDK 8.6.0 o superior pueden habilitar la exportación de datos de entrega de mensajes de su aplicación. FCM admite la exportación de datos para notificaciones de alerta y de fondo. Antes de habilitar estas opciones, primero debe crear el enlace FCM-BiqQuery para su proyecto como se describe en Exportación de datos de BigQuery .

Habilite la exportación de datos de entrega para notificaciones de alerta

Debido a que solo las notificaciones de alerta pueden activar las extensiones de la aplicación del servicio de notificación, debe agregar una extensión del servicio de notificación a su aplicación y llamar a esta API dentro de una extensión de servicio para habilitar el seguimiento de mensajes de visualización. Consulte la documentación de Apple sobre la modificación de contenido en las notificaciones recién entregadas .

Por cada notificación que se reciba se deberá hacer el siguiente llamado:

Rápido

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

C objetivo

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

Si está creando solicitudes de envío con la API HTTP v1, asegúrese de especificar mutable-content = 1 en el objeto de carga útil .

Habilitar la exportación de datos de entrega para notificaciones en segundo plano

Para los mensajes de fondo recibidos cuando la aplicación está en primer plano o en segundo plano, puede llamar a la API de exportación de datos dentro del controlador de mensajes de datos de la aplicación principal. Esta llamada deberá realizarse por cada notificación recibida:

Rápido

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

C objetivo

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

¿Qué datos se exportan a BigQuery?

Tenga en cuenta que apuntar a tokens obsoletos o registros inactivos puede inflar algunas de estas estadísticas.

El esquema de la tabla exportada es:

_TIEMPO DE PARTICIÓN MARCA DE TIEMPO Esta pseudocolumna contiene una marca de tiempo para el inicio del día (en UTC) en el que se cargaron los datos. Para la partición AAAAMMDD, esta pseudocolumna contiene el valor TIMESTAMP('YYYY-MM-DD').
event_timestamp MARCA DE TIEMPO Marca de tiempo del evento registrada por el servidor
número de proyecto ENTERO El número de proyecto identifica el proyecto que envió el mensaje.
id_mensaje CUERDA El ID de mensaje identifica un mensaje. Generado a partir del ID de la aplicación y la marca de tiempo, el ID del mensaje puede, en algunos casos, no ser globalmente único.
id_instancia CUERDA La identificación única de la aplicación a la que se envía el mensaje (si está disponible). Puede ser un ID de instancia o un ID de instalación de Firebase.
Tipo de mensaje CUERDA El tipo de mensaje. Puede ser un mensaje de notificación o un mensaje de datos. Tema se utiliza para identificar el mensaje original de un tema o envío de campaña; los mensajes subsiguientes son una notificación o un mensaje de datos.
plataforma_sdk CUERDA La plataforma de la aplicación del destinatario.
nombre de la aplicación CUERDA El nombre del paquete para las aplicaciones de Android o la identificación del paquete para las aplicaciones de iOS
colapsar_clave CUERDA La clave de contracción identifica un grupo de mensajes que se pueden contraer. Cuando un dispositivo no está conectado, solo el último mensaje con una clave de contracción determinada se pone en cola para una entrega eventual.
prioridad ENTERO La prioridad del mensaje. Los valores válidos son "normal" y "alto". En iOS, estos corresponden a las prioridades 5 y 10 de APN
ttl ENTERO Este parámetro especifica cuánto tiempo (en segundos) se debe mantener el mensaje en el almacenamiento de FCM si el dispositivo está fuera de línea
tema CUERDA El nombre del tema al que se envió un mensaje (cuando corresponda)
id_bulto ENTERO El ID masivo identifica un grupo de mensajes relacionados, como un envío particular a un tema.
evento CUERDA El tipo de evento. Los valores posibles son:
  • MESSAGE_ACCEPTED: el servidor FCM recibió el mensaje y la solicitud es válida;
  • MESSAGE_DELIVERED: el mensaje se entregó al SDK de FCM de la aplicación en el dispositivo. De forma predeterminada, este campo no se propaga. Para habilitar, siga las instrucciones proporcionadas en setDeliveryMetricsExportToBigQuery(boolean) .
  • MISSING_REGISTRATIONS: la solicitud fue rechazada debido a que falta un registro;
  • UNAUTHORIZED_REGISTRATION: el mensaje fue rechazado porque el remitente no está autorizado para enviar al registro;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: hubo un error no especificado al procesar la solicitud del mensaje;
  • MISMATCH_SENDER_ID: la solicitud para enviar un mensaje fue rechazada debido a una falta de coincidencia entre la identificación del remitente que envía el mensaje y la declarada para el punto final;
  • CUOTA_EXCEEDED: la solicitud para enviar un mensaje fue rechazada debido a una cuota insuficiente;
  • INVALID_REGISTRATION: la solicitud para enviar un mensaje fue rechazada debido a un registro no válido;
  • INVALID_PACKAGE_NAME: la solicitud para enviar un mensaje fue rechazada debido a un nombre de paquete no válido;
  • INVALID_APNS_CREDENTIAL: la solicitud para enviar un mensaje fue rechazada debido a un certificado APNS no válido;
  • INVALID_PARAMETERS: la solicitud para enviar un mensaje fue rechazada debido a parámetros no válidos;
  • PAYLOAD_TOO_LARGE: la solicitud para enviar un mensaje fue rechazada debido a una carga útil mayor que el límite;
  • AUTHENTICATION_ERROR: la solicitud para enviar un mensaje fue rechazada debido a un error de autenticación (verifique la clave API utilizada para enviar el mensaje);
  • INVALID_TTL: la solicitud para enviar un mensaje fue rechazada debido a un TTL no válido.
etiqueta_analítica CUERDA Con la API HTTP v1 , la etiqueta de análisis se puede configurar al enviar el mensaje, para marcar el mensaje con fines analíticos.

¿Qué se puede hacer con los datos exportados?

Las siguientes secciones ofrecen ejemplos de consultas que puede ejecutar en BigQuery en sus datos de FCM exportados.

Contar mensajes enviados por aplicación

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;

Cuente las instancias de aplicaciones únicas a las que se dirigen los mensajes

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

Contar los mensajes de notificación enviados

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

Contar mensajes de datos enviados

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

Contar mensajes enviados a un tema o campaña

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

Para realizar un seguimiento de los eventos de un mensaje enviado a un tema en particular, modifique esta consulta para reemplazar AND message_id != '' con AND message_id = <your message id>; .

Calcule la duración de la fanout para un tema o campaña determinada

La hora de inicio de ramout es cuando se recibe la solicitud original y la hora de finalización es la hora en que se crea el último mensaje individual dirigido a una sola instancia.

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;

Contar el porcentaje de mensajes entregados

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;

Rastree todos los eventos para una identificación de mensaje y una identificación de instancia dadas

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;

Calcular la latencia para un ID de mensaje y un ID de instancia dados

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;