Ir a la consola

Exporta datos de Crashlytics a BigQuery

Puedes exportar tus datos de Crashlytics a BigQuery para analizarlos en detalle. Esta herramienta te permite analizar los datos con BigQuery SQL, exportarlos a otro proveedor de servicios en la nube y usarlos en los paneles personalizados y de visualización con Google Data Studio.

Habilita la exportación a BigQuery

  1. Ve a la página Integraciones de Firebase console.
  2. Haz clic en Vincular en la tarjeta BigQuery.
  3. Sigue las instrucciones que aparecen en la pantalla para habilitar BigQuery.

Esto es lo que ocurre cuando vinculas el proyecto a BigQuery:

Para desactivar la exportación a BigQuery, desvincula el proyecto en Firebase console.

¿Qué datos se exportan a BigQuery?

Los datos de Firebase Crashlytics se exportan al conjunto de datos de BigQuery llamado firebase_crashlytics. Según la configuración predeterminada, se crearán tablas individuales en el conjunto de datos de Crashlytics para cada app del proyecto. Firebase nombra las tablas según el identificador de paquete de la app, convierte los puntos en guiones bajos y agrega el nombre de la plataforma al final. Por ejemplo, los datos de una aplicación con el ID com.google.test estarían en una tabla llamada com_google_test_ANDROID.

Cada fila de la tabla representa un evento que ocurrió en la app, incluidos los errores fatales y no fatales.

¿Qué puedes hacer con los datos exportados?

Las exportaciones de BigQuery contienen datos sin procesar sobre fallas que incluyen el tipo de dispositivo, el sistema operativo, las excepciones (apps para Android) o los errores (apps para iOS) y los registros de Crashlytics, entre otros datos.

Trabaja con datos de Firebase Crashlytics en BigQuery

En los siguientes ejemplos, se muestran las consultas que puedes ejecutar en tus datos de Crashlytics. Estas consultas generan informes que no se encuentran disponibles en el panel de Crashlytics.

Ejemplos de consultas de Crashlytics

En los siguientes ejemplos, se muestra cómo generar informes que agregan datos de eventos de fallas a resúmenes más fáciles de comprender.

Ejemplo 1: Fallas por día

Luego de resolver la mayor cantidad de errores posible, una desarrolladora líder cree que su equipo ya puede lanzar su app nueva para compartir fotos. Pero antes de hacerlo, quiere revisar la cantidad de fallas por día en el último mes para asegurarse de que la búsqueda de errores haya hecho que la app sea más estable a lo largo del tiempo:

SELECT
  COUNT(DISTINCT event_id) AS number_of_crashes,
  FORMAT_TIMESTAMP("%F", event_timestamp) AS date_of_crashes
FROM
 `projectId.firebase_crashlytics.package_name_ANDROID`
GROUP BY
  date_of_crashes
ORDER BY
  date_of_crashes DESC
LIMIT 30;

Ejemplo 2: Busca fallas más generalizadas

A fin de priorizar adecuadamente los planes de producción, un gerente de proyectos considera cómo identificar las 10 fallas más generalizadas de su producto. Con este objetivo, produce una consulta que otorga los datos más pertinentes:

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
  `projectId.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 3: Los 10 dispositivos con más fallas

El otoño es la temporada de los teléfonos nuevos y un desarrollador sabe que durante esta temporada también aparecen problemas específicos de cada teléfono. Para adelantarse a los inminentes problemas de compatibilidad, crea una consulta que identifica los 10 dispositivos que presentaron la mayor cantidad de fallas en la semana anterior:

SELECT
  device.model,
COUNT(DISTINCT event_id) AS number_of_crashes
FROM
  `projectId.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 4: Filtra por clave personalizada

Un desarrollador de videojuegos desea saber cuál de los niveles de su juego sufre la mayor cantidad de fallas. Para realizar el seguimiento de esa estadística, configura una clave personalizada de Crashlytics, current_level, y la actualiza cada vez que un usuario alcanza un nivel nuevo:

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Swift

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

Java

Crashlytics.setInt("current_level", 3);

Con esa clave en su exportación de BigQuery, escribe una consulta para crear un informe de la distribución de los valores de current_level asociados con cada evento de falla:

SELECT
COUNT(DISTINCT event_id) AS num_of_crashes,
  value
FROM
  `projectId.firebase_crashlytics.package_name_ANDROID`
UNNEST(custom_keys)
WHERE
  key = "current_level"
GROUP BY
  key,
  value
ORDER BY
  num_of_crashes DESC

