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 utilizzarli:

  • Analizza i dati utilizzando query SQL
    Puoi eseguire query sui dati di Crashlytics per generare report e riepiloghi personalizzati. 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. Consulta la raccolta di query di esempio più avanti in questa pagina.

  • Unisci i dati di set di dati diversi
    Ad esempio, se scegli di esportare i dati delle sessioni Firebase quando configuri l'esportazione dei dati di Crashlytics, puoi comprendere meglio gli utenti senza arresti anomali e le sessioni senza arresti anomali (vedi la query di esempio). Inoltre, puoi esportare i dati da vari prodotti Firebase (come Performance Monitoring) o da Google Analytics, quindi unire e analizzare questi dati in BigQuery con i dati di 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 visualizzazioni e su come crearle, consulta la documentazione di BigQuery.

Per maggiori dettagli sullo schema del set di dati, consulta Schema del set di dati per i dati esportati in BigQuery.

Scopri di più su BigQuery SQL

Esempi di query per i dati di Crashlytics

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

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

Nell'ultima versione, hai lanciato un importante rinnovamento della tua app per risolvere gli arresti anomali in un Critical User Journey. Hai ricevuto recensioni eccellenti dagli utenti, ma vorresti prove quantitative che la tua app sia più stabile di prima.

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

Di seguito sono riportati esempi di query 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, pensi 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 la correzione dei bug abbia reso l'app più stabile nel tempo.

Ecco una 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).

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ù diffusi

Per dare la giusta priorità ai piani di produzione, vuoi trovare i 10 arresti anomali più diffusi nella tua app. Generi una query che fornisce i punti dati pertinenti.

Ecco una 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).

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 è arrivato il momento di affrontare nuovi problemi specifici dei dispositivi, soprattutto per Android. Per anticipare i problemi di compatibilità imminenti, crei una query che identifica i 10 dispositivi che hanno avuto il maggior numero di arresti anomali nell'ultima settimana (168 ore).

Ecco una 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).

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 e vuoi sapere quale livello del tuo gioco presenta il maggior numero di arresti anomali.

Per monitorare questa statistica, imposti una chiave Crashlytics personalizzata (iOS+ | Android | Flutter | Unity ) chiamata current_level e la aggiorni 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 una 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).

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: estrai gli ID utente

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

Ecco una 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).

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 accidentalmente un bug critico a un gruppo di beta tester. Il tuo team è stato in grado di utilizzare la query dell'esempio "Trova gli arresti anomali più diffusi" riportato sopra per identificare l'ID del problema di arresto anomalo specifico. Ora il tuo team vorrebbe eseguire una query per estrarre l'elenco degli utenti dell'app interessati da questo arresto anomalo.

Ecco una 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).

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ù diffusi" riportato sopra per identificare l'ID del problema di arresto anomalo specifico. Ora il tuo team vuole sapere se questo arresto anomalo si è diffuso agli utenti di diversi paesi del mondo.

Per scrivere questa query, il tuo team dovrà:

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

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

Ecco una 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).

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 dal giorno 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 una 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).

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