Понимание доставки сообщений

Для устранения текущих сбоев доставки сообщений используйте средство устранения неполадок FCM и прочитайте эту запись в блоге, чтобы понять различные причины, по которым вы можете не видеть свое сообщение. Вы также можете посетить панель мониторинга состояния FCM, чтобы определить, есть ли какие-либо текущие сбои в работе службы, влияющие на FCM.

FCM также предоставляет три набора инструментов, которые помогут вам получить общее представление об успешности и стратегии обмена сообщениями:

  • Отчеты о доставке сообщений консоли Firebase
  • Агрегированные показатели доставки Android SDK из Firebase Cloud Messaging Data API
  • Комплексный экспорт данных в Google BigQuery

Для работы всех инструментов отчетности, описанных на этой странице, требуется Google Analytics . Если Google Analytics не включен для вашего проекта, вы можете настроить его на вкладке интеграции в настройках проекта Firebase.

Имейте в виду, что предоставление многих статистических данных на этой странице может быть отложено на срок до 24 часов из-за пакетной обработки аналитических данных.

Отчеты о доставке сообщений

На вкладке «Отчеты» в консоли Firebase можно просмотреть следующие данные для сообщений, отправленных в SDK FCM для платформ Android или Apple, включая сообщения, отправленные через компоновщик уведомлений и API FCM:

  • Отправки — сообщение с данными или уведомление поставлено в очередь на доставку или успешно передано сторонней службе, например APNs, для доставки. Для получения дополнительной информации см. время жизни сообщения .
  • Received (доступно только на устройствах Android) — сообщение с данными или уведомление было получено приложением. Эти данные доступны, если на принимающем устройстве Android установлен FCM SDK 18.0.1 или выше.
  • Показы (доступно только для уведомлений на устройствах Android) — уведомление на дисплее было отображено на устройстве, пока приложение работало в фоновом режиме.
  • Открывает — Пользователь открыл сообщение с уведомлением. Сообщается только для уведомлений, полученных, когда приложение находится в фоновом режиме.

Эти данные доступны для всех сообщений с полезной нагрузкой уведомления и всех помеченных сообщений с данными . Чтобы узнать больше о метках, см. Добавление аналитических меток к сообщениям .

При просмотре отчетов сообщений вы можете задать диапазон дат для отображаемых данных с возможностью экспорта в CSV. Вы также можете фильтровать по следующим критериям:

  • Платформа (iOS или Android)
  • Приложение
  • Пользовательские аналитические метки

Добавление аналитических меток к сообщениям

Маркировка сообщений очень полезна для пользовательского анализа, позволяя фильтровать статистику доставки по меткам или наборам меток. Вы можете добавить метку к любому сообщению, отправленному через HTTP v1 API, установив поле fcmOptions.analyticsLabel в объекте сообщения или в полях AndroidFcmOptions или ApnsFcmOptions , специфичных для платформы.

Метки аналитики представляют собой текстовые строки в формате ^[a-zA-Z0-9-_.~%]{1,50}$ . Метки могут включать строчные и заглавные буквы, цифры и следующие символы:

  • -
  • ~
  • %

Максимальная длина — 50 символов. Вы можете указать до 100 уникальных меток в день; сообщения с метками, добавленными сверх этого лимита, не сообщаются.

На вкладке «Отчеты» сообщений консоли Firebase вы можете выполнить поиск по списку всех существующих меток и применить их по отдельности или в сочетании для фильтрации отображаемой статистики.

Агрегированные данные о доставке через API данных FCM

API Firebase Cloud Messaging Data позволяет извлекать информацию, которая может помочь вам понять результаты запросов сообщений, нацеленных на приложения Android. API предоставляет агрегированные данные по всем устройствам Android с поддержкой сбора данных в проекте. Сюда входят сведения о проценте сообщений, доставленных без задержки, а также о том, сколько сообщений было задержано или потеряно в Android Transport Layer . Оценка этих данных может выявить общие тенденции в доставке сообщений и помочь вам найти эффективные способы повышения производительности ваших запросов на отправку. См. раздел Временные шкалы агрегированных данных для получения информации о доступности диапазона дат в отчетах.

API предоставляет все данные, доступные для данного приложения. См. справочную документацию API .

Как разбиты данные?

Данные о доставке разбиты по приложению, дате и аналитической метке . Вызов API вернет данные для каждой комбинации даты, приложения и аналитической метки. Например, один объект androidDeliveryData JSON будет выглядеть следующим образом:

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

Как интерпретировать показатели

Данные о доставке описывают процент сообщений, которые соответствуют каждой из следующих метрик. Возможно, что одно сообщение соответствует нескольким метрикам. Из-за ограничений в том, как мы собираем данные, и уровня детализации, на котором мы агрегировали метрики, некоторые результаты сообщений вообще не представлены в метриках, поэтому проценты ниже не будут в сумме составлять 100%.