Ejemplo 5: Extracción del ID de usuario

Un desarrollador tiene una app 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:

SELECT *
FROM
  `projectId.firebase_crashlytics.package_name_ANDROID`
WHERE
  user.id IN ("userid1", "userid2", "userid3")
ORDER BY
  user.id
 

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

Un desarrollador lanzó un error crítico a un grupo de verificadores de la versión Beta. El equipo pudo usar la consulta del ejemplo 2 para identificar el ID de la falla. Ahora desea ejecutar una consulta para extraer la lista de usuarios de la app que sufrieron este problema:

SELECT user.id as user_id
FROM
  `projectId.firebase_crashlytics.package_name_ANDROID`
WHERE
  issue_id = "YOUR_ISSUE_ID"
  AND application.display_version = ""
  AND user.id != ""
ORDER BY
  user.id;

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

Ahora, el equipo detectó un error crítico durante el lanzamiento de una versión nueva. Pudieron usar la consulta del ejemplo 2 para identificar el ID de la falla y quieren comprobar si se propagó a los usuarios de distintos países del mundo.

Para escribir esta consulta, se necesita lo siguiente:

  1. Habilitar las exportaciones de BigQuery para Google Analytics para Firebase. Consulta Exporta datos de proyectos a BigQuery.

  2. Actualizar la app a fin de que envíe los ID de usuario al SDK de Google Analytics para Firebase y el SDK de Crashlytics.

    Objective-C
    CrashlyticsKit setUserIdentifier:@"123456789";
    FIRAnalytics setUserID:@"123456789";
    
    Swift
    Crashlytics.sharedInstance().setUserIdentifier("123456789");
    Analytics.setUserID("123456789");
    
    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 BigQuery de Google Analytics con las fallas del conjunto de datos de BigQuery de Crashlytics:

SELECT DISTINCT c.issue_id, a.geo.country, COUNT(DISTINCT c.user.id) as num_users_impacted
FROM `projectId.firebase_crashlytics.package_name_ANDROID` c
INNER JOIN  `projectId.analytics_YOUR_TABLE.events_*` a on c.user.id = a.user_id
WHERE
  c.issue_id = "YOUR_ISSUE_ID"
  AND a._TABLE_SUFFIX BETWEEN '20190101'
  AND '20200101'
GROUP BY
  c.issue_id,
  a.geo.country,
  c.user.id

Comprende el esquema de Firebase Crashlytics en BigQuery

Cuando se vincula Crashlytics con BigQuery, Firebase exporta los eventos de fallas fatales y no fatales recientes, desde los dos días previos a la vinculación.

Desde ese momento y hasta que inhabilites el vínculo, Firebase exportará los eventos de Crashlytics de forma diaria. Es posible que los datos tarden algunos minutos en estar disponibles en BigQuery luego de cada exportación.

Conjuntos de datos

Firebase Crashlytics crea un conjunto de datos nuevo en BigQuery para los datos de Crashlytics. El conjunto de datos abarca el proyecto completo, incluso si tiene varias apps.

Tablas

Firebase Crashlytics crea una tabla en el conjunto de datos por cada app en tu proyecto, a menos que hayas inhabilitado la exportación de datos para alguna. Firebase nombra las tablas según el identificador de paquete de la aplicación, convierte los puntos en guiones bajos y agrega el nombre de la plataforma al final. Por ejemplo, los datos de una aplicación con el ID com.google.test estarían en una tabla llamada com_google_test_ANDROID.

Las tablas contienen un conjunto estándar de datos de Crashlytics, además de las claves personalizadas de Crashlytics definidas por los desarrolladores.

Filas

Cada fila de una tabla representa un error que encontró la aplicación.

Columnas

Las columnas de una tabla son idénticas para los errores fatales y no fatales. A continuación, se indican las columnas incluidas en la exportación.

Sin seguimientos de pila

Columnas presentes en las filas que representan eventos sin seguimientos de pila.

