Informacje na temat dostarczania wiadomości

FCM udostępnia 3 zestawy narzędzi, które ułatwiają analizowanie dostarczania wiadomości:

  • Firebase raporty o dostarczaniu wiadomości w konsoli
  • Dane zbiorcze dotyczące wyświetleń w ramach pakietu Android SDK z interfejsu Firebase Cloud Messaging Data API
  • Kompleksowy eksport danych do Google BigQuery

Narzędzia do raportowania opisane na tej stronie wymagają do działania elementu Google Analytics. Jeśli Google Analytics nie jest włączona w Twoim projekcie, możesz ją skonfigurować na karcie integracje w ustawieniach projektu Firebase.

Pamiętaj, że ze względu na zbiorcze grupowanie danych analitycznych raportowanie wielu statystyk na tej stronie może być opóźnione nawet o 24 godziny.

Raporty o dostarczeniu wiadomości

Na karcie Raporty w konsoli Firebase możesz wyświetlić te dane dotyczące wiadomości wysyłanych do pakietów FCM SDK na platformach Android i Apple, w tym tych wysłanych za pomocą edytora powiadomień i interfejsów FCM API:

  • Wysłane – wiadomość z danymi lub wiadomość z powiadomieniem została dodana do kolejki do dostarczenia lub została przekazana do usługi innej firmy, takiej jak APNs w celu dostarczenia. Więcej informacji znajdziesz w sekcji czas trwania wiadomości.
  • Received (otrzymano) (dostępne tylko na urządzeniach z Androidem) – aplikacja otrzymała wiadomość danych lub powiadomienie. Te dane są dostępne, gdy na urządzeniu odbiorcy z Androidem jest zainstalowany pakiet SDK w wersji 18.0.1 lub nowszej.
  • Wyświetlenia (dostępne tylko w przypadku powiadomień na urządzeniach z Androidem) – powiadomienie wyświetlane na ekranie urządzenia, gdy aplikacja działa w tle.
  • Otwiera się – użytkownik otworzył wiadomość z powiadomieniem. Dane są raportowane tylko w przypadku powiadomień otrzymanych, gdy aplikacja działa w tle.

Dane te są dostępne w przypadku wszystkich wiadomości z ładunkiem powiadomienia oraz wszystkich oznaczonych wiadomości danych. Więcej informacji o etykietach znajdziesz w artykule Dodawanie etykiet analitycznych do wiadomości.

Podczas wyświetlania raportów dotyczących wiadomości możesz ustawić zakres dat wyświetlanych danych oraz wyeksportować je do pliku CSV. Możesz też filtrować według tych kryteriów:

  • Platforma (iOS lub Android)
  • Aplikacja
  • Etykiety analityczne niestandardowe

Dodawanie etykiet Analytics do wiadomości

Oznaczanie wiadomości etykietami jest bardzo przydatne w przypadku analiz niestandardowych, ponieważ pozwala filtrować statystyki dostarczania według etykiet lub zestawów etykiet. Możesz dodać etykietę do dowolnej wiadomości wysłanej za pomocą interfejsu HTTP v1 API, ustawiając pole fcmOptions.analyticsLabel w obiekcie message lub w polach AndroidFcmOptions lub ApnsFcmOptions zależnych od platformy.

Etykiety Analytics to ciągi tekstowe w formacie ^[a-zA-Z0-9-_.~%]{1,50}$. Etykiety mogą zawierać małe i wielkie litery, cyfry oraz te symbole:

  • -
  • ~
  • %

Maksymalna długość to 50 znaków. Możesz określić maksymalnie 100 unikalnych etykiet dziennie. Wiadomości z etykietami dodanymi powyżej tego limitu nie są uwzględniane w raportach.

Na karcie Raporty w konsoli Firebase możesz wyszukiwać na liście wszystkich istniejących etykiet i stosować je pojedynczo lub w połączeniu, aby filtrować wyświetlane statystyki.

zbiorcze dane dotyczące dostawy za pomocą interfejsu FCM Data API;

Interfejs Firebase Cloud Messaging Data API umożliwia pobieranie informacji, które mogą pomóc w zrozumieniu wyników żądań wiadomości kierowanych do aplikacji na Androida. Interfejs API udostępnia dane zbiorcze ze wszystkich urządzeń z Androidem w projekcie, które umożliwiają zbieranie danych. Obejmuje to informacje o procentowym udziale wiadomości dostarczonych bez opóźnienia, a także o tym, ile wiadomości zostało opóźnionych lub odrzuconych w Android Transport Layer. Ich analiza może ujawnić ogólne trendy w dostarczaniu wiadomości i pomóc w odnalezieniu skutecznych sposobów na zwiększenie skuteczności żądań wysyłania. Informacje o dostępności zakresu dat w raportach znajdziesz w sekcji Harmonogramy danych zbiorczych.

