Cómo importar registros de eventos de Firebase en BigQuery

En este instructivo, se describe cómo exportar registros de eventos desde Google Analytics para Firebase y Firebase Crashlytics hacia Google BigQuery, con el fin de realizar un análisis detallado de los datos.

Firebase es una plataforma que sirve para compilar aplicaciones móviles y que incluye características, como almacenamiento de datos y archivos, sincronización en tiempo real, autenticación y más. Google Analytics para Firebase realiza un seguimiento del uso de tus características de Firebase, y brinda estadísticas sobre el uso de la aplicación y la participación de los usuarios; Firebase Crashlytics registra las fallas de la aplicación y brinda estadísticas sobre los tipos de fallas que experimentan los usuarios y la frecuencia con que ocurren.

BigQuery es un almacén de datos a escala de petabytes que puede utilizarse para ejecutar consultas similares a las de SQL sobre grandes cantidades de datos casi en tiempo real.

Importar tus datos de Firebase en BigQuery te brinda numerosas ventajas:

  • Agregación de datos desde varias fuentes: Si realizas un seguimiento de los eventos de usuario desde varios lugares, como Google Analytics para Firebase, Firebase Crashlytics, Google Analytics 360 y datos personalizados recopilados por un servicio de backend móvil, puedes importar tus datos desde todas esas fuentes a BigQuery y realizar un análisis que te otorgue un panorama completo de tus datos de eventos.

  • Acceso a datos sin procesar: Cuando importas datos a BigQuery, puedes acceder a los valores de los datos sin procesar y tienes flexibilidad sobre la manera en la que realizas el análisis de los eventos.

  • Control de acceso: Cuando exportas datos a BigQuery, estos te pertenecen, y puedes utilizar las LCA de BigQuery para administrar los permisos sobre proyectos y conjuntos de datos, lo que hace posible compartir los datos sin tener que otorgar permisos a tu aplicación de Firebase.

  • Archivar datos inactivos: Si necesitas almacenar datos sin procesar, puedes extraerlos a BigQuery y, luego, archivarlos en Google Cloud Storage o en otra ubicación de almacenamiento para obtener un almacenamiento a largo plazo económico.

  • Parámetros de eventos personalizados: En Google Analytics, puedes definir los eventos y parámetros personalizados a los que quieres realizar un seguimiento. Importar los datos a BigQuery te brinda la capacidad de realizar análisis valiosos sobre los parámetros de eventos personalizados y estándar.

Objetivos

En este instructivo, se describe cómo realizar las siguientes acciones:

  • Vincular un proyecto de Firebase a BigQuery, para permitir que Firebase Analytics y Firebase Crashlytics exporten registros de eventos hacia BigQuery de forma diaria
  • Almacenar datos de consultas en BigQuery

Costos

Para transferir datos de Firebase a BigQuery, debes actualizar tu proyecto al nivel de servicio de Blaze. Si deseas obtener más información, visita Precios de Firebase.

A continuación, verás una lista de los costos que se generan cuando el proyecto de Firebase se encuentra vinculado a BigQuery:

El costo de transmisión de los datos de eventos diarios a la tabla de BigQuery
Todos los días, cada aplicación vinculada transmite datos de eventos sin procesar hacia una tabla de BigQuery. Si deseas obtener más información, dirígete a Cómo vincular BigQuery con Firebase.
Los costos para almacenar y realizar consultas de datos en BigQuery
BigQuery ofrece diferentes opciones de precios basadas en la cantidad de datos almacenados y procesados por las consultas. Si deseas obtener más información, consulta los Precios de BigQuery.

Antes de comenzar

  1. Crea un proyecto de Firebase.

  2. Compila una aplicación que envíe eventos de Firebase. Si quieres obtener más información sobre cómo realizar esta acción, consulta Comenzar a usar Firebase Crashlytics o Comenzar a usar Google Analytics para Firebase para iOS o Android.

Cómo vincular los datos del proyecto a BigQuery