Nombre del campo Tipo de datos Descripción
platform STRING Android o iOS
bundle_identifier STRING El ID del paquete, p. ej., com.google.gmail
event_id STRING Un ID único para el evento
is_fatal BOOLEAN Determina si la app falló
issue_id STRING Un problema asociado con el evento
event_timestamp TIMESTAMP Cuándo ocurrió el evento
device RECORD El dispositivo en el que ocurrió el evento
device.manufacturer STRING El fabricante del dispositivo
device.model STRING El modelo del dispositivo
device.architecture STRING X86_32, X86_64, ARMV7, ARM64, ARMV7S o ARMV7K
memory RECORD El estado de la memoria del dispositivo
memory.used INT64 Bytes de memoria utilizados
memory.free INT65 Bytes de memoria restantes
storage RECORD El almacenamiento continuo del dispositivo
storage.used INT64 Bytes de almacenamiento utilizados
storage.free INT64 Bytes de almacenamiento restantes
operating_system RECORD Los detalles del SO del dispositivo
operating_system.display_version STRING La versión del SO
operating_system.name STRING El nombre del SO
operating_system.modification_state STRING MODIFIED o UNMODIFIED, es decir, si el dispositivo tiene jailbreak o permisos de administrador
application RECORD La app que generó el evento
application.build_version STRING La versión de compilación de la app
application.display_version STRING
user RECORD Opcional: información recopilada sobre el usuario de la app
user.name STRING Opcional: el nombre del usuario
user.email STRING Opcional: la dirección de correo electrónico del usuario
user.id STRING Opcional: un ID específico de la app asociado con el usuario
custom_keys REPEATED RECORD Pares clave-valor definidos por el desarrollador
custom_keys.key STRING Una clave definida por el desarrollador
custom_keys.value STRING Un valor definido por el desarrollador
installation_uuid STRING Un ID que identifica una instalación única de una app y un dispositivo
crashlytics_sdk_versions STRING La versión del SDK de Crashlytics que generó el evento
app_orientation STRING PORTRAIT, LANDSCAPE, FACE_UP o FACE_DOWN
device_orientation STRING PORTRAIT, LANDSCAPE, FACE_UP o FACE_DOWN
process_state STRING BACKGROUND o FOREGROUND
logs REPEATED RECORD Mensajes de registro con marcas de tiempo generados por el registrador de Crashlytics, si se encuentra habilitado
logs.timestamp TIMESTAMP Cuándo se creó el registro
logs.message STRING El mensaje registrado
breadcrumbs REPEATED RECORD Rutas de navegación de Google Analytics con marcas de tiempo, si se encuentran habilitadas
breadcrumbs.timestamp TIMESTAMP La marca de tiempo asociada con la ruta de navegación
breadcrumbs.name STRING El nombre asociado con la ruta de navegación
breadcrumbs.params REPEATED RECORD Parámetros asociados con la ruta de navegación
breadcrumbs.params.key STRING Una clave de parámetro asociada con la ruta de navegación
breadcrumbs.params.value STRING Un valor de parámetro asociado con la ruta de navegación
blame_frame RECORD El marco identificado como la causa raíz de la falla o el error
blame_frame.line INT64 El número de línea del archivo del marco
blame_frame.file STRING El nombre del archivo del marco
blame_frame.symbol STRING El símbolo procesado, o sin procesar en caso de que no sea posible
blame_frame.offset INT64 El desplazamiento de bytes hacia la imagen binaria que contiene el código, no establecido para las excepciones de Java
blame_frame.address INT64 La dirección en la imagen binaria que contiene el código, no establecida para los marcos de Java
blame_frame.library STRING El nombre visible de la biblioteca que contiene el marco
blame_frame.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM o SYSTEM
blame_frame.blamed BOOLEAN Si el análisis de Crashlytics determinó que este marco es la causa de la falla o el error
exceptions REPEATED RECORD Solo para Android: Excepciones que ocurrieron durante este evento. Las excepciones anidadas se presentan en orden cronológico invertido (es decir: el último registro es la primera excepción que se lanza)
exceptions.type STRING El tipo de excepción, p. ej., java.lang.IllegalStateException
exceptions.exception_message STRING Un mensaje asociado con la excepción
exceptions.nested BOOLEAN Verdadero para todas las excepciones, menos la última que se lanza (es decir, el primer registro)
exceptions.title STRING El título del subproceso
exceptions.subtitle STRING El subtítulo del subproceso
exceptions.blamed BOOLEAN Verdadero si Crashlytics determina que la excepción es responsable del error o la falla
exceptions.frames REPEATED RECORD Los marcos asociados con la excepción
exceptions.frames.line INT64 El número de línea del archivo del marco
exceptions.frames.file STRING El nombre del archivo del marco
exceptions.frames.symbol STRING El símbolo procesado, o sin procesar en caso de que no sea posible
exceptions.frames.offset INT64 El desplazamiento de bytes hacia la imagen binaria que contiene el código, no establecido para las excepciones de Java
exceptions.frames.address INT64 La dirección en la imagen binaria que contiene el código, no establecida para los marcos de Java
exceptions.frames.library STRING El nombre visible de la biblioteca que contiene el marco
exceptions.frames.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM o SYSTEM
exceptions.frames.blamed BOOLEAN Si el análisis de Crashlytics determinó que este marco es la causa de la falla o el error
error REPEATED RECORD Solo para iOS: errores no fatales
error.queue_name STRING La cola en la que se ejecutaba el subproceso
error.code INT64 Código de error asociado con el NSError personalizado y registrado de la app
error.title STRING El título del subproceso
error.subtitle STRING El subtítulo del subproceso
error.blamed BOOLEAN Si el análisis de Crashlytics determinó que este marco es la causa del error
error.frames REPEATED RECORD Los marcos del seguimiento de pila
error.frames.line INT64 El número de línea del archivo del marco
error.frames.file STRING El nombre del archivo del marco
error.frames.symbol STRING El símbolo procesado, o sin procesar en caso de que no sea posible
error.frames.offset INT64 El desplazamiento de bytes hacia la imagen binaria que contiene el código
error.frames.address INT64 La dirección en la imagen binaria que contiene el código
error.frames.library STRING El nombre visible de la biblioteca que contiene el marco
error.frames.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM o SYSTEM
error.frames.blamed BOOLEAN Si el análisis de Crashlytics determinó que este marco es la causa del error
threads REPEATED RECORD Subprocesos presentes cuando ocurrió el evento
threads.crashed BOOLEAN Si el subproceso falló
threads.thread_name STRING El nombre del subproceso
threads.queue_name STRING Solo para iOS: La cola en la que se ejecutaba el subproceso
threads.signal_name STRING El nombre de la señal que provocó la falla en la app, solo presente en los subprocesos nativos con fallas
threads.signal_code STRING El código de la señal que provocó la falla en la app, solo presente en los subprocesos nativos con fallas
threads.crash_address INT64 La dirección de la señal que provocó la falla en la app, solo presente en los subprocesos nativos con fallas
threads.code INT64 Solo para iOS: Código de error del NSError personalizado y registrado de la app
threads.title STRING El título del subproceso
threads.subtitle STRING El subtítulo del subproceso
threads.blamed BOOLEAN Si el análisis de Crashlytics determinó que este marco es la causa de la falla o el error
threads.frames REPEATED RECORD Los marcos del subproceso
threads.frames.line INT64 El número de línea del archivo del marco
threads.frames.file STRING El nombre del archivo del marco
threads.frames.symbol STRING El símbolo procesado, o sin procesar en caso de que no sea posible
threads.frames.offset INT64 El desplazamiento de bytes hacia la imagen binaria que contiene el código
threads.frames.address INT64 La dirección en la imagen binaria que contiene el código
threads.frames.library STRING El nombre visible de la biblioteca que contiene el marco
threads.frames.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM o SYSTEM
threads.frames.blamed BOOLEAN Si el análisis de Crashlytics determinó que este marco es la causa del error

