Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Zrozumienie dostarczania wiadomości

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

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

  • Raporty dostarczania wiadomości w konsoli Firebase
  • Zagregowane dane o dostarczaniu Android SDK z interfejsu Firebase Cloud Messaging Data API
  • Kompleksowy eksport danych do Google BigQuery

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

Należy pamiętać, że raportowanie wielu statystyk na tej stronie podlega opóźnieniom do 24 godzin z powodu grupowania danych analitycznych.

Raporty doręczeń wiadomości

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

  • Wysyła — wiadomość z danymi lub powiadomienie zostało umieszczone w kolejce w celu dostarczenia lub zostało pomyślnie przekazane do usługi innej firmy, takiej jak APNs w celu dostarczenia. Zobacz okres istnienia wiadomości, aby uzyskać więcej informacji.
  • Odebrano (dostępne tylko na urządzeniach z systemem Android) — Wiadomość z danymi lub powiadomienie zostało odebrane przez aplikację. Te dane są dostępne, gdy odbierające urządzenie z systemem Android ma zainstalowany pakiet FCM SDK 18.0.1 lub nowszy.
  • Wyświetlenia (dostępne tylko w przypadku powiadomień na urządzeniach z systemem Android) — powiadomienie na wyświetlaczu zostało wyświetlone na urządzeniu, gdy aplikacja działa w tle.
  • Otwiera — użytkownik otworzył wiadomość z powiadomieniem. Zgłaszane tylko w przypadku powiadomień otrzymanych, gdy aplikacja działa w tle.

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

Podczas przeglądania raportów wiadomości możesz ustawić zakres dat dla wyświetlanych danych, z opcją eksportu do 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 w przypadku niestandardowych analiz, umożliwiając filtrowanie statystyk dostarczania według etykiet lub zestawów etykiet. Etykietę można dodać do dowolnej wiadomości wysyłanej za pośrednictwem interfejsu API HTTP v1, ustawiając pole fcmOptions.analyticsLabel w obiekcie wiadomości lub w polach AndroidFcmOptions lub ApnsFcmOptions specyficznych dla platformy.

Etykiety Analytics to ciągi tekstowe w formacie ^[a-zA-Z0-9-_.~%]{1,50}$ . Etykiety mogą zawierać małe i duże 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 dodanymi etykietami przekraczającymi ten limit nie są zgłaszane.

Na karcie Raporty wiadomości konsoli Firebase możesz przeszukiwać listę wszystkich istniejących etykiet i stosować je pojedynczo lub łącznie, aby filtrować wyświetlane statystyki.

Zagregowane dane o dostawach za pośrednictwem 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 zapewnia zagregowane dane na wszystkich urządzeniach z systemem Android obsługujących zbieranie danych w projekcie. Obejmuje to szczegółowe informacje o odsetku wiadomości dostarczonych bez opóźnień, a także o liczbie opóźnionych lub usuniętych wiadomości w warstwie Android Transport Layer . Ocena tych danych może ujawnić szerokie trendy w dostarczaniu wiadomości i pomóc w znalezieniu skutecznych sposobów poprawy wydajności wysyłanych żądań. Zobacz Zagregowane osie czasu danych, aby uzyskać informacje o dostępności zakresu dat w raportach.

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

Jak podzielone są dane?

Dane dostawy są podzielone według aplikacji, daty i etykiety analitycznej . Wywołanie API zwróci dane dla każdej kombinacji daty, aplikacji i etykiety analitycznej. Na przykład pojedynczy obiekt JSON androidDeliveryData będzie 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ć metryki

Dane o dostarczeniu przedstawiają procent wiadomości, które pasują do każdego z poniższych wskaźników. Możliwe, że pojedyncza wiadomość pasuje do wielu metryk. Ze względu na ograniczenia w sposobie zbierania danych i poziom szczegółowości, na którym agregowaliśmy dane, niektóre wyniki wiadomości nie są w ogóle reprezentowane w danych, więc poniższe wartości procentowe nie sumują się do 100%.

Policz wiadomości zaakceptowane

Jedyną liczbą uwzględnioną w zestawie danych jest liczba wiadomości, które zostały zaakceptowane przez FCM w celu dostarczenia na urządzenia z systemem Android. 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 diagnostycznych na swoich urządzeniach.

Procent wyniku wiadomości

Pola zawarte w obiekcie MessageOutcomePercents dostarczają informacji o wynikach żądań wiadomości. Kategorie wykluczają się wzajemnie. Może odpowiadać na pytania, takie jak „Czy moje wiadomości są dostarczane?” i „Co powoduje, że wiadomości są usuwane?”