Vincular tu proyecto de Firebase a BigQuery te permite acceder a tus datos de eventos sin procesar y sin muestreo.

  1. Ve a la página de Integraciones en Firebase console.

  2. En la tarjeta de BigQuery, haz clic en Vincular.

  3. Utiliza los interruptores para determinar si deseas exportar los datos de Analytics, de Crashlytics o ambos. Cuando exportas datos de Analytics, también puedes optar por incluir identificadores de publicidad, lo que brinda datos más valiosos, pero puede dar como resultado costos adicionales de almacenamiento y consultas en BigQuery.

  4. Haz clic en Vincular a BigQuery para completar la tarea.

Luego de vincular tu proyecto, BigQuery crea un conjunto de datos correspondiente y lo asocia con el proyecto. Todos los días, se agrega una tabla nueva a tu proyecto para los conjuntos de datos por cada aplicación vinculada. El conjunto de datos debería estar disponible luego de la primera exportación diaria de los eventos de tu proyecto.

Cómo administrar las aplicaciones que envían datos a BigQuery

Cuando creas un vínculo entre tu proyecto y BigQuery, Firebase exporta eventos para cada aplicación de tu proyecto. Puedes cambiar esto si excluyes aplicaciones de la exportación diaria:

  1. Ve a la página de Integraciones en Firebase console.

  2. En la tarjeta de BigQuery, haz clic en Administrar.

  3. Para detener el envío de datos desde una aplicación hacia BigQuery, haz clic en el interruptor que se encuentra junto al nombre de la aplicación y selecciona Detener la exportación.

  1. Ve a la página de Integraciones en Firebase console.

  2. En la tarjeta de BigQuery, haz clic en Administrar.

  3. Selecciona Desvincular proyecto en la parte inferior de la página y haz clic en Desvincular de BigQuery para confirmar la tarea.

Cómo ejecutar consultas de datos de Firebase con BigQuery

Una vez que tus datos se cargaron en BigQuery, puedes ejecutar consultas similares a las de SQL sobre ellos a través de BigQuery. Para obtener más información, consulta Cómo ejecutar consultas de datos en los documentos de BigQuery.

BigQuery te brinda una IU web en la que ejecutar consultas sobre los datos es tan simple como llenar un formulario y hacer clic en Ejecutar consulta. Si deseas obtener más información, consulta la Guía de inicio rápido sobre cómo utilizar la IU web en los documentos de BigQuery.

Cómo trabajar con datos de Firebase Analytics en BigQuery

A continuación, se muestran ejemplos de consultas que puedes ejecutar en tus datos de Analytics. A través de estas consultas, se generan informes que no están disponibles en el panel de Google Analytics.

Cómo ejecutar consultas de parámetros de eventos personalizados

En Google Analytics, puedes configurar claves de parámetros personalizados y valores en los eventos. Las claves se escriben como String, y los valores pueden tener el tipo String, Long o Double.

En las siguientes consultas, se muestra cómo generar informes que agreguen valores de eventos personalizados para brindar estadísticas empresariales.

Ejemplo 1:

Un desarrollador de juegos para dispositivos móviles desea saber qué nivel de su juego genera la mayor cantidad de flujos de compra en el juego. Para hacerlo, agrega la siguiente llamada de evento al juego, que se ejecuta cuando un jugador activa un flujo de compra en el juego.

En este ejemplo, el nombre del evento personalizado es trigger_purchase, que tiene una clave, level, que especifica un número entero que indica el nivel en el que se encontraba el jugador cuando activó una compra.

iOS - Objective C

[FIRAnalytics logEventWithName:@"trigger_purchase"
                parameters:@{
                              @"level": 3,
}];

iOS - Swift

FIRAnalytics.logEventWithName("trigger_purchase", parameters: [
  "level": 3
])

Android - Java

Bundle params = new Bundle();
params.putInt("level", 3);
mFirebaseAnalytics.logEvent("trigger_purchase", params);

