Po wyeksportowaniu danych sesji Crashlytics i (opcjonalnie) Firebase do BigQuery możesz zacząć z nimi pracować:
Analizowanie danych za pomocą zapytań SQL
Możesz uruchamiać zapytania na danych z Crashlytics, aby generować raporty niestandardowe i podsumowania. Te typy raportów niestandardowych nie są dostępne w panelu Crashlytics w konsoli Firebase, więc mogą uzupełniać analizę i zrozumienie danych o awariach. Przykłady zapytań znajdziesz w sekcji Przykładowe zapytania poniżej.Łączenie danych z różnych zbiorów danych
Jeśli na przykład podczas konfigurowania eksportu danychCrashlytics wybierzesz eksportowanie danych o sesjach Firebase, możesz lepiej zrozumieć dane o użytkownikach bez awarii i sesjach bez awarii (zobacz przykładowe zapytanie). Możesz też eksportować dane z różnych usług Firebase (np. Performance Monitoring) lub z Google Analytics, a następnie łączyć je i analizować w BigQuery razem z danymi z Crashlytics.Tworzenie widoków
Za pomocą interfejsu BigQuery możesz utworzyć widok, czyli tabelę wirtualną zdefiniowaną przez zapytanie SQL. Szczegółowe instrukcje dotyczące różnych typów widoków i sposobu ich tworzenia znajdziesz w dokumentacji BigQuery.
Szczegółowe informacje o schemacie zbioru danych znajdziesz w artykule Schemat zbioru danych na potrzeby eksportowania danych w BigQuery.
Więcej informacji o BigQuery SQL
Dowiedz się więcej o typach zapytań, które możesz uruchamiać, w tym o zadaniach z zapytaniami interaktywnymi, zadaniach z zapytaniami zbiorczymi i zadaniach z zapytaniami ciągłymi.
Dowiedz się więcej o obsługiwanych instrukcjach i dialektach SQL w BigQuery.
Dowiedz się, jak pisać zapytania za pomocą pomocy opartej na AI (Gemini).
Przykładowe zapytania dotyczące danych Crashlytics
W tej sekcji znajdziesz przykładowe sytuacje i zapytania, które pokazują, jak możesz używać języka SQL BigQuery z wyeksportowanymi danymi Crashlytics i danymi sesji Firebase.
- Obliczanie danych o braku awarii na podstawie danych o sesjach Firebase
- Awarie według dnia
- Znajdowanie najczęstszych awarii
- 10 urządzeń z największą liczbą awarii
- Filtrowanie według klucza niestandardowego
- Wyodrębnianie identyfikatorów użytkowników
- Znajdowanie wszystkich użytkowników, u których występuje dany problem z awarią
- Liczba użytkowników, u których wystąpiła awaria, w podziale na kraje
- 5 najczęstszych problemów dzisiaj
- 5 najczęstszych problemów od DATE, w tym dzisiaj
Przykład 1. Obliczanie danych o sesjach bez awarii na podstawie danych o sesjach Firebase
W najnowszej wersji aplikacji wprowadzono poważne zmiany, aby rozwiązać problem z jej awariami na głównej ścieżce użytkownika. Użytkownicy wystawiają Twojej aplikacji świetne opinie, ale chcesz mieć ilościowe dowody na to, że jest ona bardziej stabilna niż wcześniej.
Dane dotyczące braku awarii mogą pomóc w uzyskaniu tych informacji. Te dane to ważne pomiary, które pomagają zrozumieć ogólny stan aplikacji. Dzięki danym o sesjach Firebase i zdarzeniom Crashlytics możesz obliczyć te dane za pomocą podstawowego zapytania.
Oto przykładowe zapytania dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
Użytkownicy, u których nie wystąpił błąd, w przypadku konkretnej wersji:
SELECT TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date, (1 - (COUNT (DISTINCT installation_uuid) / COUNT (DISTINCT instance_id))) AS CFU FROM `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions LEFT JOIN `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics ON TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) WHERE crashlytics.error_type="FATAL" AND crashlytics.application.display_version="APP_VERSION" AND sessions.application.display_version = "APP_VERSION" GROUP BY event_date ORDER BY event_date
Sesje bez awarii w ciągu ostatniego tygodnia (ostatnich 168 godzin):
SELECT TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date, (1 - (COUNT (DISTINCT crashlytics.firebase_session_id) / COUNT (DISTINCT sessions.session_id))) AS CFS FROM `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions LEFT JOIN `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics ON TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) WHERE crashlytics.error_type="FATAL" AND _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR) AND _PARTITIONTIME < CURRENT_TIMESTAMP() GROUP BY event_date ORDER BY event_date
Przykład 2. Awarie według dnia
Po usunięciu jak największej liczby błędów uważasz, że Twój zespół jest wreszcie gotowy do wprowadzenia na rynek nowej aplikacji do udostępniania zdjęć. Zanim to zrobisz, chcesz sprawdzić liczbę awarii dziennie w ciągu ostatniego miesiąca, aby upewnić się, że dzięki usunięciu błędów aplikacja stała się bardziej stabilna.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT COUNT(DISTINCT event_id) AS number_of_crashes, FORMAT_TIMESTAMP("%F", event_timestamp) AS date_of_crashes FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` GROUP BY date_of_crashes ORDER BY date_of_crashes DESC LIMIT 30;
Przykład 3. Znajdowanie najczęstszych awarii
Aby prawidłowo ustalić priorytety planów produkcyjnych, chcesz znaleźć 10 najczęstszych awarii w aplikacji. Tworzysz zapytanie, które dostarcza odpowiednie punkty danych.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT DISTINCT issue_id, COUNT(DISTINCT event_id) AS number_of_crashes, COUNT(DISTINCT installation_uuid) AS number_of_impacted_user, blame_frame.file, blame_frame.line FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` WHERE event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(),INTERVAL 168 HOUR) AND event_timestamp < CURRENT_TIMESTAMP() GROUP BY issue_id, blame_frame.file, blame_frame.line ORDER BY number_of_crashes DESC LIMIT 10;
Przykład 4. 10 urządzeń, na których najczęściej dochodzi do awarii
Jesień to sezon na nowe telefony. Twoja firma wie, że oznacza to również sezon na nowe problemy z urządzeniami – zwłaszcza z Androidem. Aby wyprzedzić potencjalne problemy ze zgodnością, tworzysz zapytanie, które identyfikuje 10 urządzeń, na których w ciągu ostatniego tygodnia (168 godzin) wystąpiło najwięcej awarii.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT device.model, COUNT(DISTINCT event_id) AS number_of_crashes FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` WHERE event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR) AND event_timestamp < CURRENT_TIMESTAMP() GROUP BY device.model ORDER BY number_of_crashes DESC LIMIT 10;
Przykład 5. Filtrowanie według klucza niestandardowego
Jesteś deweloperem gier i chcesz wiedzieć, na którym poziomie gry występuje najwięcej awarii.
Aby śledzić tę statystykę, ustawiasz niestandardowy klucz Crashlytics (iOS+ | Android | Flutter | Unity) o nazwie current_level i aktualizujesz go za każdym razem, gdy użytkownik osiągnie nowy poziom.
Swift
Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");
Objective-C
CrashlyticsKit setIntValue:3 forKey:@"current_level";
Java
Crashlytics.setInt("current_level", 3);
Mając ten klucz w eksportowanych danych do BigQuery, możesz napisać zapytanie, które będzie raportować rozkład wartości current_level powiązanych z każdym zdarzeniem awarii.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT
COUNT(DISTINCT event_id) AS num_of_crashes,
value
FROM
`PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
UNNEST(custom_keys)
WHERE
key = "current_level"
GROUP BY
key,
value
ORDER BY
num_of_crashes DESCPrzykład 6. Wyodrębnianie identyfikatorów użytkowników
Masz aplikację na Androida we wcześniejszym dostępie. Większość użytkowników jest z niej zadowolona, ale u 3 z nich wystąpiła nietypowa liczba awarii. Aby dotrzeć do sedna problemu, piszesz zapytanie, które pobiera wszystkie zdarzenia awarii dla tych użytkowników, używając ich identyfikatorów użytkownika.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT *
FROM
`PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
user.id IN ("USER_ID_1", "USER_ID_2", "USER_ID_3")
ORDER BY
user.id
Przykład 7. Znajdowanie wszystkich użytkowników, u których występuje konkretny problem z awarią
Twój zespół przypadkowo udostępnił grupie beta-testerów wersję aplikacji z krytycznym błędem. Twój zespół użył zapytania z powyższego przykładu „Znajdowanie najczęstszych awarii”, aby zidentyfikować identyfikator konkretnego problemu z awarią. Teraz Twój zespół chce uruchomić zapytanie, aby wyodrębnić listę użytkowników aplikacji, których dotyczyła ta awaria.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT user.id as user_id
FROM
`PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
issue_id = "ISSUE_ID"
AND application.display_version = "APP_VERSION"
AND user.id != ""
ORDER BY
user.id;Przykład 8. Liczba użytkowników, których dotyczy problem z awarią, w podziale na kraje
Twój zespół wykrył krytyczny błąd podczas wdrażania nowej wersji. Możesz użyć zapytania z powyższego przykładu „Znajdowanie najczęstszych awarii”, aby zidentyfikować identyfikator konkretnego problemu z awarią. Twój zespół chce teraz sprawdzić, czy ta awaria wystąpiła u użytkowników w różnych krajach na całym świecie.
Aby napisać to zapytanie, Twój zespół musi wykonać te czynności:
Włącz eksportowanie danych z: Google Analytics do: BigQuery. Zobacz Eksportowanie danych projektu do BigQuery.
Zaktualizuj aplikację, aby przekazywała identyfikator użytkownika do pakietu SDK Google Analytics i pakietu SDK Crashlytics.
Swift
Crashlytics.sharedInstance().setUserIdentifier("123456789"); Analytics.setUserID("123456789");Objective-C
CrashlyticsKit setUserIdentifier:@"123456789"; FIRAnalytics setUserID:@"12345678 9";Java
Crashlytics.setUserIdentifier("123456789"); mFirebaseAnalytics.setUserId("123456789");Napisz zapytanie, które używa pola identyfikatora użytkownika do łączenia zdarzeń ze zbioru danych Google Analytics z awariami ze zbioru danych Crashlytics.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj jej identyfikatora pakietu i
IOS(zamiast nazwy pakietu iANDROID).SELECT DISTINCT c.issue_id, a.geo.country, COUNT(DISTINCT c.user.id) as num_users_impacted FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` c INNER JOIN `PROJECT_ID.analytics_TABLE_NAME.events_*` a on c.user.id = a.user_id WHERE c.issue_id = "ISSUE_ID" AND a._TABLE_SUFFIX BETWEEN '20190101' AND '20200101' GROUP BY c.issue_id, a.geo.country, c.user.id
Przykład 9. 5 najważniejszych problemów do tej pory
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT issue_id, COUNT(DISTINCT event_id) AS events FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME` WHERE DATE(event_timestamp) = CURRENT_DATE() GROUP BY issue_id ORDER BY events DESC LIMIT 5;
Przykład 10. 5 najczęstszych problemów od DATA, w tym dzisiaj
Możesz też połączyć tabele zbiorcze i tabele czasu rzeczywistego za pomocą zapytania łączącego, aby dodać informacje w czasie rzeczywistym do wiarygodnych danych zbiorczych. event_id jest kluczem podstawowym, więc możesz użyć DISTINCT event_id, aby usunąć duplikaty typowych zdarzeń z obu tabel.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
SELECT issue_id, COUNT(DISTINCT event_id) AS events FROM ( SELECT issue_id, event_id, event_timestamp FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME` UNION ALL SELECT issue_id, event_id, event_timestamp FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`) WHERE event_timestamp >= PARSE_TIMESTAMP("%Y_%m_%d", "YYYY_MM_DD") GROUP BY issue_id ORDER BY events DESC LIMIT 5;
Co dalej?
tworzyć niestandardowe panele, korzystając z wyeksportowanych danych i różnych usług Google Cloud, takich jak Data Studio;
Dowiedz się więcej o schemacie zbioru danych w przypadku wyeksportowanych danych.