Количество принятых сообщений

Единственное количество, включенное в набор данных, — это количество сообщений, которые были приняты FCM для доставки на устройства Android. Все проценты используют это значение в качестве знаменателя. Имейте в виду, что это количество не будет включать сообщения, предназначенные для пользователей, которые отключили сбор информации об использовании и диагностике на своих устройствах.

Проценты результатов сообщений

Поля, включенные в объект MessageOutcomePercents предоставляют информацию о результатах запросов сообщений. Все категории являются взаимоисключающими. Он может отвечать на такие вопросы, как «Доставляются ли мои сообщения?» и «Что является причиной потери сообщений?».

Например, высокое значение поля droppedTooManyPendingMessages может сигнализировать о том, что экземпляры приложения получают объемы неразворачиваемых сообщений, превышающие лимит FCM в 100 ожидающих сообщений. Чтобы смягчить это, убедитесь, что ваше приложение обрабатывает вызовы onDeletedMessages , и рассмотрите возможность отправки разворачиваемых сообщений. Аналогично, высокие проценты droppedDeviceInactive могут быть сигналом для обновления токенов регистрации на вашем сервере, удаления устаревших токенов и отмены их подписки на темы. См. Управление токенами регистрации FCM для получения рекомендаций в этой области.

Проценты эффективности доставки

Поля в объекте DeliveryPerformancePercents предоставляют информацию о сообщениях, которые были успешно доставлены. Он может ответить на такие вопросы, как «Мои сообщения были задержаны?» и «Почему сообщения задерживаются?» Например, высокое значение delayedMessageThrottled будет четко указывать на то, что вы превышаете максимальные ограничения для каждого устройства , и должно скорректировать скорость отправки сообщений.

Процент понимания сообщения

Этот объект предоставляет дополнительную информацию обо всех отправленных сообщениях. Поле priorityLowered выражает процент принятых сообщений, приоритет которых был понижен с HIGH до NORMAL . Если это значение высокое, попробуйте отправлять меньше сообщений с высоким приоритетом или убедитесь, что вы всегда отображаете уведомление при отправке сообщения с высоким приоритетом. Для получения дополнительной информации см. нашу документацию по приоритету сообщений

Чем эти данные отличаются от данных, экспортированных в BigQuery?

Экспорт BigQuery предоставляет отдельные журналы сообщений о принятии сообщений бэкэндом FCM и доставке сообщений в SDK на устройстве (шаги 2 и 4 архитектуры FCM ). Эти данные полезны для обеспечения того, чтобы отдельные сообщения были приняты и доставлены. Подробнее об экспорте данных BigQuery читайте в следующем разделе.

Напротив, Firebase Cloud Messaging Data API предоставляет агрегированные данные о том, что конкретно происходит на Android Transport Layer (или Step 3 архитектуры FCM ). Эти данные, в частности, дают представление о доставке сообщений из бэкэндов FCM в Android SDK. Это особенно полезно для отображения тенденций относительно того, почему сообщения задерживались или терялись во время этой транспортировки.

В некоторых случаях возможно, что два набора данных могут не совпадать в точности по следующим причинам:

  • Агрегированные показатели охватывают только часть всех сообщений.
  • Агрегированные показатели округлены.
  • Мы не представляем показатели ниже порога конфиденциальности.
  • Часть результатов сообщений отсутствует из-за оптимизации управления большим объемом трафика.

Ограничения API

Хронология агрегированных данных

API вернет 7 дней исторических данных; однако данные, возвращаемые этим API, будут задерживаться до 5 дней. Например, 20 января будут доступны данные за 9-15 января, но не за 16 января или позже. Кроме того, данные предоставляются по мере возможности. В случае сбоя данных FCM будет работать над исправлением вперед и не будет заполнять данные обратно после устранения проблемы. При более крупных сбоях данные могут быть недоступны в течение недели или более.

Охват данных

Метрики, предоставляемые API Firebase Cloud Messaging Data, призваны обеспечить понимание общих тенденций доставки сообщений. Однако они не обеспечивают 100% покрытия всех сценариев сообщений. Следующие сценарии являются известными результатами, не отраженными в метриках.

Просроченные сообщения

Если время жизни (TTL) истекает после окончания указанной даты журнала, сообщение не будет считаться droppedTtlExpired в эту дату.

Сообщения на неактивные устройства

Сообщения, отправленные на неактивные устройства, могут отображаться или не отображаться в наборе данных в зависимости от того, какой путь данных они выбирают. Это может привести к некоторому неправильному подсчету в полях droppedDeviceInactive и pending .

