Ejecuta consultas en SQL sobre los datos exportados en BigQuery

Después de exportar tus datos de Crashlytics y (opcionalmente) de sesiones de Firebase a BigQuery, puedes comenzar a trabajar con los datos:

  • Analiza datos con consultas en SQL
    Puedes ejecutar consultas en tus datos de Crashlytics para generar informes y resúmenes personalizados. Dado que estos tipos de informes personalizados no están disponibles en el panel de Crashlytics de la consola de Firebase, pueden complementar tu análisis y comprensión de los datos de fallas. Consulta la colección de consultas de ejemplo más adelante en esta página.

  • Combina datos de diferentes conjuntos de datos
    Por ejemplo, si eliges exportar datos de sesiones de Firebase cuando configures la exportación de datos de Crashlytics, podrás comprender mejor a los usuarios y las sesiones sin fallas (consulta la consulta de ejemplo). Además, puedes exportar datos de varios productos de Firebase (como Performance Monitoring) o de Google Analytics y, luego, unir y analizar esos datos en BigQuery con tus datos de Crashlytics.

  • Crea vistas
    Con la IU de BigQuery, puedes crear una vista, que es una tabla virtual definida por una consulta en SQL. Para obtener instrucciones detalladas sobre los diferentes tipos de vistas y cómo crearlas, consulta la documentación de BigQuery.

Para obtener detalles sobre el esquema del conjunto de datos, consulta Esquema del conjunto de datos para los datos exportados en BigQuery.

Más información sobre BigQuery SQL

Ejemplo de consultas para datos de Crashlytics

En esta sección, se proporcionan algunas situaciones y consultas de ejemplo que demuestran cómo puedes usar el lenguaje SQL de BigQuery con tus datos de Crashlytics exportados y los datos de sesiones de Firebase.

Ejemplo 1: Calcula métricas sin fallas con los datos de sesiones de Firebase

En la versión más reciente, lanzaste una renovación importante de tu app para abordar las fallas en un recorrido crítico del usuario. Recibiste opiniones excelentes de los usuarios, pero te gustaría tener evidencia cuantitativa de que tu app es más estable que antes.

Las métricas de usuarios sin fallas pueden ayudarte a proporcionar esta información. Estas métricas son mediciones importantes que te ayudan a comprender el estado general de tu app. Con los datos de las sesiones de Firebase y los eventos de Crashlytics, puedes calcular estas métricas con una consulta básica.

Estas son consultas de ejemplo para una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y ANDROID).

Usuarios sin fallas en una versión específica:

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

Sesiones sin fallas durante la última semana (últimas 168 horas):

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

Ejemplo 2: Fallas por día

Luego de resolver la mayor cantidad de errores posible, crees que tu equipo ya puede lanzar una app nueva para compartir fotos. Pero antes de hacerlo, quieres revisar la cantidad de fallas por día durante el último mes para asegurarte de que la búsqueda de errores haya hecho que la app sea más estable a lo largo del tiempo.

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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;

Ejemplo 3: Busca las fallas más generalizadas

Para priorizar adecuadamente los planes de producción, quieres encontrar las 10 fallas más generalizadas de tu app. Generas una consulta que proporciona los datos pertinentes.

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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;

Ejemplo 4: Los 10 dispositivos con más fallas

El otoño es la temporada de los teléfonos nuevos Tu empresa sabe que esto también significa que durante esta temporada aparecen problemas específicos de cada teléfono, en especial para Android. Para adelantarte a los inminentes problemas de compatibilidad, crea una consulta que identifique los 10 dispositivos que presentaron la mayor cantidad de fallas en la semana anterior (168 horas).

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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;

Ejemplo 5: Filtra por clave personalizada

Eres un desarrollador de videojuegos que quiere saber cuál de los niveles de su juego presenta la mayor cantidad de fallas.

Para hacer un seguimiento de esa estadística, configura una clave de Crashlytics personalizada (iOS+ | Android | Flutter | Unity) llamada current_level y actualízala cada vez que el usuario alcance un nivel nuevo.

Swift

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

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

Con esa clave en tu exportación a BigQuery, puedes escribir una consulta para informar la distribución de los valores de current_level asociados con cada evento de falla.

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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

Ejemplo 6: Extrae IDs de usuario

Tienes una app para Android en acceso anticipado. A la mayoría de sus usuarios les encanta, pero tres han experimentado una cantidad inusual de fallas. Para llegar a la raíz del problema, escribe una consulta que extrae todos los eventos de fallas de esos usuarios a través de sus ID de usuario.

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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
 

Ejemplo 7: Busca a todos los usuarios que experimentan una falla en particular

Tu equipo lanzó accidentalmente un error crítico a un grupo de verificadores beta. Tu equipo pudo usar la consulta del ejemplo "Busca fallas más generalizadas" anterior para identificar el ID de la falla específica. Ahora tu equipo desea ejecutar una consulta para extraer la lista de usuarios de la app que sufrieron esta falla.

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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;

Ejemplo 8: Cantidad de usuarios afectados por una falla, desglosada por país

Tu equipo detectó un error crítico durante el lanzamiento de una versión nueva. Pudiste usar la consulta del ejemplo "Busca fallas más generalizadas" anterior para identificar el ID de la falla específica. Tu equipo quiere comprobar si esta falla se propagó a los usuarios de distintos países del mundo.

Para escribir esta consulta, tu equipo deberá hacer lo siguiente:

  1. Habilitar la exportación de datos de Google Analytics a BigQuery. Consulta Exporta datos de proyectos a BigQuery.

  2. Actualizar la app para que pase un ID de usuario al SDK de Google Analytics y al SDK de 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. Escribir una consulta que use el campo ID de usuario para unir los eventos del conjunto de datos de Google Analytics con las fallas del conjunto de datos de Crashlytics.

    Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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

Ejemplo 9: 5 problemas principales de hoy

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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;

Ejemplo 10: 5 problemas principales desde DATE, incluido el día actual

También puedes combinar las tablas por lotes y en tiempo real con una consulta de unión para agregar información en tiempo real a los datos por lotes confiables. Como event_id es una clave primaria, puedes usar DISTINCT event_id para anular la duplicación de los eventos comunes de ambas tablas.

Esta es una consulta de ejemplo de una app para Android. En el caso de una app para iOS, usa su ID del paquete y IOS (en lugar del nombre del paquete y 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;

Próximos pasos