Zrozumienie dostarczania wiadomości

FCM udostępnia trzy zestawy narzędzi, które pomogą Ci uzyskać wgląd w dostarczanie wiadomości:

  • Raporty dostarczenia wiadomości konsoli Firebase
  • Zagregowane wskaźniki dostarczania pakietu Android SDK z interfejsu Firebase Cloud Messaging Data API
  • Kompleksowy eksport danych do Google BigQuery

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

Należy pamiętać, że raportowanie wielu statystyk na tej stronie może być opóźnione do 24 godzin ze względu na grupowanie danych analitycznych.

Raporty doręczenia wiadomości

Na karcie Raporty w konsoli Firebase możesz wyświetlić następujące dane dotyczące wiadomości wysyłanych do zestawów SDK FCM platformy Android lub Apple, w tym wiadomości wysyłanych za pośrednictwem narzędzia do tworzenia powiadomień i interfejsów API FCM:

  • Wysyła — wiadomość z danymi lub powiadomienie została umieszczona w kolejce do dostarczenia lub została pomyślnie przekazana do usługi innej firmy, takiej jak APN, w celu dostarczenia. Aby uzyskać więcej informacji, zobacz czas życia wiadomości .
  • Otrzymano (dostępne tylko na urządzeniach z systemem Android) — aplikacja odebrała wiadomość z danymi lub powiadomienie. Dane te są dostępne, jeśli na odbierającym urządzeniu z systemem Android zainstalowano FCM SDK 18.0.1 lub nowszy.
  • Wyświetlenia (dostępne tylko w przypadku wiadomości powiadomień na urządzeniach z systemem Android) — powiadomienie na wyświetlaczu zostało wyświetlone na urządzeniu, gdy aplikacja działała w tle.
  • Otwiera — użytkownik otworzył wiadomość z powiadomieniem. Zgłaszane tylko w przypadku powiadomień otrzymanych, gdy aplikacja działa w tle.

Dane te są dostępne dla wszystkich wiadomości z ładunkiem powiadomień i wszystkich wiadomości z danymi oznaczonych etykietą . Aby dowiedzieć się więcej o etykietach, zobacz Dodawanie etykiet analitycznych do wiadomości .

Przeglądając raporty wiadomości, możesz ustawić zakres dat wyświetlanych danych, z możliwością eksportu do pliku CSV. Możesz także filtrować według tych kryteriów:

  • Platforma (iOS lub Android)
  • Aplikacja
  • Niestandardowe etykiety analityczne

Dodawanie etykiet analitycznych do wiadomości

Etykietowanie wiadomości jest bardzo przydatne do niestandardowych analiz, umożliwiając filtrowanie statystyk dostaw według etykiet lub zestawów etykiet. Możesz dodać etykietę do dowolnej wiadomości wysłanej poprzez API HTTP v1, ustawiając pole fcmOptions.analyticsLabel w obiekcie wiadomości lub w specyficznych dla platformy polach AndroidFcmOptions lub ApnsFcmOptions .

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

  • -
  • ~
  • %

Maksymalna długość to 50 znaków. Możesz określić do 100 unikalnych etykiet dziennie; wiadomości z etykietami dodanymi powyżej tego limitu nie są raportowane.

Na karcie Raporty w konsoli Firebase możesz przeszukać listę wszystkich istniejących etykiet i zastosować je pojedynczo lub w połączeniu w celu filtrowania wyświetlanych statystyk.

Zagregowane dane dotyczące dostawy za pośrednictwem interfejsu API danych FCM

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 zagregowane dane ze wszystkich urządzeń z systemem Android obsługujących zbieranie danych w projekcie. Obejmuje to szczegółowe informacje na temat odsetka wiadomości dostarczonych bez opóźnień, a także liczby wiadomości opóźnionych lub porzuconych w warstwie transportowej Androida . Ocena tych danych może ujawnić ogólne trendy w dostarczaniu wiadomości i pomóc w znalezieniu skutecznych sposobów poprawy wydajności żądań wysłania. Informacje o dostępności zakresów dat w raportach można znaleźć w artykule Osie czasu danych zbiorczych .