Сообщения на устройства с определенными предпочтениями пользователя

Сообщения пользователей, отключивших сбор информации об использовании и диагностике на своих устройствах, не будут включены в наш подсчет в соответствии с их предпочтениями.

Округление и минимумы

FCM намеренно округляет и исключает те показатели, объемы которых недостаточно велики.

Экспорт данных BigQuery

Вы можете экспортировать данные сообщений в BigQuery для дальнейшего анализа. BigQuery позволяет анализировать данные с помощью BigQuery SQL, экспортировать их другому поставщику облачных услуг или использовать данные для ваших пользовательских моделей машинного обучения. Экспорт в BigQuery включает все доступные данные для сообщений, независимо от типа сообщения или того, отправляется ли сообщение через API или компоновщик уведомлений.

Для сообщений, отправляемых на устройства со следующими минимальными версиями FCM SDK, у вас есть дополнительная возможность включить экспорт данных о доставке сообщений для вашего приложения:

  • Android 20.1.0 или выше.
  • iOS 8.6.0 или выше
  • Firebase Web SDK 9.0.0 или выше

Подробную информацию о включении экспорта данных для Android и iOS смотрите ниже.

Для начала свяжите свой проект с BigQuery:

  1. Выберите один из следующих вариантов:

    • Откройте редактор уведомлений , затем нажмите «Доступ к BigQuery» в нижней части страницы.

    • На странице «Интеграции» в консоли Firebase нажмите «Ссылка» на карточке BigQuery .

      На этой странице отображаются параметры экспорта FCM для всех приложений с поддержкой FCM в проекте.

  2. Следуйте инструкциям на экране, чтобы включить BigQuery.

Более подробную информацию см. в статье «Связывание Firebase с BigQuery» .

При включении экспорта BigQuery для Cloud Messaging :

  • Firebase экспортирует ваши данные в BigQuery . Обратите внимание, что первоначальное распространение данных для экспорта может занять до 48 часов.

  • После создания набора данных его местоположение изменить нельзя, но можно скопировать набор данных в другое место или вручную переместить (создать заново) набор данных в другом месте. Чтобы узнать больше, см. Изменение местоположения набора данных .

  • Firebase настраивает регулярные синхронизации ваших данных из вашего проекта Firebase в BigQuery . Эти ежедневные операции экспорта начинаются в 4:00 утра по тихоокеанскому времени и обычно заканчиваются через 24 часа.

  • По умолчанию все приложения в вашем проекте связаны с BigQuery , и любые приложения, которые вы позже добавляете в проект, автоматически связаны с BigQuery . Вы можете управлять тем, какие приложения отправляют данные .

Чтобы деактивировать экспорт BigQuery , отключите свой проект в консоли Firebase .

Включить экспорт данных о доставке сообщений

Устройства iOS с FCM SDK 8.6.0 или выше могут включить экспорт данных доставки сообщений своего приложения. FCM поддерживает экспорт данных как для оповещений, так и для фоновых уведомлений. Перед включением этих опций необходимо сначала создать ссылку FCM -BiqQuery для вашего проекта, как описано в BigQuery data export .

Включить экспорт данных о доставке для оповещений

Поскольку только оповещения могут активировать расширения приложения службы уведомлений, необходимо добавить расширение службы уведомлений в свое приложение и вызвать этот API внутри расширения службы, чтобы включить отслеживание отображаемых сообщений. См. документацию Apple по изменению содержимого в недавно доставленных уведомлениях .

Для каждого полученного уведомления необходимо сделать следующий вызов:

Быстрый

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

Если вы создаете запросы на отправку с использованием HTTP v1 API, обязательно укажите mutable-content = 1 в объекте полезной нагрузки .

Включить экспорт данных о доставке для фоновых уведомлений

Для фоновых сообщений, полученных, когда приложение находится на переднем плане или в фоновом режиме, вы можете вызвать API экспорта данных внутри обработчика сообщений данных основного приложения. Этот вызов должен быть сделан для каждого полученного уведомления:

Быстрый

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

Какие данные экспортируются в BigQuery?

Обратите внимание, что нацеливание на устаревшие токены или неактивные регистрации может привести к завышению некоторых из этих статистических данных.

Схема экспортированной таблицы:

_PARTITIONTIME МЕТКА ВРЕМЕНИ Этот псевдостолбец содержит временную метку начала дня (в UTC), в который были загружены данные. Для раздела YYYYMMDD этот псевдостолбец содержит значение TIMESTAMP('YYYY-MM-DD').
event_timestamp МЕТКА ВРЕМЕНИ Временная метка события, записанная сервером
номер_проекта ЦЕЛОЕ ЧИСЛО Номер проекта идентифицирует проект, отправивший сообщение.
сообщение_id НИТЬ Идентификатор сообщения идентифицирует сообщение. Сгенерированный из идентификатора приложения и временной метки, идентификатор сообщения в некоторых случаях может не быть глобально уникальным.
экземпляр_id НИТЬ Уникальный идентификатор приложения, которому отправлено сообщение (если доступно). Это может быть идентификатор экземпляра или идентификатор установки Firebase .
тип_сообщения НИТЬ Тип сообщения. Может быть сообщением-уведомлением или сообщением с данными. Тема используется для идентификации исходного сообщения для отправки темы или кампании; последующие сообщения являются либо уведомлением, либо сообщением с данными.
sdk_platform НИТЬ Платформа приложения-получателя
имя_приложения НИТЬ Имя пакета для приложений Android или идентификатор пакета для приложений iOS
ключ_свернуть НИТЬ Ключ свертывания определяет группу сообщений, которые могут быть свернуты. Когда устройство не подключено, только последнее сообщение с данным ключом свертывания ставится в очередь для окончательной доставки
приоритет ЦЕЛОЕ ЧИСЛО Приоритет сообщения. Допустимые значения: «нормальный» и «высокий». На iOS они соответствуют приоритетам APN 5 и 10
ттл ЦЕЛОЕ ЧИСЛО Этот параметр указывает, как долго (в секундах) сообщение должно храниться в хранилище FCM, если устройство находится в автономном режиме.
тема НИТЬ Название темы, в которую было отправлено сообщение (если применимо)
bulk_id ЦЕЛОЕ ЧИСЛО Массовый идентификатор идентифицирует группу связанных сообщений, например, конкретную отправку в определенную тему.
событие НИТЬ Тип события. Возможные значения:
  • MESSAGE_ACCEPTED: сообщение получено сервером FCM и запрос действителен;
  • MESSAGE_DELIVERED: сообщение было доставлено в FCM SDK приложения на устройстве. По умолчанию это поле не распространяется. Чтобы включить, следуйте инструкциям, приведенным в setDeliveryMetricsExportToBigQuery(boolean) .
  • MISSING_REGISTRATIONS: запрос отклонен из-за отсутствия регистрации;
  • UNAUTHORIZED_REGISTRATION: сообщение отклонено, поскольку отправитель не авторизован для отправки на регистрацию;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: произошла неуказанная ошибка при обработке запроса сообщения;
  • MISMATCH_SENDER_ID: запрос на отправку сообщения был отклонен из-за несоответствия идентификатора отправителя, отправляющего сообщение, и идентификатора, заявленного для конечной точки;
  • QUOTA_EXCEEDED: запрос на отправку сообщения отклонен из-за недостаточной квоты;
  • INVALID_REGISTRATION: запрос на отправку сообщения отклонен из-за недействительной регистрации;
  • INVALID_PACKAGE_NAME: запрос на отправку сообщения был отклонен из-за недопустимого имени пакета;
  • INVALID_APNS_CREDENTIAL: запрос на отправку сообщения был отклонен из-за недействительного сертификата APNS;
  • INVALID_PARAMETERS: запрос на отправку сообщения отклонен из-за недопустимых параметров;
  • PAYLOAD_TOO_LARGE: запрос на отправку сообщения был отклонен из-за того, что полезная нагрузка превышает лимит;
  • AUTHENTICATION_ERROR: запрос на отправку сообщения был отклонен из-за ошибки аутентификации (проверьте ключ API, использованный для отправки сообщения);
  • INVALID_TTL: запрос на отправку сообщения был отклонен из-за недопустимого значения TTL.
analytics_label НИТЬ С помощью API HTTP v1 можно задать аналитическую метку при отправке сообщения, чтобы пометить сообщение для аналитических целей.

Что можно сделать с экспортированными данными?

В следующих разделах приведены примеры запросов, которые можно выполнять в BigQuery по отношению к экспортированным данным FCM .

Подсчет отправленных сообщений по приложению

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;

Подсчет уникальных экземпляров приложений, на которые нацелены сообщения

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

Количество отправленных уведомлений

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

Количество отправленных сообщений с данными

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

Подсчет сообщений, отправленных по теме или кампании

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

Чтобы отслеживать события для сообщения, отправленного в определенную тему, измените этот запрос, заменив AND message_id != '' на AND message_id = <your message id>; .

Рассчитать длительность распространения для заданной темы или кампании

Время начала разветвления — это момент получения исходного запроса, а время окончания — это момент создания последнего отдельного сообщения, предназначенного для одного экземпляра.

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;

Процент доставленных сообщений

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;

Отслеживать все события для указанного идентификатора сообщения и идентификатора экземпляра

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;

Вычислить задержку для заданного идентификатора сообщения и идентификатора экземпляра

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;