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 zapewnia 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 Android SDK z Firebase Cloud Messaging Data API
  • Kompleksowy eksport danych do Google BigQuery

Wszystkie narzędzia do raportowania opisane na tej stronie wymagają do działania usługi 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 dostarczenia wiadomości

Na karcie Raporty w konsoli Firebase możesz przeglądać następujące dane dotyczące wiadomości wysyłanych do pakietów SDK FCM platformy Android lub Apple, w tym wiadomości wysyłanych za pośrednictwem narzędzia Notifications Composer i interfejsów API FCM:

  • Wysyła — Wiadomość z danymi lub wiadomość z powiadomieniem została umieszczona w kolejce do dostarczenia lub została pomyślnie przekazana do usługi innej firmy, takiej jak APN w celu dostarczenia. Zobacz czas życia wiadomości, aby uzyskać więcej informacji.
  • Odebrano (dostępne tylko na urządzeniach z systemem Android) — Wiadomość z danymi lub powiadomienie zostały odebrane przez aplikację. Te dane są dostępne, gdy odbierające urządzenie z Androidem ma zainstalowany zestaw FCM SDK 18.0.1 lub nowszy.
  • Wyświetlenia (dostępne tylko dla powiadomień na urządzeniach z systemem Android) — Powiadomienie o wyświetlaniu 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 komunikatów z ładunkiem powiadomienia i wszystkich komunikatów danych oznaczonych etykietą . 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 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 w przypadku analiz niestandardowych, umożliwiając filtrowanie statystyk dostarczania według etykiet lub zestawów etykiet. Możesz dodać etykietę do dowolnej wiadomości wysyłanej za pośrednictwem interfejsu HTTP v1 API, 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 etykietami dodanymi poza tym limitem nie są raportowane.

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

Zagregowane dane dostawy za pośrednictwem interfejsu API danych FCM

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 gromadzenie danych w projekcie. Obejmuje to szczegółowe informacje na temat odsetka wiadomości dostarczonych bez opóźnień oraz 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ń wysyłania. 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 interfejsu API zwróci dane dla każdej kombinacji daty, aplikacji i etykiety analitycznej. Na przykład pojedynczy obiekt JSON androidDeliveryData wyglądałby 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ć wskaźniki

Dane o dostarczaniu przedstawiają odsetek wiadomości, które pasują do każdego z poniższych wskaźników. Możliwe, że jedna wiadomość pasuje do wielu wskaźników. Ze względu na ograniczenia w sposobie gromadzenia danych i poziom szczegółowości, na jakim agregujemy 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

Jedyna liczba zawarta w zbiorze danych to liczba wiadomości, które zostały zaakceptowane przez FCM do 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 skierowanych do użytkowników, którzy wyłączyli gromadzenie informacji o użytkowaniu i informacji diagnostycznych na swoich urządzeniach.

Procent wyników wiadomości

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

Na przykład wysoka wartość pola droppedTooManyPendingMessages może sygnalizować, że instancje aplikacji odbierają woluminy wiadomości, których nie można zwijać, przekraczając limit FCM wynoszący 100 oczekujących wiadomości. 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 rejestracji na serwerze, usunięcia nieaktualnych tokenów i anulowania subskrypcji tematów. Zobacz Zarządzanie tokenami rejestracji FCM , aby zapoznać się z najlepszymi rozwiązaniami w tym obszarze.

Procent 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 wskazywałaby, że przekraczasz maksymalne limity na urządzenie i powinna dostosować szybkość wysyłania wiadomości.

Procent wglądu w wiadomości

Ten obiekt dostarcza dodatkowych informacji o wszystkich wysyłanych komunikatach. Pole priorityLowered wyraża procent zaakceptowanych wiadomości, które miały obniżony priorytet 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 o wysłaniu wiadomości o wysokim priorytecie. Więcej informacji znajdziesz w naszej dokumentacji dotyczącej priorytetu wiadomości

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

Eksport BigQuery zapewnia 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 ). 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 zapewnia zbiorcze szczegółowe informacje o tym, co dzieje się konkretnie w warstwie transportowej Androida (lub w kroku 3 architektury FCM ). Te dane w szczególności zapewniają wgląd w dostarczanie komunikatów z backendów FCM do Android SDK. Jest to szczególnie przydatne do pokazywania trendów, dlaczego wiadomości były opóźniane lub odrzucane podczas tego transportu.

W niektórych przypadkach możliwe jest, że dwa zestawy danych mogą nie być dokładnie dopasowane z następujących powodów:

  • Zagregowane dane dotyczą tylko części wszystkich wiadomości
  • Zagregowane dane są zaokrąglane
  • Nie przedstawiamy danych poniżej progu prywatności
  • Brakuje części wyników wiadomości ze względu na optymalizację sposobu zarządzania dużym ruchem.

Ograniczenia API

Zagreguj osie czasu danych

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

Zakres danych

Metryki dostarczane przez Firebase Cloud Messaging Data API mają zapewniać wgląd w ogólne trendy dostarczania wiadomości. Jednak nie zapewniają one 100% pokrycia wszystkich scenariuszy wiadomości. Następujące 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 zbiorze danych.