API udostępnia wszystkie dane dostępne dla danej aplikacji. Zobacz dokumentację referencyjną API .

Jak rozkładają się dane?

Dane dotyczące dostawy są podzielone według aplikacji, daty i etykiety analitycznej . Wywołanie interfejsu API zwróci dane dla każdej kombinacji daty, aplikacji i etykiety analitycznej. Na przykład pojedynczy obiekt androidDeliveryData JSON będzie wyglądał następująco:

 {
  "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ć metryki

Dane o dostawie określają odsetek wiadomości spełniających poniższe kryteria. Możliwe jest, że pojedyncza wiadomość pasuje do wielu wskaźników. Ze względu na ograniczenia w sposobie gromadzenia danych i poziomie szczegółowości, na jakim zagregowaliśmy metryki, niektóre wyniki komunikatów w ogóle nie są reprezentowane w metrykach, dlatego poniższe wartości procentowe nie sumują się do 100%.

Liczba zaakceptowanych wiadomości

Jedyna liczba zawarta w zbiorze danych to liczba wiadomości, które zostały zaakceptowane przez FCM w celu 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 diagnostyce na swoich urządzeniach.

Procenty wyników wiadomości

Pola zawarte w obiekcie MessageOutcomePercents dostarczają informacji o wynikach żądań wiadomości. Wszystkie te kategorie wzajemnie się wykluczają. Może odpowiadać na pytania takie jak „Czy moje wiadomości zostały dostarczone?” i „Co powoduje odrzucanie wiadomości?”

Na przykład wysoka wartość pola droppedTooManyPendingMessages może sygnalizować, że instancje aplikacji odbierają liczbę niezwijanych wiadomości przekraczającą limit 100 oczekujących wiadomości FCM. Aby temu zaradzić, upewnij się, że Twoja aplikacja obsługuje wywołania onDeletedMessages i rozważ wysyłanie zwijanych wiadomości. Podobnie wysokie wartości procentowe dla droppedDeviceInactive mogą być sygnałem do aktualizacji tokenów rejestracyjnych na serwerze, usunięcia nieaktualnych tokenów i wyrejestrowania ich z tematów. Zobacz Zarządzanie tokenami rejestracji FCM, aby zapoznać się z najlepszymi praktykami w tym obszarze.

Procenty wydajności dostawy

Pola w obiekcie DeliveryPerformancePercents dostarczają informacji o pomyślnie dostarczonych wiadomościach. Może odpowiedzieć na pytania takie jak „Czy moje wiadomości były opóźnione?” i „Dlaczego wiadomości są opóźnione?” Na przykład wysoka wartość delayedMessageThrottled wyraźnie wskazywałaby, że przekraczasz maksymalne limity na urządzenie i powinna dostosować szybkość wysyłania wiadomości.

Procenty wglądu w wiadomości

Obiekt ten dostarcza dodatkowych informacji o wszystkich wysłanych wiadomościach. priorityLowered wyraża procent zaakceptowanych wiadomości, których priorytet został obniżony z HIGH do NORMAL . Jeśli ta wartość jest wysoka, spróbuj wysłać mniej wiadomości o wysokim priorytecie lub upewnij się, że zawsze wyświetlasz powiadomienie, gdy wiadomość o wysokim priorytecie zostanie wysłana. Więcej informacji znajdziesz w naszej dokumentacji dotyczącej priorytetu wiadomości

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

Eksport BigQuery udostępnia indywidualne dzienniki wiadomości dotyczące akceptacji wiadomości przez backend FCM i dostarczenia wiadomości w pakiecie SDK na urządzeniu (kroki 2 i 4 architektury FCM ). Dane te są przydatne do zapewnienia, że ​​poszczególne wiadomości zostały zaakceptowane i dostarczone. Więcej o eksporcie danych BigQuery przeczytasz w następnej sekcji.

Z kolei interfejs Firebase Cloud Messaging Data API zapewnia zagregowane szczegółowe informacje o tym, co dzieje się konkretnie w warstwie transportowej Androida (lub kroku 3 architektury FCM ). Dane te w szczególności zapewniają wgląd w dostarczanie komunikatów z zaplecza FCM do zestawu SDK systemu Android. Jest to szczególnie przydatne do pokazywania trendów wyjaśniających, dlaczego wiadomości zostały opóźnione lub porzucone podczas transportu.

W niektórych przypadkach możliwe jest, że te dwa zestawy danych mogą nie być dokładnie zgodne z następującymi przyczynami:

  • Zagregowane dane obejmują tylko część wszystkich wiadomości
  • Zagregowane dane są zaokrąglane
  • Nie prezentujemy wskaźników poniżej progu prywatności
  • Brakuje części wyników wiadomości ze względu na optymalizację zarządzania dużym natężeniem ruchu.

Ograniczenia API

Osie czasu danych zbiorczych

API zwróci dane historyczne z 7 dni; jednakże dane zwrócone przez to API będą opóźnione do 5 dni. Na przykład w dniu 20 stycznia dostępne będą dane za okres 9–15 stycznia, ale nie za dzień 16 stycznia i później. Ponadto dane są dostarczane z należytą starannością. W przypadku awarii danych FCM będzie pracować nad naprawieniem problemu i nie będzie uzupełniać danych po rozwiązaniu problemu. W przypadku większych awarii dane mogą być niedostępne przez tydzień lub dłużej.

Zasięg danych

Metryki udostępniane przez interfejs Firebase Cloud Messaging Data API mają na celu zapewnienie wglądu w ogólne trendy w dostarczaniu wiadomości. Nie zapewniają one jednak 100% pokrycia wszystkich scenariuszy komunikatów. Poniższe scenariusze to znane wyniki, które nie są odzwierciedlone w metrykach.

Zwinięte wiadomości

Wiadomości zwinięte przez inną wiadomość nie pojawiają się w zbiorze danych.

Wiadomości do nieaktywnych urządzeń

Wiadomości wysyłane do nieaktywnych urządzeń mogą, ale nie muszą, pojawiać się w zbiorze danych, w zależności od ścieżki danych, którą podążają. Może to prowadzić do błędnego zliczenia w polach droppedDeviceInactive i pending .

Wiadomości do urządzeń z określonymi preferencjami użytkownika

Użytkownicy, którzy wyłączyli zbieranie informacji użytkowych i diagnostycznych na swoich urządzeniach, nie będą uwzględniani w naszym zliczaniu, zgodnie z ich preferencjami.

Zaokrąglanie i minimum

FCM celowo zaokrągla i wyklucza zliczenia, gdy wolumeny nie są wystarczająco duże.

Eksport danych BigQuery

Możesz wyeksportować dane wiadomości do BigQuery w celu dalszej analizy. BigQuery pozwala analizować dane za pomocą BigQuery SQL, eksportować je do innego dostawcy usług w chmurze lub wykorzystywać dane do niestandardowych modeli uczenia maszynowego. Eksport do BigQuery obejmuje wszystkie dostępne dane wiadomości, niezależnie od ich typu oraz tego, czy wiadomość jest wysyłana przez API, czy przez narzędzie do tworzenia powiadomień.

W przypadku wiadomości wysyłanych na urządzenia z następującymi minimalnymi wersjami pakietu FCM SDK istnieje dodatkowa opcja włączenia eksportu danych o dostarczeniu wiadomości dla Twojej aplikacji:

  • Android 20.1.0 lub nowszy.
  • iOS 8.6.0 lub nowszy
  • Firebase Web SDK 9.0.0 lub nowszy

Poniżej znajdziesz szczegółowe informacje na temat włączania eksportu danych dla systemów Android i iOS .

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

  1. Wybierz jedną z następujących opcji:

    • Otwórz narzędzie do tworzenia powiadomień i kliknij Uzyskaj dostęp do BigQuery u dołu strony.

    • Na stronie Integracje w konsoli Firebase kliknij Link na karcie BigQuery .

      Na tej stronie wyświetlane są opcje eksportu FCM dla wszystkich aplikacji w projekcie obsługujących FCM.

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

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

Po włączeniu eksportu BigQuery dla Wiadomości w chmurze:

  • Firebase eksportuje Twoje dane do BigQuery. Należy pamiętać, że początkowa propagacja danych do eksportu może zająć do 48 godzin.

  • Po utworzeniu zbioru danych lokalizacji nie można zmienić, ale można skopiować zbiór danych do innej lokalizacji lub ręcznie przenieść (odtworzyć) zbiór danych w innej lokalizacji. Aby dowiedzieć się więcej, zobacz temat Zmiana lokalizacji zbioru danych .

  • Firebase konfiguruje regularne synchronizacje Twoich danych z projektu Firebase z BigQuery. Te codzienne operacje eksportowe rozpoczynają się o 4:00 czasu pacyficznego i zwykle kończą w ciągu 24 godzin.

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

Aby dezaktywować eksport BigQuery, odłącz swój projekt w konsoli Firebase.

Włącz eksport danych o dostarczeniu wiadomości

Urządzenia iOS z pakietem FCM SDK 8.6.0 lub nowszym mogą włączyć eksport danych dotyczących dostarczania wiadomości w swojej aplikacji. FCM obsługuje eksport danych zarówno dla alertów, jak i powiadomień w tle. Przed włączeniem tych opcji musisz najpierw utworzyć łącze FCM-BiqQuery dla swojego projektu zgodnie z opisem w sekcji Eksport danych BigQuery .

Włącz eksport danych o dostawie dla powiadomień o alertach

Ponieważ tylko powiadomienia o alertach mogą wyzwalać rozszerzenia aplikacji usługi powiadomień, musisz dodać rozszerzenie usługi powiadomień do swojej aplikacji i wywołać ten interfejs API w rozszerzeniu usługi, aby włączyć śledzenie komunikatów wyświetlanych. Zapoznaj się z dokumentacją firmy Apple dotyczącą modyfikowania treści w nowo dostarczonych powiadomieniach .

W przypadku każdego otrzymanego powiadomienia należy wykonać następujące wezwanie:

Szybki

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

Cel 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 przy użyciu interfejsu API HTTP v1, pamiętaj o określeniu mutable-content = 1 w obiekcie ładunku .

Włącz eksport danych o dostawie dla powiadomień w tle

W przypadku wiadomości w tle odbieranych, gdy aplikacja znajduje się na pierwszym planie lub w tle, możesz wywołać interfejs API eksportu danych w procedurze obsługi wiadomości danych w głównej aplikacji. To wezwanie należy wykonać w przypadku każdego otrzymanego powiadomienia:

Szybki

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

Cel 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?

Należy pamiętać, że celowanie w nieaktualne tokeny lub nieaktywne rejestracje może zawyżać niektóre z tych statystyk.

Schemat wyeksportowanej tabeli to:

_CZAS CZASÓW ZNAK CZASU Ta pseudokolumna zawiera znacznik czasu początku dnia (w formacie UTC), w którym dane zostały załadowane. W przypadku partycji RRRRMMDD ta pseudokolumna zawiera wartość TIMESTAMP('RRRR-MM-DD').
wydarzenie_znacznik czasu ZNAK CZASU Sygnatura czasowa zdarzenia zarejestrowana przez serwer
numer projektu LICZBA CAŁKOWITA Numer projektu identyfikuje projekt, który wysłał wiadomość
ID wiadomości STRUNOWY Identyfikator wiadomości identyfikuje wiadomość. Identyfikator wiadomości, wygenerowany na podstawie identyfikatora aplikacji i sygnatury czasowej, może w niektórych przypadkach nie być unikalny w skali globalnej.
identyfikator_instancji STRUNOWY 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.
typ wiadomości STRUNOWY Typ wiadomości. Może to być wiadomość z powiadomieniem lub wiadomość z danymi. Temat służy do identyfikacji oryginalnej wiadomości wysłanej w ramach tematu lub kampanii; kolejne wiadomości są albo powiadomieniem, albo wiadomością z danymi.
platforma_sdk STRUNOWY Platforma aplikacji odbiorcy
Nazwa aplikacji STRUNOWY Nazwa pakietu dla aplikacji na Androida lub identyfikator pakietu dla aplikacji na iOS
klucz_zwinięcia STRUNOWY Klawisz zwijania identyfikuje grupę wiadomości, które można zwinąć. Gdy urządzenie nie jest podłączone, w kolejce do ostatecznego dostarczenia czeka tylko ostatnia wiadomość z danym klawiszem zwinięcia
priorytet LICZBA CAŁKOWITA Priorytet wiadomości. Prawidłowe wartości to „normalny” i „wysoki”. W systemie iOS odpowiadają one priorytetom APN 5 i 10
ttl LICZBA CAŁKOWITA Ten parametr określa, jak długo (w sekundach) wiadomość powinna być przechowywana w pamięci FCM, jeśli urządzenie jest w trybie offline
temat STRUNOWY Nazwa tematu, na który została wysłana wiadomość (jeśli dotyczy)
id_luzu LICZBA CAŁKOWITA Identyfikator zbiorczy identyfikuje grupę powiązanych wiadomości, na przykład konkretną wiadomość wysłaną do tematu
wydarzenie STRUNOWY Rodzaj wydarzenia. Możliwe wartości to:
  • 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ć, postępuj zgodnie z instrukcjami podanymi w setDeliveryMetricsExportToBigQuery(boolean) .
  • MISSING_REGISTRATIONS: wniosek został odrzucony z powodu braku rejestracji;
  • UNAUTHORIZED_REGISTRATION: wiadomość została odrzucona, ponieważ nadawca nie ma uprawnień do wysłania do rejestracji;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: wystąpił nieokreślony błąd podczas przetwarzania żądania wiadomości;
  • MISMATCH_SENDER_ID: żądanie wysłania wiadomości zostało odrzucone z powodu niezgodności pomiędzy identyfikatorem nadawcy wysyłającego wiadomość a tym zadeklarowanym dla punktu końcowego;
  • QUOTA_EXCEEDED: żądanie wysłania wiadomości zostało odrzucone ze względu na niewystarczającą ilość miejsca;
  • INVALID_REGISTRATION: prośba o wysłanie wiadomości została odrzucona z powodu nieprawidłowej rejestracji;
  • INVALID_PACKAGE_NAME: prośba o wysłanie wiadomości została odrzucona z powodu nieprawidłowej nazwy pakietu;
  • INVALID_APNS_CREDENTIAL: żądanie wysłania wiadomości zostało odrzucone ze względu na nieprawidłowy certyfikat APNS;
  • INVALID_PARAMETERS: żądanie wysłania wiadomości zostało odrzucone ze względu na nieprawidłowe parametry;
  • PAYLOAD_TOO_LARGE: żądanie wysłania wiadomości zostało odrzucone ze względu na ładunek większy niż limit;
  • AUTHENTICATION_ERROR: żądanie wysłania wiadomości zostało odrzucone ze względu na błąd uwierzytelnienia (sprawdź klucz API użyty do wysłania wiadomości);
  • INVALID_TTL: żądanie wysłania wiadomości zostało odrzucone z powodu nieprawidłowego TTL.
etykieta_analityczna STRUNOWY Dzięki interfejsowi API HTTP v1 etykietę analityczną można ustawić podczas wysyłania wiadomości, aby oznaczyć wiadomość do celów analitycznych

Co możesz zrobić z wyeksportowanymi danymi?

W poniższych sekcjach znajdziesz przykłady zapytań, które możesz uruchomić w BigQuery na podstawie wyeksportowanych danych FCM.

Licz wysłane 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;

Zliczaj unikalne wystąpienia aplikacji, na które kierowane są 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';

Licz wysłane powiadomienia

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

Licz wysłane wiadomości danych

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

Zliczaj wiadomości wysłane na dany temat lub kampanię

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 dla wiadomości wysłanej na określony temat, zmodyfikuj to zapytanie, zastępując AND message_id != '' AND message_id = <your message id>; .

Oblicz czas trwania fanoutu dla danego tematu lub kampanii

Czas rozpoczęcia fanoutu to moment otrzymania pierwotnego żądania, a czas zakończenia to moment utworzenia ostatniej indywidualnej wiadomości skierowanej do pojedynczej instancji.

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;

Zlicz procent 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;

Śledź wszystkie zdarzenia dla danego identyfikatora wiadomości i identyfikatora 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;

Oblicz opóźnienie 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;