A continuación, se muestran las entradas que se dieron como resultado de estos eventos personalizados en BigQuery:

Campo Valor
event_dim.name trigger_purchase
event_dim.params.key level
event_dim.params.value.int_value 3

Para determinar la cantidad de compras por nivel, el desarrollador escribe una consulta que genera un informe sobre la distribución del conteo de eventos de trigger_purchase, agrupados por el nivel en el que se encuentra el jugador. Esta consulta se ejecuta durante el período 1/1/2015 a 31/12/2016.

SELECT COUNT(event_dim.name) as NumberOfPurchases,
event_dim.params.value.int_value as level
FROM
TABLE_DATE_RANGE(com_game_example_ANDROID.app_events_, TIMESTAMP('2015-01-01'), TIMESTAMP('2016-12-31'))
WHERE event_dim.name = 'trigger_purchase'
GROUP BY level

Ejemplo 2:

Un segundo desarrollador que trabaja en el mismo juego quiere determinar qué clases de personajes son las que derrotan más oponentes. Para ello, agrega el siguiente registro de evento personalizado al juego cuando un jugador derrota a un oponente.

En este ejemplo, el nombre del evento personalizado es defeat_opponent y tiene la clave character, que especifica el valor de la string que indica el nombre del oponente.

iOS - Objective C

[FIRAnalytics logEventWithName:@"defeat_opponent"
                parameters:@{
                              @"character": "Hercules"
}];

iOS - Swift

FIRAnalytics.logEventWithName("defeat_opponent", parameters: [
  "character": "Hercules"
])

Android - Java

Bundle params = new Bundle();
params.putString("character", "Hercules");
mFirebaseAnalytics.logEvent("defeat_opponent", params);

A continuación, verás las entradas resultantes de BigQuery para este evento personalizado:

Campo Valor
event_dim.name defeat_opponent
event_dim.params.key character
event_dim.params.value.string_value Hercules

Para encontrar la clase de personaje más exitosa, el desarrollador escribe una consulta que cuenta la cantidad de veces que una clase de personaje participa de un evento personalizado de derrota de un oponente.

SELECT COUNT(event_dim.name) as DefeatEvents,
event_dim.params.value.string_value as CharacterClass
FROM
TABLE_DATE_RANGE( com_game_example_ANDROID.app_events_, TIMESTAMP('2015-01-01'), TIMESTAMP('2016-12-31'))
WHERE event_dim.name = 'defeat_opponent'
AND event_dim.params.key = 'character'
GROUP BY CharacterClass
ORDER BY DefeatEvents desc

Cómo ejecutar consultas de eventos de usuario

Además de realizar consultas en eventos personalizados, puedes generar informes que agregan valores de eventos de usuarios para brindar estadísticas empresariales.

Ejemplo 3:

Un desarrollador de aplicaciones quiere utilizar Firebase Cloud Messaging para enviar notificaciones push a usuarios que no utilizaron la aplicación recientemente y, de esta manera, volver a generar participación. Para localizar a los usuarios del último año que no visitaron la aplicación en las dos semanas anteriores, y poder compilar la lista de contactos a la que enviará las notificaciones, el desarrollador utiliza la siguiente consulta. Esta consulta muestra los usuarios de iOS y de Android, junto con la fecha en la que los usuarios abrieron la aplicación inicialmente.

En la consulta que se muestra más abajo, el campo user_dim.user_id contiene el ID de usuario que el desarrollador configuró en la aplicación a través de una llamada a la API de setUserId. Luego de configurar este valor, Google Analytics lo mantiene y lo incluye en todas las filas futuras asociadas con ese usuario. El valor no se agrega de forma retroactiva a las filas antiguas.

Si el desarrollador no configura el identificador user_dim.user_id, puede utilizar el campo app_info.app_instance_id, que contiene el identificador predeterminado generado por Firebase, en lugar de user_dim.user_id. Ten en cuenta que Firebase genera un app_info.app_instance_id nuevo cada vez que se desinstala y reinstala una aplicación de Firebase en el mismo dispositivo.