Wiadomości do nieaktywnych urządzeń

Wiadomości wysyłane do nieaktywnych urządzeń mogą pojawiać się w zbiorze danych lub nie, w zależności od wybranej ścieżki danych. Może to prowadzić do błędnego zliczania w droppedDeviceInactive urządzenie nieaktywne i pending .

Wiadomości do urządzeń o określonych preferencjach użytkownika

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

Zaokrąglanie i minima

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

Eksport danych BigQuery

Możesz wyeksportować dane wiadomości do BigQuery w celu dalszej analizy. BigQuery umożliwia analizowanie danych za pomocą BigQuery SQL, eksportowanie ich do innego dostawcy usług w chmurze lub wykorzystywanie danych w niestandardowych modelach uczenia maszynowego. Eksport do BigQuery obejmuje wszystkie dostępne dane dotyczące wiadomości, niezależnie od typu wiadomości oraz tego, czy wiadomość została wysłana przez interfejs 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ę umożliwiającą eksportowanie danych dostarczania 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 Androida i iOS .

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

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

    • Otwórz kompozytora powiadomień , a następnie kliknij Uzyskaj dostęp do BigQuery u dołu strony.

    • Na stronie Integracje w konsoli Firebase kliknij Link 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 do Cloud Messaging:

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

  • Po utworzeniu zestawu danych nie można zmienić lokalizacji, ale można skopiować zestaw danych do innej lokalizacji lub ręcznie przenieść (utworzyć ponownie) zestaw danych w innej lokalizacji. Aby dowiedzieć się więcej, zobacz Zmiana lokalizacji zestawu 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ą 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 dezaktywować eksport BigQuery, odłącz swój projekt w konsoli Firebase.

Włącz eksport danych dostarczania wiadomości

Urządzenia z systemem iOS z pakietem FCM SDK 8.6.0 lub nowszym mogą włączyć eksport danych dostarczania wiadomości z aplikacji. FCM obsługuje eksport danych zarówno dla powiadomień o alertach, jak i powiadomień w tle. Zanim włączysz te opcje, musisz najpierw utworzyć połączenie FCM-BiqQuery dla swojego projektu zgodnie z opisem w 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 komunikatów wyświetlanych. Zobacz dokumentację firmy Apple dotyczącą modyfikowania treści w nowo dostarczonych powiadomieniach .

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

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 HTTP v1 API, pamiętaj o określeniu mutable-content = 1 w obiekcie payload .

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

W przypadku komunikatów w tle otrzymanych, gdy aplikacja działa na pierwszym planie lub w tle, można wywołać interfejs API eksportu danych w programie obsługi komunikatów danych głównej aplikacji. To połączenie 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 celowanie w nieaktualne tokeny lub nieaktywne rejestracje może zawyżać niektóre z tych statystyk.

Schemat wyeksportowanej tabeli to:

_CZASPARTYCJI 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').
znacznik_czasu zdarzenia 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ść. Wygenerowany na podstawie identyfikatora aplikacji i sygnatury czasowej identyfikator wiadomości może w niektórych przypadkach nie być unikatowy w skali globalnej.
identyfikator_instancji STRUNOWY Unikalny identyfikator aplikacji, do której jest wysyłana 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 dla tematu lub kampanii; kolejne komunikaty są albo powiadomieniem, albo komunikatem z danymi.
platforma_sdk STRUNOWY Platforma aplikacji odbiorcy
Nazwa aplikacji STRUNOWY Nazwa pakietu dla aplikacji na Androida lub identyfikator pakietu dla aplikacji na iOS
zwiń_klucz STRUNOWY Klucz zwijania identyfikuje grupę wiadomości, które można zwinąć. Gdy urządzenie nie jest podłączone, tylko ostatnia wiadomość z danym kluczem zwijania jest umieszczana w kolejce do ostatecznego dostarczenia
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, do którego została wysłana wiadomość (jeśli dotyczy)
identyfikator_zbiorczy LICZBA CAŁKOWITA Identyfikator zbiorczy identyfikuje grupę powiązanych wiadomości, na przykład określoną wysyłkę do tematu
wydarzenie STRUNOWY Typ zdarzenia. 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 zestawu 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 między identyfikatorem nadawcy wysyłającego wiadomość a identyfikatorem zadeklarowanym dla punktu końcowego;
  • QUOTA_EXCEEDED: żądanie wysłania wiadomości zostało odrzucone z powodu niewystarczającego limitu;
  • 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 paczki;
  • 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 błędnych parametrów;
  • PAYLOAD_TOO_LARGE: żądanie wysłania wiadomości zostało odrzucone z powodu ładunku przekraczającego limit;
  • AUTHENTICATION_ERROR: prośba o wysłanie wiadomości została odrzucona z powodu błędu 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 HTTP v1 API 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 względem 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;

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

Wysłano wiadomości z powiadomieniami o liczeniu

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

Zlicz 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 dotyczące wiadomości wysłanej do określonego tematu, zmodyfikuj to zapytanie, zastępując AND message_id != '' przez 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 czas utworzenia ostatniej indywidualnej wiadomości kierowanej 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;

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