SQL-Abfragen für exportierte Daten in BigQuery ausführen

Nachdem Sie Ihre Crashlytics- und optionalen Firebase-Sitzungsdaten in BigQuery exportiert haben, können Sie mit den Daten arbeiten:

  • Daten mit SQL-Abfragen analysieren
    Sie können Abfragen für Ihre Crashlytics-Daten ausführen, um benutzerdefinierte Berichte und Zusammenfassungen zu erstellen. Da diese Arten von benutzerdefinierten Berichten nicht im Crashlytics-Dashboard der Firebase-Konsole verfügbar sind, können sie Ihre Analyse und Ihr Verständnis von Absturzdaten ergänzen. Weiter unten auf dieser Seite finden Sie eine Sammlung von Beispielabfragen.

  • Daten aus verschiedenen Datasets zusammenführen
    Wenn Sie beispielsweise beim Einrichten des Crashlytics-Datenexports Firebase-Sitzungsdaten exportieren, können Sie die Messwerte zu absturzfreien Nutzern und Sitzungen ohne Abstürze besser nachvollziehen (Beispielabfrage). Außerdem können Sie Daten aus verschiedenen Firebase-Produkten (z. B. Performance Monitoring) oder aus Google Analytics exportieren und diese Daten dann in BigQuery mit Ihren Crashlytics-Daten zusammenführen und analysieren.

  • Ansichten erstellen
    Über die BigQuery-Benutzeroberfläche können Sie eine Ansicht erstellen. Das ist eine virtuelle Tabelle, die durch eine SQL-Abfrage definiert wird. Eine ausführliche Anleitung zu den verschiedenen Ansichtstypen und zum Erstellen von Ansichten finden Sie in der Dokumentation zu BigQuery.

Weitere Informationen zum Dataset-Schema finden Sie unter Dataset-Schema für exportierte Daten in BigQuery.

Informationen zu BigQuery SQL

Beispielabfragen für Crashlytics-Daten

In diesem Abschnitt finden Sie einige Beispielsituationen und ‑abfragen, die zeigen, wie Sie BigQuery SQL mit Ihren exportierten Crashlytics-Daten und Firebase-Sitzungsdaten verwenden können.

Beispiel 1: Messwerte zu Abstürzen mit Firebase-Sitzungsdaten berechnen

In der neuesten Version haben Sie Ihre App grundlegend überarbeitet, um Abstürze in einem wichtigen User Journey zu beheben. Sie haben hervorragende Rezensionen von Nutzern erhalten, möchten aber quantitative Beweise dafür, dass Ihre App stabiler als zuvor ist.

Messwerte ohne Abstürze können Ihnen dabei helfen. Diese Messwerte sind wichtig, um den allgemeinen Zustand Ihrer App zu verstehen. Mit Firebase-Sitzungsdaten und Crashlytics-Ereignissen können Sie diese Messwerte mit einer einfachen Abfrage berechnen.

Hier sind Beispielabfragen für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und ANDROID).

Nutzer ohne Abstürze für eine bestimmte Version:

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

Sitzungen ohne Abstürze in der letzten Woche (letzte 168 Stunden):

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

Beispiel 2: Abstürze nach Tag

Nachdem Sie so viele Fehler wie möglich behoben haben, sind Sie der Meinung, dass Ihr Team endlich bereit ist, Ihre neue Foto-Sharing-App zu starten. Bevor Sie das tun, möchten Sie die Anzahl der Abstürze pro Tag im letzten Monat überprüfen, um sicherzugehen, dass die App durch die Fehlerbehebung im Laufe der Zeit stabiler geworden ist.

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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;

Beispiel 3: Häufigste Abstürze ermitteln

Um Produktionspläne richtig zu priorisieren, müssen Sie die zehn häufigsten Abstürze in Ihrer App ermitteln. Sie erstellen eine Abfrage, die die relevanten Datenpunkte liefert.

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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;

Beispiel 4: Top 10 der Geräte mit Abstürzen

Im Herbst kommen die neuen Smartphones auf den Markt! Ihr Unternehmen weiß, dass dies auch bedeutet, dass es neue gerätespezifische Probleme gibt – insbesondere bei Android. Um den drohenden Kompatibilitätsproblemen entgegenzuwirken, haben Sie eine Abfrage erstellt, mit der die 10 Geräte ermittelt werden, auf denen in der letzten Woche (168 Stunden) die meisten Abstürze aufgetreten sind.

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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;