Visualiza los datos exportados de Crashlytics con Data Studio

Google Data Studio convierte tus conjuntos de datos de Crashlytics en BigQuery en informes completamente personalizables que son fáciles de leer y compartir.

Si deseas obtener más información sobre cómo utilizar Data Studio, prueba la guía de inicio rápido de Data Studio: Bienvenido a Data Studio.

Utiliza una plantilla de informes de Crashlytics

Data Studio cuenta con un informe de muestra para Crashlytics que incluye un conjunto amplio de dimensiones y métricas del esquema exportado de BigQuery de Crashlytics. Puedes utilizar esta muestra como una plantilla para crear con rapidez informes y visualizaciones nuevos en función de los datos de fallas sin procesar de tu propia aplicación:

  1. Abre la plantilla de Crashlytics del panel de Data Studio.
  2. Haz clic en Usar plantilla en la esquina superior derecha.
  3. En la lista desplegable Fuente de datos nueva, selecciona Crear fuente de datos nueva.
  4. Haz clic en Seleccionar en la tarjeta de BigQuery.
  5. Selecciona una tabla que contenga los datos exportados de Crashlytics desde Mis proyectos > [nombre-de-tu-proyecto] > firebase_crashlytics > [nombre-de-tu-tabla].
  6. Ve a Configuración y establece el nivel de la plantilla de Crashlytics como Predeterminado.
  7. Haz clic en Conectar para crear la nueva fuente de datos.
  8. Haz clic en Agregar al informe para volver a la plantilla de Crashlytics.
  9. Finalmente, haz clic en Crear informe para crear tu copia de la plantilla de Crashlytics del panel de Data Studio.