Interfejs API dostarcza wszystkie dane dostępne dla danej aplikacji. Zapoznaj się z dokumentacją interfejsu API.

Jakie są podziały danych?

Dane dotyczące dostawy są podzielone według aplikacji, daty i oznaczenia Analytics. Wywołanie interfejsu API zwróci dane dla wszystkich kombinacji daty, aplikacji i etykiety analitycznej. Na przykład pojedynczy obiekt JSON androidDeliveryData wygląda tak:

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

Jak interpretować dane

Dane o dostarczeniu określają odsetek wiadomości, które pasują do każdego z tych rodzajów danych. Pojedyncza wiadomość może pasować do kilku wskaźników. Ze względu na ograniczenia w sposobie zbierania danych i poziom szczegółowości, na którym dane zostały zagregowane, niektóre wyniki wiadomości w ogóle nie są uwzględniane w danych, więc podane poniżej wartości procentowe nie będą się sumować do 100%.

Liczba zaakceptowanych wiadomości

Jedynym zliczonym w tym zbiorze danych jest liczba wiadomości zaakceptowanych przez FCM do dostarczenia na urządzenia z Androidem. Wszystkie wartości procentowe używają tej wartości jako mianownika. Pamiętaj, że ta liczba nie obejmuje wiadomości kierowanych do użytkowników, którzy wyłączyli zbieranie informacji o użytkowaniu i danych diagnostycznych na swoich urządzeniach.

Odsetki wyników wiadomości

Pola w obiekcie MessageOutcomePercents zawierają informacje o wynikach żądań wiadomości. Kategorie są wzajemnie wykluczające się. Może on odpowiedzieć na pytania, takie jak „Czy moje wiadomości są dostarczane?” i „Co powoduje, że wiadomości są odrzucane?”.

Na przykład wysoka wartość pola droppedTooManyPendingMessages może wskazywać, że instancje aplikacji otrzymują dużą liczbę niezwijanych wiadomości, która przekracza limit FCM wynoszący 100 oczekujących wiadomości. Aby temu zapobiec, zadbaj o to, aby Twoja aplikacja obsługiwała wywołania onDeletedMessages, i rozważ wysyłanie wiadomości z możliwością zwijania. Podobnie wysokie wartości procentowe parametru droppedDeviceInactive mogą być sygnałem do zaktualizowania tokenów rejestracji na serwerze, usunięcia nieaktualnych tokenów i anulowania ich subskrypcji z tematów. Sprawdzone metody w tym zakresie znajdziesz w artykule Zarządzanie tokenami rejestracji FCM.

Procentowe wskaźniki skuteczności wyświetlania

Pola w obiekcie DeliveryPerformancePercents zawierają informacje o wiadomościach, które zostały dostarczone. Może ona odpowiadać na pytania w rodzaju „Czy moje wiadomości były opóźnione?” i „Dlaczego wiadomości były opóźnione?”. Na przykład wysoka wartość parametru delayedMessageThrottled wyraźnie wskazuje, że przekraczasz maksymalne limity na urządzenie. W takim przypadku powinieneś zmienić częstotliwość wysyłania wiadomości.

Procenty statystyk wiadomości

Ten obiekt zawiera dodatkowe informacje o wszystkich wysłanych wiadomościach. Pole priorityLowered wyraża odsetek zaakceptowanych wiadomości, których priorytet został obniżony z HIGH na NORMAL. Jeśli ta wartość jest wysoka, wyślij mniej wiadomości o wysokim priorytecie lub upewnij się, że zawsze wyświetlasz powiadomienie, gdy wysyłasz wiadomość o wysokim priorytecie. Więcej informacji znajdziesz w dokumentacji dotyczącej priorytetu wiadomości.

Czym te dane różnią się od danych eksportowanych do BigQuery?

Eksport BigQuery zawiera dzienniki poszczególnych wiadomości o ich akceptacji przez backend FCM oraz dostarczaniu w SDK na urządzeniu (czynności opisane w krokach 2 i 4 architektury FCM). Dane te pozwalają zapewnić, że poszczególne wiadomości zostały zaakceptowane i dostarczone. Więcej informacji o eksporcie danych BigQuery znajdziesz w następnej sekcji.

