Eseguire query SQL sui dati esportati in BigQuery

Dopo aver esportato i dati di Crashlytics e (facoltativamente) delle sessioni Firebase in BigQuery, puoi iniziare a lavorare con i dati:

  • Analizzare i dati utilizzando query SQL
    Puoi eseguire query sui tuoi dati Crashlytics per generare report personalizzati e riepiloghi. Poiché questi tipi di report personalizzati non sono disponibili nella dashboard Crashlytics della console Firebase, possono integrare l'analisi e la comprensione dei dati sugli arresti anomali. Vedi la raccolta di query di esempio più avanti in questa pagina.

  • Unisci i dati di diversi set di dati
    Ad esempio, se scegli di esportare i dati sulle sessioni di Firebase quando configuri l'esportazione dei dati di Crashlytics, puoi comprendere meglio gli utenti senza arresti anomali e le sessioni senza arresti anomali (vedi query di esempio). Inoltre, puoi esportare i dati da vari prodotti Firebase (come Performance Monitoring) o da Google Analytics e poi unirli e analizzarli in BigQuery con i tuoi dati Crashlytics.

  • Crea viste
    Utilizzando l'interfaccia utente di BigQuery, puoi creare una vista, ovvero una tabella virtuale definita da una query SQL. Per istruzioni dettagliate sui diversi tipi di viste e su come crearle, consulta la documentazione di BigQuery.

Per informazioni dettagliate sullo schema del set di dati, vedi Schema del set di dati per i dati esportati in BigQuery.

Scopri di più su BigQuery SQL

Esempi di query per i dati Crashlytics

Questa sezione fornisce alcuni scenari ed esempi di query che mostrano come utilizzare SQL BigQuery con i dati Crashlytics esportati e i dati delle sessioni Firebase.

Esempio 1: calcola le metriche senza arresti anomali utilizzando i dati delle sessioni Firebase

Nell'ultima versione, hai lanciato un importante rinnovamento della tua app per risolvere i blocchi in un percorso utente fondamentale. Hai ricevuto recensioni eccezionali dagli utenti, ma vorresti prove quantitative che la tua app è più stabile di prima.

Le metriche senza arresti anomali possono aiutarti a fornire queste informazioni. Queste metriche sono misurazioni importanti che ti aiutano a comprendere lo stato generale della tua app. Con i dati delle sessioni di Firebase e gli eventi Crashlytics, puoi calcolare queste metriche con una query di base.

Ecco alcune query di esempio per un'app per Android. Per un'app per iOS, utilizza l'ID pacchetto e IOS (anziché il nome pacchetto e ANDROID).

Utenti senza arresti anomali per una versione specifica:

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

Sessioni senza arresti anomali nell'ultima settimana (ultime 168 ore):

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

Esempio 2: arresti anomali per giorno

Dopo aver lavorato per correggere il maggior numero possibile di bug, ritieni che il tuo team sia finalmente pronto per lanciare la nuova app di condivisione di foto. Prima di farlo, vuoi controllare il numero di arresti anomali al giorno nell'ultimo mese, per assicurarti che il bug-bash abbia reso l'app più stabile nel tempo.

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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;

Esempio 3: trova gli arresti anomali più pervasivi

Per dare la giusta priorità ai piani di produzione, devi trovare i 10 arresti anomali più pervasivi nella tua app. Produci una query che fornisca i punti di dati pertinenti.

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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;

Esempio 4: i 10 dispositivi con il maggior numero di arresti anomali

L'autunno è la stagione dei nuovi smartphone. La tua azienda sa che questo significa anche che è arrivata la stagione dei nuovi problemi specifici dei dispositivi, soprattutto per Android. Per prevenire i problemi di compatibilità imminenti, hai creato una query che identifica i 10 dispositivi che hanno subito il maggior numero di arresti anomali nell'ultima settimana (168 ore).

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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;

Esempio 5: filtra per chiave personalizzata

Sei uno sviluppatore di giochi che vuole sapere in quale livello del tuo gioco si verificano più arresti anomali.

Per monitorare questa statistica, imposta una chiave Crashlytics personalizzata (iOS+ | Android | Flutter | Unity ) chiamata current_level e aggiornala ogni volta che l'utente raggiunge un nuovo livello.

Swift

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

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

Con questa chiave nell'esportazione in BigQuery, puoi scrivere una query per generare un report sulla distribuzione dei valori current_level associati a ogni evento di arresto anomalo.

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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

Esempio 6: estrazione degli ID utente

Hai un'app per Android con accesso in anteprima. La maggior parte dei tuoi utenti lo adora, ma tre hanno riscontrato un numero insolito di arresti anomali. Per risolvere il problema, scrivi una query che estrae tutti gli eventi di arresto anomalo per questi utenti, utilizzando i loro ID utente.

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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
 

Esempio 7: trova tutti gli utenti che riscontrano un problema di arresto anomalo specifico

Il tuo team ha rilasciato per errore un bug critico a un gruppo di beta tester. Il tuo team è riuscito a utilizzare la query dell'esempio "Trova gli arresti anomali più pervasivi" riportato sopra per identificare l'ID problema di arresto anomalo specifico. Ora il tuo team vuole eseguire una query per estrarre l'elenco degli utenti dell'app interessati da questo arresto anomalo.

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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;

Esempio 8: numero di utenti interessati da un problema di arresto anomalo, suddivisi per paese

Il tuo team ha rilevato un bug critico durante l'implementazione di una nuova release. Hai potuto utilizzare la query dell'esempio "Trova gli arresti anomali più pervasivi" riportato sopra per identificare l'ID problema di arresto anomalo specifico. Il tuo team vorrebbe ora verificare se questo arresto anomalo si è diffuso tra gli utenti di diversi paesi in tutto il mondo.

Per scrivere questa query, il tuo team dovrà:

  1. Attiva l'esportazione dei dati di Google Analytics in BigQuery. Consulta Esportare i dati del progetto in BigQuery.

  2. Aggiorna la tua app per trasmettere un ID utente sia all'SDK Google Analytics sia all'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");
    
  3. Scrivi una query che utilizzi il campo ID utente per unire gli eventi nel set di dati Google Analytics con gli arresti anomali nel set di dati Crashlytics.

    Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID pacchetto e IOS (anziché il nome del pacchetto e 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

Esempio 9: i 5 problemi principali finora oggi

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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;

Esempio 10: i 5 problemi principali a partire da DATA, incluso oggi

Puoi anche combinare le tabelle batch e in tempo reale con una query di unione per aggiungere informazioni in tempo reale ai dati batch affidabili. Poiché event_id è una chiave primaria, puoi utilizzare DISTINCT event_id per deduplicare gli eventi comuni delle due tabelle.

Ecco un esempio di query per un'app per Android. Per un'app per iOS, utilizza l'ID bundle e IOS (anziché il nome del pacchetto e 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;

Passaggi successivi