La tabla de datos exportada a BigQuery correspondiente a la app para iOS es com_retail_example_IOS.app_events_[DATE] y la tabla correspondiente a Android es com_retail_example_ANDROID.app_events_[DATE], en las que [DATE] es la fecha actual.

SELECT
  userId,
  DATE(MIN( firstOpenTime )) firstOpenTime
FROM (
  SELECT
    user_dim.user_id AS userId,
    user_dim.first_open_timestamp_micros AS firstOpenTime
  FROM (TABLE_DATE_RANGE([com_retail_example_IOS.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -1, 'YEAR'), CURRENT_TIMESTAMP())),
    (TABLE_DATE_RANGE([com_retail_example_ANDROID.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -1, 'YEAR'), CURRENT_TIMESTAMP())) )
WHERE
  userId NOT IN (
  SELECT
    user_dim.user_id AS userId
  FROM (TABLE_DATE_RANGE([com_retail_example_IOS.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -14, 'DAY'), CURRENT_TIMESTAMP())),
    (TABLE_DATE_RANGE([com_retail_example_ANDROID.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -14, 'DAY'), CURRENT_TIMESTAMP())) )
GROUP BY
  userId

Ejemplo 4:

Un desarrollador de aplicaciones quiere determinar qué países tienen la mayor cantidad de usuarios activos en las plataformas de iOS y Android. Para ello, utiliza la siguiente consulta a fin de realizar una lista con la cantidad de usuarios y eventos por país, según una fecha determinada.

La consulta interna muestra el user_id y el country de una fila y, luego, realiza un conteo de todos los eventos dentro de esa fila. La consulta utiliza la cláusula WITHIN RECORD como event_dim en un RECORD, y es la mejor manera de controlar las agregaciones para los registros anidados.

La consulta externa hace uso del EXACT_COUNT_DISTINCT del userId para brindar un número preciso de la cantidad total de usuarios. De forma alternativa, el desarrollador puede utilizar COUNT(DISTINCT user_id), aunque esto brinda una estimación en lugar de un valor exacto. Una estimación del valor puede ser una opción más rápida cuando hay un conjunto de datos muy grande y se buscan las tendencias a través del tiempo, un caso en el que la velocidad es más importante que la precisión.

SELECT
  country,
  EXACT_COUNT_DISTINCT(user_id) AS users,
  SUM(noOfEvents) AS totalEvents
FROM (
  SELECT
    user_dim.app_info.app_instance_id AS user_id,
    user_dim.geo_info.country AS country,
    COUNT(event_dim.name) WITHIN RECORD noOfEvents
  FROM
    [com_retail_example_IOS.app_events_20160723],
    [com_retail_example_ANDROID.app_events_20160723]
    )
GROUP BY
  1
ORDER BY
  2 DESC

Cómo entender el esquema de Google Analytics en BigQuery

Cuando conectas Google Analytics para Firebase a BigQuery, Firebase exporta los datos a BigQuery de forma diaria, a través de los siguientes formatos:

Conjuntos de datos

Google Analytics para Firebase crea un conjunto de datos nuevo en BigQuery por cada aplicación de Firebase. El nombre del conjunto de datos tiene el siguiente formato: [app_name]_[PLATFORM], en el que app_name es el ID del paquete (iOS) o el nombre del paquete (Android).

Google Analytics convierte los puntos en guiones bajos en el ID del paquete o el nombre del paquete para que coincida con las convenciones de nombres de BigQuery. Analytics especifica el nombre de la plataforma en mayúscula, para que coincida con las convenciones de nombre de Firebase.

Por ejemplo, el conjunto de datos correspondiente a una app para iOS con el ID de paquete “com.username.myapp” daría como resultado un conjunto de datos llamado com_username_myapp_IOS.

Tablas