W przeciwieństwie do tego interfejs Firebase Cloud Messaging Data API udostępnia szczegółowe informacje o tym, co dzieje się na warstwie transportu Androida (czyli na etapie 3 architektury FCM). Te dane dostarczają informacji o dostarczaniu wiadomości z backendów FCM do pakietu Android SDK. Jest to szczególnie przydatne, gdy chcesz pokazać trendy, które wyjaśniają, dlaczego wiadomości były opóźnione lub zostały usunięte podczas przenoszenia.

W niektórych przypadkach 2 zbiory danych mogą się nie pokrywać dokładnie z tych powodów:

  • Zagregowane wskaźniki obejmują tylko część wszystkich wiadomości.
  • Dane zbiorcze są zaokrąglane.
  • Nie prezentujemy danych poniżej progu umożliwiającego zachowanie prywatności
  • Brakuje części wyników wiadomości z powodu optymalizacji sposobu zarządzania dużym natężeniem ruchu.

Ograniczenia interfejsu API

Osie czasu zbierania danych

Interfejs API zwróci dane historyczne z 7 dni, ale z opóźnieniem do 5 dni. Na przykład 20 stycznia będą dostępne dane z okresu od 9 do 15 stycznia, ale nie z 16 stycznia ani później. Dodatkowo udostępniamy Ci dane w miarę naszych możliwości. W przypadku przerwy w dostarczaniu danych FCM będzie dążyć do rozwiązania problemu, ale nie uzupełni danych po jego rozwiązaniu. W przypadku większych przerw dane mogą być niedostępne przez tydzień lub dłużej.

Zakres danych

Dane udostępniane przez interfejs Firebase Cloud Messaging Data API mają zapewnić wgląd w ogólne trendy w dostarczaniu wiadomości. Nie obejmują jednak w 100% wszystkich scenariuszy wiadomości. W tych scenariuszach występują znane wyniki, które nie są uwzględniane w danych.

Wygasłe wiadomości

Jeśli wartość Time To Live (TTL) wygaśnie po zakończeniu danej daty logu, wiadomość nie będzie liczona w tym dniu jako droppedTtlExpired.

Wiadomości na nieaktywne urządzenia

Wiadomości wysyłane na nieaktywne urządzenia mogą się pojawiać lub nie w zbiorze danych w zależności od ścieżki danych. Może to spowodować nieprawidłowe zliczanie w polach droppedDeviceInactivepending.

Wiadomości na urządzenia z określonymi ustawieniami użytkownika

Użytkownicy, którzy wyłączyli zbieranie informacji o użytkowaniu i diagnostyce na swoich urządzeniach, nie będą uwzględniani w liczeniu, zgodnie z ich preferencjami.

Zaokrąglanie i wartości minimalne

FCM celowo zaokrągla i wyklucza wartości, które nie są wystarczająco duże.

Eksportowanie danych z BigQuery

Dane wiadomości możesz wyeksportować do BigQuery, aby przeanalizować je dokładniej. BigQuery umożliwia analizowanie danych za pomocą BigQuery SQL, eksportowanie ich do innego dostawcy usług w chmurze lub używanie ich do niestandardowych modeli uczenia maszynowego. Eksport do BigQuery obejmuje wszystkie dostępne dane dotyczące wiadomości niezależnie od ich typu i niezależnie od tego, czy zostały wysłane za pomocą interfejsu API czy za pomocą edytora powiadomień.

W przypadku wiadomości wysyłanych na urządzenia z tymi wersjami pakietu SDK FCM masz dodatkową opcję umożliwiającą eksport danych dotyczących dostarczania wiadomości w aplikacji:

  • System Android w wersji 20.1.0 lub nowszej.
  • iOS 8.6.0 lub nowszy
  • Pakiet Firebase Web SDK w wersji 9.0.0 lub nowszej

Poniżej znajdziesz szczegółowe informacje o włączaniu eksportu danych na AndroidzieiOS.

Aby rozpocząć, połącz projekt z BigQuery:

  1. Wybierz jedną z tych opcji:

    • Otwórz składnię powiadomień, a potem u dołu strony kliknij Uzyskaj dostęp do BigQuery.

    • Na stronie Integracje w konsoli Firebase kliknij Połącz na karcie BigQuery.

      Na tej stronie wyświetlane są opcje eksportu FCM w przypadku wszystkich aplikacji, które obsługują FCM w projekcie.

  2. Aby włączyć BigQuery, postępuj zgodnie z instrukcjami wyświetlanymi na ekranie.

Więcej informacji znajdziesz w artykule Łączenie Firebase z BigQuery.

