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 o wyświetlaniu w ramach pakietu Android SDK z interfejsu Firebase Cloud Messaging Data API
- Kompleksowy eksport danych do Google BigQuery
Aby działały narzędzia do raportowania opisane na tej stronie, musisz mieć uprawnienia 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 raportowanie wielu statystyk na tej stronie może być opóźnione nawet o 24 godziny z powodu grupowania danych analitycznych.
Raporty Dostarczanie 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:
- Sends (Wysyła) – wiadomość z danymi lub powiadomienie zostało umieszczone w kole do wysyłki lub zostało przekazane do usługi zewnętrznej, takiej jak APN, 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.FCM
- 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.
- Otwierania – 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 analitycznych do wiadomości
Oznaczanie wiadomości etykietami jest bardzo przydatne w przypadku analiz niestandardowych, ponieważ pozwala filtrować statystyki dotyczące 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 z wszystkich urządzeń z Androidem w projekcie, na których włączono 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 znajdowaniu skutecznych sposobów na zwiększenie skuteczności żądań wysyłania. Informacje o dostępności zakresów dat w raportach znajdziesz w artykule Uogólniona linia czasu danych.
Interfejs API udostępnia 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 każdej 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
}
}
Interpretowanie danych
Dane o dostarczeniu określają odsetek wiadomości, które pasują do każdego z tych danych. Możliwe, że jedna wiadomość pasuje do kilku rodzajów danych. 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 wzajemnie się wykluczają. Może ona udzielać odpowiedzi na pytania w rodzaju „Czy moje wiadomości są dostarczane?” lub „Dlaczego wiadomości nie są dostarczane?”.
Na przykład wysoka wartość pola droppedTooManyPendingMessages
może wskazywać, że instancje aplikacji otrzymują dużą liczbę niezwijalnych 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 w przypadku droppedDeviceInactive
mogą wskazywać na potrzebę zaktualizowania tokenów rejestracji na serwerze, usunięcia nieaktualnych tokenów i wypisania użytkowników z tematów. Sprawdzone metody w tym zakresie znajdziesz w artykule Zarządzanie tokenami rejestracji FCM.
Odsetek skuteczności dostawy
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 na temat priorytetów 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). Te dane są przydatne do sprawdzania, czy 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 do wyświetlania trendów dotyczących przyczyn opóźnień lub utraty wiadomości podczas tego transportu.
W niektórych przypadkach 2 zbiory danych mogą się nie pokrywać dokładnie z tych powodów:
- Dane zbiorcze obejmują tylko część wszystkich wiadomości
- Dane zbiorcze są zaokrąglane.
- Nie przedstawiamy danych poniżej progu prywatności
- Brakuje części wyników wiadomości z powodu optymalizacji sposobu zarządzania dużym natężeniem ruchu.
Ograniczenia interfejsu API
Linie czasu danych zbiorczych
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. Dane są dostarczane z możliwie największą dokładnoś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 dłuższych 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ą na celu dostarczenie informacji o ogólnych trendach dostarczania 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 czas życia danych (TTL) wygasa po dacie logowania, wiadomość nie zostanie w tym dniu policzona 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 droppedDeviceInactive
i pending
.
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 z uwzględnienia liczby, gdy ich wielkość jest niewystarczająca.
Eksportowanie danych z BigQuery
Dane wiadomości możesz wyeksportować do BigQuery na potrzeby dalszej analizy. 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 typu wiadomości lub tego, czy wiadomość została wysłana za pomocą interfejsu API czy 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 o dostawie wiadomości w aplikacji:
- Android 20.1.0 lub nowszy.
- iOS 8.6.0 lub nowsza
- Pakiet Firebase Web SDK w wersji 9.0.0 lub nowszej
Poniżej znajdziesz szczegółowe informacje o włączaniu eksportu danych na Androidzie i iOS.
Aby rozpocząć, połącz swój projekt z BigQuery:
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 eksportowania FCM dla wszystkich aplikacji w projekcie, w których włączono FCM.
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.
- Możesz ręcznie zaplanować uzupełnianie danych z maksymalnie 30 dni.
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. Te codzienne operacje eksportu rozpoczynają się o 4:00 rano czasu pacyficznego i zwykle kończą się w ciągu 24 godzin.
Domyślnie wszystkie aplikacje w projekcie są połączone z poziomem BigQuery, a wszystkie aplikacje, które dodasz później do projektu, zostaną automatycznie połączone z poziomem 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
Użytkownicy urządzeń z Androidem w wersji FCM SDK 20.1.0 lub nowszej mogą włączyć eksport danych o dostarczonej wiadomości w aplikacji. Eksport danych jest domyślnie wyłączony na poziomie aplikacji. Programowe włączenie tej funkcji na poziomie instancji aplikacji umożliwia proszenie użytkowników o pozwolenie na analizowanie ich danych dotyczących dostarczania wiadomości (zalecane). Jeśli oba są ustawione, wartość na poziomie instancji aplikacji zastępuje wartość na poziomie aplikacji.
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 dla instancji aplikacji
W większości przypadków zalecamy włączenie eksportu danych o dostawie wiadomości tylko na poziomie instancji aplikacji i pozostawienie go wyłączonego na poziomie aplikacji.
FirebaseMessaging.getInstance().setDeliveryMetricsExportToBigQuery(true)
Włączanie eksportu danych o dostawie dla aplikacji
Jeśli wolisz włączyć eksportowanie na poziomie aplikacji, nie wywołuj metody setDeliveryMetricsExportToBigQuery
, a zamiast tego dodaj do obiektu aplikacji w pliku manifestu aplikacji tę właściwość:
<application>
<meta-data android:name="delivery_metrics_exported_to_big_query_enabled"
android:value="true" />
</application>
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 kolumna pseudo 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 służy do identyfikacji wiadomości. Identyfikator wiadomości jest generowany na podstawie identyfikatora aplikacji i znaku czasowego. 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 oryginalnej 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 identyfikuje 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 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 magazynie FCM, jeśli urządzenie jest offline. |
temat | CIĄG ZNAKÓW | Nazwa tematu, do którego wysłano wiadomość (w stosownych przypadkach) |
bulk_id | 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:
|
analytics_label | CIĄG ZNAKÓW | W przypadku interfejsu HTTP API w wersji 1 etykietę analityczną można ustawić podczas wysyłania wiadomości, aby oznaczyć ją na potrzeby analityki. |
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';
Liczba 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 związane z wiadomością wysłaną na określony temat, zmodyfikuj to zapytanie, zastępując AND message_id != ''
wartością AND message_id = <your message id>;
.
Obliczanie czasu trwania rozgałęzienia w przypadku 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ń dla danego identyfikatora wiadomości i identyfikatora wystąpienia
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;