Po wyeksportowaniu danych Crashlytics i (opcjonalnie) sesji Firebase do BigQuery możesz zacząć z nimi pracować:
Analizuj dane za pomocą zapytań SQL
Możesz uruchamiać zapytania dotyczące danych Crashlytics, aby generować niestandardowe raporty i podsumowania. Ponieważ te typy niestandardowych raportów nie są dostępne w Crashlytics panelu Firebase konsoli, mogą one uzupełniać Twoją analizę i zrozumienie danych o awariach. Kolekcję przykładowych zapytań znajdziesz w dalszej części tej strony.Łącz dane z różnych zbiorów danych
Jeśli na przykład podczas konfigurowania eksportu danych Crashlytics zdecydujesz się wyeksportować dane sesji Firebase, możesz lepiej zrozumieć liczbę użytkowników i sesji bez awarii (zobacz przykładowe zapytanie). Możesz też wyeksportować dane z różnych usług Firebase (np. Performance Monitoring) lub z Google Analytics, a następnie połączyć je i przeanalizować w BigQuery razem z danymi Crashlytics.Twórz widoki
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 BigQuery dokumentacji.
Szczegółowe informacje o schemacie zbioru danych znajdziesz w artykule Schemat zbioru danych na potrzeby wyeksportowanych danych w BigQuery.
Więcej informacji o BigQuery SQL
Dowiedz się więcej o typach zapytań, które możesz uruchamiać, w tym o interaktywnych, zbiorczych i ciągłych zadaniach zapytań.
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 kilka przykładowych sytuacji i zapytań, które pokazują, jak możesz używać BigQuery SQL z wyeksportowanymi Crashlytics danymi i danymi sesji Firebase.
- Obliczanie danych o bezawaryjnej pracy na podstawie danych sesji Firebase
- Awaria według dnia
- Znajdowanie najczęstszych awarii
- 10 urządzeń, na których najczęściej występują awarie
- Filtrowanie według klucza niestandardowego
- Wyodrębnianie identyfikatorów użytkowników
- Znajdowanie wszystkich użytkowników, których dotyczy konkretny problem z awarią
- Liczba użytkowników, których dotyczy problem z awarią, według kraju
- 5 najczęstszych problemów do tej pory
- 5 najczęstszych problemów od daty, w tym dzisiaj
Przykład 1. Obliczanie danych o bezawaryjnej pracy na podstawie danych sesji Firebase
W najnowszej wersji wprowadziliśmy duże zmiany w aplikacji, aby rozwiązać problemy z awariami w głównej ścieżce użytkownika. Otrzymaliśmy świetne opinie od użytkowników, ale chcemy mieć dowody ilościowe, że aplikacja jest bardziej stabilna niż wcześniej.
Dane o bezawaryjnej pracy mogą pomóc w uzyskaniu tych informacji. Te dane są ważnymi pomiarami, które pomagają zrozumieć ogólny stan aplikacji. Dzięki danym sesji Firebase i Crashlytics zdarzeniom, 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 jej identyfikatora pakietu i IOS (zamiast nazwy pakietu i ANDROID).
Liczba użytkowników bez awarii w określonej 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
Liczba sesji 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. Awaria według dnia
Po rozwiązaniu jak największej liczby błędów uważamy, że nasz zespół jest wreszcie gotowy do uruchomienia nowej aplikacji do udostępniania zdjęć. Zanim to zrobimy, chcemy sprawdzić liczbę awarii dziennie w ciągu ostatniego miesiąca, aby mieć pewność, ż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 jej 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 ustalać priorytety planów produkcyjnych, chcemy znaleźć 10 najczęstszych awarii w aplikacji. Tworzymy zapytanie, które zawiera odpowiednie punkty danych.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj jej 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 występują awarie
Jesień to sezon nowych telefonów. W naszej firmie wiemy, że oznacza to też sezon problemów związanych z nowymi urządzeniami, zwłaszcza z Androidem. Aby wyprzedzić nadchodzące problemy z kompatybilnością, tworzymy 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 jej 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śmy deweloperami gier i chcemy wiedzieć, na którym poziomie naszej gry występuje najwięcej awarii.
Aby śledzić te statystyki, ustawiamy niestandardowy klucz Crashlytics
(iOS+ |
Android |
Flutter |
Unity
)
o nazwie current_level i aktualizujemy 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);
Gdy ten klucz znajdzie się w wyeksportowanych danych w 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 jej 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
Mamy aplikację na Androida we wczesnym dostępie. Większość użytkowników jest zadowolona, ale 3 z nich doświadczyło niezwykłej liczby awarii. Aby rozwiązać ten problem, piszemy zapytanie, które pobiera wszystkie zdarzenia awarii tych użytkowników na podstawie ich identyfikatorów.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj jej 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, których dotyczy konkretny problem z awarią
Nasz zespół przypadkowo udostępnił krytyczny błąd grupie beta testerów. Zespół mógł użyć zapytania z przykładu „Znajdowanie najczęstszych awarii” powyżej, aby zidentyfikować konkretny identyfikator problemu z awarią. Teraz zespół chce uruchomić zapytanie, aby wyodrębnić listę użytkowników aplikacji, których dotyczy ta awaria.
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj jej 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ą, według kraju
Nasz zespół wykrył krytyczny błąd podczas wdrażania nowej wersji. Udało nam się użyć zapytania z przykładu „Znajdowanie najczęstszych awarii” powyżej, aby zidentyfikować konkretny identyfikator problemu z awarią. Teraz zespół chce sprawdzić, czy ta awaria rozprzestrzeniła się na użytkowników w różnych krajach na całym świecie.
Aby napisać to zapytanie, zespół musi wykonać te czynności:
Włącz eksport danych Google Analytics do BigQuery. Zobacz Eksportowanie danych projektu do BigQuery.
Zaktualizuj aplikację, aby przekazywać identyfikator użytkownika zarówno do pakietu Google Analytics SDK jak i pakietu Crashlytics SDK.
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ń w zbiorze danych Google Analytics z awariami w zbiorze 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 najczęstszych problemów do tej pory
Oto przykładowe zapytanie dotyczące aplikacji na Androida. W przypadku aplikacji na iOS użyj jej 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 daty, w tym dzisiaj
Możesz też połączyć tabele zbiorcze i w czasie rzeczywistym za pomocą zapytania łączącego, aby dodać informacje w czasie rzeczywistym do wiarygodnych danych zbiorczych. Ponieważ event_id jest kluczem
podstawowym, 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 jej 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?
Twórz niestandardowe panele za pomocą wyeksportowanych danych i różnych usług Google Cloud, takich jak Data Studio.
Dowiedz się więcej o schemacie zbioru danych na potrzeby wyeksportowanych danych.