Gdy włączysz eksport BigQuery w celu Cloud Messaging:

  • Firebase eksportuje Twoje dane do usługi BigQuery. Pamiętaj, że początkowa propagacja danych na potrzeby eksportu może potrwać do 48 godzin.

  • Po utworzeniu zbioru danych jego lokalizacji nie można już zmienić. Możesz natomiast skopiować zbiór danych do innej lokalizacji lub ręcznie przenieść (ponownie utworzyć) zbiór danych w innej lokalizacji. Więcej informacji znajdziesz w artykule Zmiana lokalizacji zbioru danych.

  • Firebase skonfiguruje regularne synchronizowanie danych z Twojego projektu Firebase z kontem BigQuery. Codzienne operacje eksportu rozpoczynają się o 4:00 czasu pacyficznego i zwykle kończą się w ciągu 24 godzin.

  • Domyślnie wszystkie aplikacje w projekcie są połączone z BigQuery, a wszelkie aplikacje, które dodasz później do projektu, zostaną automatycznie połączone z BigQuery. Możesz określić, które aplikacje mają wysyłać dane.

Aby dezaktywować eksport BigQuery, rozłącz projekt w konsoli Firebase.

Włączanie eksportu danych o dostawie wiadomości

Urządzenia z iOS z pakietem SDK FCM w wersji 8.6.0 lub nowszej mogą włączyć eksportowanie danych dotyczących dostarczania wiadomości w swojej aplikacji. FCMobsługuje eksport danych zarówno w przypadku alertów, jak i powiadomień w tle. Zanim włączysz te opcje, musisz utworzyć w projekcie połączenie FCM-BigQuery zgodnie z opisem w artykule Eksportowanie danych do BigQuery.

Włączanie eksportu danych o dostawie powiadomień o alertach

Ponieważ tylko alerty mogą wywoływać rozszerzenia aplikacji usługi powiadomień, musisz dodać do aplikacji rozszerzenie usługi powiadomień i wywoływać ten interfejs API w ramach rozszerzenia usługi, aby umożliwić śledzenie wyświetlanych wiadomości. Zobacz dokumentację Apple na temat modyfikowania treści w nowo wysłanych powiadomieniach.

Dla każdego otrzymanego powiadomienia należy wykonać to połączenie:

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

Jeśli tworzysz żądania wysyłania za pomocą interfejsu API HTTP w wersji 1, pamiętaj, by określić mutable-content = 1 w obiekcie ładunku.

Włączanie eksportu danych o dostawie powiadomień w tle

W przypadku wiadomości tła otrzymywanych, gdy aplikacja działa na pierwszym planie lub w tle, możesz wywołać interfejs API eksportu danych w obiekcie obsługującym wiadomości danych aplikacji głównej. Ten wywołanie musi być wykonywane w przypadku każdego otrzymanego powiadomienia:

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

Jakie dane są eksportowane do BigQuery?

Pamiętaj, że kierowanie na nieaktualne tokeny lub nieaktywne rejestracje może zawyżać niektóre z tych statystyk.

Schemat wyeksportowanej tabeli:

_PARTITIONTIME SYGNATURA CZASOWA Ta pseudokolumna zawiera sygnaturę czasową początku dnia (według czasu UTC), w którym wczytano dane. W przypadku partycji RRRRMMDD ta pseudokolumna zawiera wartość TIMESTAMP('RRRR-MM-DD').
event_timestamp SYGNATURA CZASOWA sygnatura czasowa zdarzenia zarejestrowana przez serwer;
project_number LICZBA CAŁKOWITA Numer projektu identyfikuje projekt, który wysłał wiadomość.
message_id CIĄG ZNAKÓW Identyfikator wiadomości określa jej treść. Identyfikator wiadomości jest generowany na podstawie identyfikatora aplikacji i sygnatury czasowej. W niektórych przypadkach może nie być globalnie niepowtarzalny.
instance_id CIĄG ZNAKÓW Unikalny identyfikator aplikacji, do której wysyłana jest wiadomość (jeśli jest dostępny). Może to być identyfikator instancji lub identyfikator instalacji Firebase.
message_type CIĄG ZNAKÓW Typ wiadomości. Może to być wiadomość z danymi lub powiadomieniem. Topic służy do identyfikowania pierwotnej wiadomości dotyczącej tematu lub wysyłania kampanii; kolejne wiadomości to powiadomienia lub wiadomości zawierające dane.
sdk_platform CIĄG ZNAKÓW Platforma aplikacji odbiorcy
app_name CIĄG ZNAKÓW Nazwa pakietu w przypadku aplikacji na Androida lub identyfikator pakietu w przypadku aplikacji na iOS
collapse_key CIĄG ZNAKÓW Klucz zwijania określa grupę wiadomości, które można zwinąć. Gdy urządzenie nie jest połączone, do kolejki do wysyłki oczekuje tylko ostatni komunikat z danym kluczem składania.
rekrutacja priorytetowa LICZBA CAŁKOWITA Priorytet wiadomości. Prawidłowe wartości to „normal” i „high”. W systemie iOS odpowiadają one priorytetom APNs 5 i 10.
ttl LICZBA CAŁKOWITA Ten parametr określa czas (w sekundach), przez jaki wiadomość ma być przechowywana w pamięci FCM, gdy urządzenie jest offline
temat CIĄG ZNAKÓW Nazwa tematu, do którego wysłano wiadomość (w stosownych przypadkach)
identyfikator_zbiorczy LICZBA CAŁKOWITA Identyfikator zbiorczy identyfikuje grupę powiązanych wiadomości, np. wysłanych na dany temat.
event CIĄG ZNAKÓW Typ zdarzenia. Możliwe wartości:
  • MESSAGE_ACCEPTED: wiadomość została odebrana przez serwer FCM i żądanie jest ważne;
  • MESSAGE_DELIVERED: wiadomość została dostarczona do pakietu FCM SDK aplikacji na urządzeniu. Domyślnie to pole nie jest propagowane. Aby włączyć tę funkcję, postępuj zgodnie z instrukcjami podanymi w setDeliveryMetricsExportToBigQuery(boolean).
  • MISSING_REGISTRATIONS: żądanie zostało odrzucone z powodu braku rejestracji;
  • UNAUTHORIZED_REGISTRATION: wiadomość została odrzucona, ponieważ nadawca nie jest autoryzowany do wysyłania do rejestracji;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: podczas przetwarzania żądania wiadomości wystąpił nieokreślony błąd;
  • MISMATCH_SENDER_ID: żądanie wysłania wiadomości zostało odrzucone z powodu niezgodności między identyfikatorem nadawcy wysyłającego wiadomość a tym zadeklarowanym dla punktu końcowego;
  • QUOTA_EXCEEDED: prośba o wysłanie wiadomości została odrzucona z powodu niewystarczającego limitu;
  • INVALID_REGISTRATION: żądanie wysłania wiadomości zostało odrzucone z powodu nieprawidłowej rejestracji;
  • INVALID_PACKAGE_NAME: żądanie wysłania wiadomości zostało odrzucone z powodu nieprawidłowej nazwy pakietu;
  • INVALID_APNS_CREDENTIAL: żądanie wysłania wiadomości zostało odrzucone z powodu nieprawidłowego certyfikatu APNS;
  • INVALID_PARAMETERS: prośba o wysłanie wiadomości została odrzucona z powodu nieprawidłowych parametrów;
  • PAYLOAD_TOO_LARGE: żądanie wysłania wiadomości zostało odrzucone z powodu ładunku przekraczającego limit;
  • AUTHENTICATION_ERROR: żądanie wysłania wiadomości zostało odrzucone z powodu błędu uwierzytelniania (sprawdź klucz interfejsu API użyty do wysłania wiadomości);
  • INVALID_TTL: żądanie wysłania wiadomości zostało odrzucone z powodu nieprawidłowego TTL.
etykieta_analityki CIĄG ZNAKÓW Interfejs HTTP v1 API umożliwia ustawienie etykiety Analytics podczas wysyłania wiadomości w celu jej oznaczenia na potrzeby statystyk

Co można zrobić z wyeksportowanymi danymi?

W następnych sekcjach znajdziesz przykłady zapytań, które możesz uruchamiać w BigQuery na podstawie wyeksportowanych danych FCM.

Liczba wysłanych wiadomości według aplikacji

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;

Zliczanie unikalnych instancji aplikacji docelowych dla wiadomości

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

Licznik wysłanych powiadomień

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

Liczba wysłanych wiadomości zawierających dane

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

Zliczanie wiadomości wysłanych do tematu lub kampanii

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

Aby śledzić zdarzenia dotyczące wiadomości wysyłanej do określonego tematu, zmodyfikuj to zapytanie, tak aby zastąpić AND message_id != '' ciągiem AND message_id = <your message id>;.

Obliczanie czasu trwania rozgałęzienia dla danego tematu lub kampanii

Czas rozpoczęcia rozgałęzienia to moment otrzymania pierwotnego żądania, a czas zakończenia to moment utworzenia ostatniej wiadomości kierowanej do pojedynczego wystąpienia.

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;

Liczba procentowa dostarczonych wiadomości

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;

Śledzenie wszystkich zdarzeń związanych z danym identyfikatorem wiadomości i identyfikatorem instancji

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;

Obliczanie opóźnienia dla danego identyfikatora wiadomości i identyfikatora instancji

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;