Beispiel 5: Nach benutzerdefiniertem Schlüssel filtern

Sie sind Spieleentwickler und möchten wissen, auf welcher Ebene Ihres Spiels die meisten Abstürze auftreten.

Um diese Statistik zu erfassen, legen Sie einen benutzerdefinierten Crashlytics-Schlüssel (iOS+ | Android | Flutter | Unity) mit dem Namen current_level fest und aktualisieren ihn jedes Mal, wenn der Nutzer ein neues Level erreicht.

Swift

Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

Mit diesem Schlüssel in Ihrem Export nach BigQuery können Sie dann eine Abfrage schreiben, um die Verteilung der current_level-Werte zu melden, die mit jedem Absturzereignis verknüpft sind.

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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 DESC

Beispiel 6: Nutzer-IDs extrahieren

Sie haben eine Android-App im Vorabzugriff. Die meisten Nutzer sind begeistert, aber bei drei Nutzern ist eine ungewöhnlich hohe Anzahl von Abstürzen aufgetreten. Um dem Problem auf den Grund zu gehen, schreiben Sie eine Abfrage, mit der Sie alle Absturzereignisse für diese Nutzer anhand ihrer Nutzer-IDs abrufen.

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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
 

Beispiel 7: Alle Nutzer mit einem bestimmten Absturzproblem finden

Ihr Team hat versehentlich einen kritischen Fehler für eine Gruppe von Betatestern veröffentlicht. Ihr Team konnte die Abfrage aus dem Beispiel „Häufigste Abstürze finden“ oben verwenden, um die spezifische Absturzproblem-ID zu ermitteln. Ihr Team möchte jetzt eine Abfrage ausführen, um die Liste der App-Nutzer zu extrahieren, die von diesem Absturz betroffen waren.

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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;

Beispiel 8: Anzahl der Nutzer, die von einem Absturzproblem betroffen sind, aufgeschlüsselt nach Land

Ihr Team hat während der Einführung eines neuen Releases einen kritischen Fehler erkannt. Sie konnten die Abfrage aus dem Beispiel „Häufigste Abstürze ermitteln“ oben verwenden, um die spezifische Absturzproblem-ID zu ermitteln. Ihr Team möchte nun herausfinden, ob dieser Absturz auch bei Nutzern in anderen Ländern aufgetreten ist.

Um diese Abfrage zu schreiben, muss Ihr Team Folgendes tun:

  1. Export von Google Analytics-Daten nach BigQuery aktivieren Weitere Informationen finden Sie unter Projektdaten nach BigQuery exportieren.

  2. Aktualisieren Sie Ihre App, damit eine Nutzer-ID sowohl an das Google Analytics SDK als auch an das Crashlytics SDK übergeben wird.

    Swift

    Crashlytics.sharedInstance().setUserIdentifier("123456789");
    Analytics.setUserID("123456789");
    

    Objective-C

    CrashlyticsKit setUserIdentifier:@"123456789";
    FIRAnalytics setUserID:@"12345678 9";
    

    Java

    Crashlytics.setUserIdentifier("123456789");
    mFirebaseAnalytics.setUserId("123456789");
    
  3. Schreiben Sie eine Abfrage, in der das Feld „Nutzer-ID“ verwendet wird, um Ereignisse im Dataset Google Analytics mit Abstürzen im Dataset Crashlytics zu verknüpfen.

    Hier ist ein Beispiel für eine Anfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und ANDROID).

    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

Beispiel 9: Die fünf häufigsten Probleme heute

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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;

Beispiel 10: Die fünf wichtigsten Probleme seit DATE, einschließlich heute

Sie können die Batch- und Echtzeittabellen auch mit einer Stitching-Abfrage kombinieren, um den zuverlässigen Batchdaten Echtzeitinformationen hinzuzufügen. Da event_id ein Primärschlüssel ist, können Sie mit DISTINCT event_id alle gemeinsamen Ereignisse aus den beiden Tabellen deduplizieren.

Hier ist ein Beispiel für eine Abfrage für eine Android-App. Verwenden Sie für eine iOS-App die Paket-ID und IOS (anstelle des Paketnamens und 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;

Nächste Schritte