Na przykład wysoka wartość pola droppedTooManyPendingMessages może sygnalizować, że wystąpienia aplikacji odbierają woluminy nieskładalnych komunikatów przekraczające limit FCM wynoszący 100 komunikatów oczekujących. Aby to złagodzić, 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 zaktualizowania tokenów rejestracji na serwerze, usunięcia przestarzałych tokenów i anulowania ich subskrypcji 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 zawierają informacje o wiadomościach, które zostały pomyślnie dostarczone. Może odpowiadać 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 wskazuje, że przekraczasz maksymalne limity na urządzenie i powinna dostosować szybkość wysyłania wiadomości.

Procenty wglądu w wiadomości

Ten obiekt dostarcza dodatkowych informacji o wszystkich wysłanych wiadomościach. Pole priorityLowered zawiera procent zaakceptowanych wiadomości, których priorytet został obniżony z HIGH na 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 zostanie wysłana wiadomość o wysokim priorytecie. Zobacz naszą dokumentację dotyczącą priorytetu wiadomości, aby uzyskać więcej informacji

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

Eksport BigQuery zapewnia pojedyncze dzienniki wiadomości o akceptacji wiadomości przez backend FCM i dostarczaniu wiadomości w pakiecie SDK na urządzeniu (kroki 2 i 4 architektury FCM ). Te dane są przydatne do zapewnienia, że ​​poszczególne wiadomości zostały zaakceptowane i dostarczone. Więcej informacji o eksporcie danych BigQuery znajdziesz w następnej sekcji.

Z kolei interfejs Firebase Cloud Messaging Data API udostępnia zagregowane szczegółowe informacje o tym, co dzieje się konkretnie w warstwie transportowej systemu Android (lub w kroku 3 architektury FCM ). Te dane zapewniają wgląd w dostarczanie wiadomości z backendów FCM do Android SDK. Jest to szczególnie przydatne do pokazywania trendów, dlaczego wiadomości zostały opóźnione lub porzucone podczas tego transportu.

W niektórych przypadkach możliwe jest, że te dwa zestawy danych mogą się nie zgadzać z następujących powodów:

  • Zagregowane dane próbkują tylko część wszystkich wiadomości
  • Zagregowane dane są zaokrąglane
  • Nie prezentujemy danych poniżej progu prywatności
  • Brakuje części wyników wiadomości z powodu optymalizacji sposobu, w jaki zarządzamy dużym ruchem.

Ograniczenia API

Zagregowane osie czasu danych

API zwróci 7 dni danych historycznych; jednak dane zwrócone przez ten interfejs API zostaną opóźnione o maksymalnie 5 dni. Na przykład 20 stycznia będą dostępne dane za okres od 9 do 15 stycznia, ale nie za 16 stycznia lub później. Dodatkowo dane są dostarczane z największą starannością. W przypadku przerwy w dostępie do danych FCM będzie pracować nad rozwiązaniem 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.

Pokrycie danych

Wskaźniki udostępniane przez Firebase Cloud Messaging Data API mają na celu zapewnienie wglądu w ogólne trendy dostarczania wiadomości. Jednak nie zapewniają 100% pokrycia wszystkich scenariuszy wiadomości. Poniższe scenariusze to znane wyniki, które nie są odzwierciedlone w metrykach.

Zwinięte wiadomości

Wiadomości, które zostały zwinięte przez inną wiadomość, nie pojawiają się w zestawie 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 wybranej ścieżki danych. Może to prowadzić do błędów w zliczaniu w droppedDeviceInactive i pending .

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

Użytkownicy, którzy wyłączyli zbieranie informacji o użytkowaniu i diagnostycznych na swoich urządzeniach, nie będą uwzględniać swoich wiadomości w naszym zliczaniu, zgodnie z ich preferencjami.

Zaokrąglanie i minima

FCM celowo zaokrągla i wyklucza zliczenia, w których 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 chmury lub używać danych do niestandardowych modeli ML. Eksport do BigQuery obejmuje wszystkie dostępne dane dotyczące wiadomości, niezależnie od typu wiadomości i tego, czy wiadomość jest wysyłana za pośrednictwem interfejsu API czy kompozytora powiadomień.

W przypadku wiadomości wysyłanych na urządzenia z następującymi minimalnymi wersjami pakietu FCM SDK masz dodatkową opcję włączenia eksportu danych dostarczania wiadomości dla swojej aplikacji:

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

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

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

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

    • Otwórz edytor powiadomień , a następnie kliknij Uzyskaj dostęp do BigQuery na dole strony.

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

      Ta strona wyświetla opcje eksportu FCM dla wszystkich aplikacji obsługujących FCM w projekcie.

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

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