Cada día, Google Analytics crea una tabla nueva en el conjunto de datos de BigQuery correspondiente a la aplicación. Las tablas se nombran según el patrón app_events_YYYYMMDD y contienen los eventos registrados para el día especificado.

Filas

Cada fila dentro de una tabla corresponde a un paquete de eventos. La aplicación determina el tamaño del paquete y envía datos a través de llamadas hacia el SDK de Google Analytics para Firebase.

Columnas

Google Analytics exporta los eventos de usuario en forma de columnas, que incluyen los eventos de datos personalizados. Para ver una lista de las columnas estándar exportadas a BigQuery, visita esquema de BigQuery Export en la documentación de ayuda de Firebase.

Cómo trabajar 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:

Luego de resolver la mayor cantidad de errores posible, el desarrollador líder de Friendly Pix cree que ya puede iniciar su aplicación para compartir fotos nueva. Antes de hacerlo, quiere supervisar la cantidad de fallas por día en el último mes para asegurarse de que la búsqueda de errores haya hecho que la aplicación sea más estable en el tiempo:

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

Ejemplo 2:

Para darle la prioridad adecuada a los planes de producción, un administrador de proyectos de PineapplePlusPlus considera cómo señalar las fallas más generalizadas de su producto. Produce una consulta que otorga los datos más pertinentes:

#standardSQL
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.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:

¡El otoño es la temporada de teléfono nuevo! Un desarrollador de Planned Obsolescence, Inc. sabe que también representa la temporada de errores relacionados con el nuevo producto de la empresa. Para adelantarse a las inquietudes de compatibilidad, crea una consulta que identifica los 10 dispositivos que presentaron la mayor cantidad de fallas en la semana anterior.

#standardSQL
SELECT
  device.model,
  COUNT(DISTINCT event_id) AS number_of_crashes
FROM
  `projectId.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:

Un desarrollador de videojuegos de Mecha Hamster 2: Hammy's Revenge quiere saber qué nivel del juego presenta 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:

iOS - Objective C

[CrashlyticsKit setIntValue:3 forKey:@"current_level"];

iOS - Swift

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

Android - Java

Crashlytics.setInt("current_level", 3);

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

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

Ejemplo 5.

Un desarrollador de Mostly Okay Software tiene una aplicación en acceso anticipado. A la mayoría de sus usuarios les encanta, pero algunos 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.

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

Cómo entender el esquema de Firebase Crashlytics en BigQuery

Cuando se vincula Crashlytics con BigQuery, Firebase exporta los eventos de fallas irrecuperables y recuperables recientes, desde los dos días previos a la vinculación. Desde ese momento y hasta que inhabilites el vínculo, Firebase exportará 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 cubre el proyecto completo, incluso si tiene varias aplicaciones, pero no incluye los informes de Analytics.

Tablas

Firebase Crashlytics crea una tabla en el conjunto de datos por cada aplicación en tu proyecto, a menos que hayas inhabilitado la exportación de datos para alguna aplicación. 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.

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 recuperables y no recuperables. A fin de ver una lista de columnas exportadas a BigQuery, visita esquema de BigQuery Export de Crashlytics.

Cómo visualizar los datos exportados de Crashlytics con Data Studio

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

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.

Cómo utilizar 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 de BigQuery de Crashlytics exportado. Puedes utilizar esta muestra como una plantilla para crear con rapidez informes nuevos y visualizaciones basadas en 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 el menú desplegable Seleccionar un conjunto de datos, selecciona Crear nueva fuente de datos.
  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.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

La manera más sencilla para detener los cargos de facturación es borrar el proyecto. Ya que el proyecto de Firebase y el de Cloud Platform son el mismo, puedes borrarlos a través de Firebase o de Cloud Platform Console.

  1. In the GCP Console, go to the Projects page.

    Go to the Projects page

  2. In the project list, select the project you want to delete and click Delete delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Si no quieres borrar tu proyecto de Cloud Platform y Firebase, puedes reducir los costos si desvinculas el proyecto desde BigQuery.

¿Qué sigue?

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...