Gdy włączysz eksport BigQuery dla Cloud Messaging:

  • Firebase eksportuje Twoje dane do BigQuery. Pamiętaj, że wstępne propagowanie danych do wyeksportowania może potrwać do 48 godzin.

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

  • Firebase konfiguruje regularne synchronizacje danych z projektu Firebase do BigQuery. Te codzienne operacje eksportowe rozpoczynają się o 4:00 czasu pacyficznego i zwykle kończą się 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 wyłączyć eksport BigQuery, odłącz projekt w konsoli Firebase.

Włącz eksport danych dostarczania wiadomości

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

Włącz eksport danych dostawy 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 wyświetlanych komunikatów. Zobacz dokumentację firmy Apple dotyczącą modyfikowania zawartoś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, upewnij się, że określiłeś mutable-content = 1 w obiekcie ładunku .

Włącz eksport danych dostawy dla powiadomień w tle

W przypadku komunikatów w tle odbieranych, gdy aplikacja znajduje się na pierwszym planie lub w tle, możesz wywołać interfejs API eksportu danych w ramach obsługi komunikatów danych głównej aplikacji. To wezwanie należy wykonać dla 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?

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

Schemat eksportowanej tabeli to:

_PARTITIONTIME ZNAK CZASU Ta pseudokolumna zawiera znacznik czasu początku dnia (w UTC), w którym dane zostały załadowane. W przypadku partycji RRRRMMDD ta pseudokolumna zawiera wartość TIMESTAMP('RRRR-MM-DD').
event_timestamp ZNAK CZASU Znacznik czasu zdarzenia zarejestrowany 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ść. Wygenerowany na podstawie identyfikatora aplikacji i sygnatury czasowej identyfikator wiadomości może w niektórych przypadkach nie być globalnie unikatowy.
instancja_id STRUNOWY Unikalny identyfikator aplikacji, do której wiadomość jest wysyłana (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 dla tematu lub wysłanej kampanii; kolejne wiadomości są albo powiadomieniem, albo wiadomością z danymi.
sdk_platform STRUNOWY Platforma aplikacji odbiorcy
Nazwa aplikacji STRUNOWY Nazwa pakietu dla aplikacji na Androida lub identyfikator pakietu dla aplikacji na iOS
klawisz_zawinięcia STRUNOWY Klucz zwinięcia identyfikuje grupę wiadomości, które można zwinąć. Gdy urządzenie nie jest podłączone, tylko ostatnia wiadomość z danym kluczem zwinięcia jest umieszczana w kolejce do ostatecznego dostarczenia
priorytet LICZBA CAŁKOWITA Priorytet wiadomości. Prawidłowe wartości to „normalne” i „wysokie”. 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)
zbiorczy_id LICZBA CAŁKOWITA Identyfikator zbiorczy identyfikuje grupę powiązanych wiadomości, takich jak konkretna wiadomość wysłana 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 wysyłania do rejestracji;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: wystąpił nieokreślony błąd podczas przetwarzania żądania wiadomości;
  • MISMATCH_SENDER_ID: żądanie wysłania komunikatu zostało odrzucone z powodu niezgodności między identyfikatorem nadawcy wysyłającego komunikat a identyfikatorem zadeklarowanym dla punktu końcowego;
  • QUOTA_EXCEEDED: żądanie wysłania wiadomości zostało odrzucone 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: żądanie wysłania wiadomości zostało odrzucone z powodu nieprawidłowych parametrów;
  • PAYLOAD_TOO_LARGE: żądanie wysłania wiadomości zostało odrzucone z powodu ładunku większego niż limit;
  • AUTHENTICATION_ERROR: żądanie wysłania wiadomości zostało odrzucone z powodu błędu uwierzytelniania (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_analityki STRUNOWY Dzięki API HTTP v1 można ustawić etykietę analityczną 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 wyeksportowanych danych FCM.

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

Zliczanie unikalnych wystąpień 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';

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

Policz wysłane wiadomości z danymi

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 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 dla wiadomości wysłanej do określonego tematu, zmodyfikuj to zapytanie, aby zastąpić AND message_id != '' z AND message_id = <your message id>; .

Oblicz czas trwania fanoutu dla danego tematu lub kampanii

Czas rozpoczęcia fanoutu to czas odebrania oryginalnego żądania, a czas zakończenia to czas utworzenia ostatniej pojedynczej wiadomości kierowanej na jedno wystąpienie.

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;

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