Executar consultas SQL nos dados exportados no BigQuery

Depois de exportar os dados do Crashlytics e (opcionalmente) de sessões do Firebase para o BigQuery, você pode começar a trabalhar com eles:

  • Analisar dados usando consultas SQL
    Você pode executar consultas nos seus dados do Crashlytics para gerar relatórios e resumos personalizados. Como esses tipos de relatórios personalizados não estão disponíveis no painel do Crashlytics no console do Firebase, eles podem complementar sua análise e entendimento dos dados de falha. Confira a coleção de exemplos de consultas mais adiante nesta página.

  • Combinar dados de diferentes conjuntos de dados
    Por exemplo, se você optar por exportar dados de sessões do Firebase ao configurar a exportação de dados do Crashlytics, poderá entender melhor os usuários e as sessões sem falhas (consulte exemplo de consulta). Além disso, é possível exportar dados de vários produtos do Firebase (como o Performance Monitoring) ou do Google Analytics e, em seguida, combinar e analisar esses dados no BigQuery com seus dados do Crashlytics.

  • Criar visualizações
    Usando a interface do BigQuery, é possível criar uma visualização, que é uma tabela virtual definida por uma consulta SQL. Para instruções detalhadas sobre os diferentes tipos de visualizações e como criá-las, consulte a documentação do BigQuery.

Para mais detalhes sobre o esquema do conjunto de dados, consulte Esquema do conjunto de dados para dados exportados em BigQuery.

Saiba mais sobre o SQL BigQuery

Exemplos de consultas para dados de Crashlytics

Nesta seção, apresentamos alguns exemplos de situações e consultas que demonstram como usar o SQL BigQuery com os dados exportados do Crashlytics e de sessões do Firebase.

Exemplo 1: calcular métricas sem falhas usando dados de sessões do Firebase

Na versão mais recente, você lançou uma grande reformulação do app para resolver falhas em uma jornada crítica do usuário. Você recebeu avaliações excelentes dos usuários, mas quer evidências quantitativas de que seu app está mais estável do que antes.

As métricas sem falhas podem ajudar a fornecer essas informações. Essas métricas são medidas importantes que ajudam a entender a integridade geral do app. Com os dados de sessões do Firebase e os eventos Crashlytics, é possível calcular essas métricas com uma consulta básica.

Confira exemplos de consultas para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote e ANDROID).

Usuários sem falhas de uma versão 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

Sessões sem falhas na ú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

Exemplo 2: número de falhas por dia

Depois de trabalhar para corrigir o máximo de bugs possível, você acha que sua equipe finalmente está pronta para lançar o novo app de compartilhamento de fotos. Antes de fazer isso, você quer conferir o número de falhas por dia no último mês para ter certeza de que a busca por bugs tornou o app mais estável com o tempo.

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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;

Exemplo 3: encontrar as falhas de maior impacto

Para priorizar corretamente os planos de produção, você quer encontrar as 10 falhas de maior impacto no seu app. Você cria uma consulta que fornece os pontos de dados pertinentes.

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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;

Exemplo 4: os 10 dispositivos com mais falhas

O outono é a temporada de lançamento de novos smartphones. Sua empresa sabe que isso também significa uma nova onda de problemas específicos de cada dispositivo, principalmente para Android. Para superar as preocupações de compatibilidade, você elaborou uma consulta que identifica os 10 dispositivos com mais falhas na última semana (168 horas).

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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;

Exemplo 5: filtrar por chave personalizada

Você é um desenvolvedor de jogos que quer saber em qual nível o jogo está apresentando o maior número de falhas.

Para ajudar a monitorar essa estatística, defina uma chave personalizada do Crashlytics (iOS+ | Android | Flutter | Unity ) chamada current_level e a atualize sempre que o usuário atingir um novo nível.

Swift

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

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

Com essa chave na sua exportação para o BigQuery, é possível gravar uma consulta para relatar a distribuição dos valores de current_level associados a cada evento com falha.

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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

Exemplo 6: extrair IDs de usuário

Você tem um app Android que está em acesso antecipado. A maioria dos seus usuários adorou, mas três tiveram um número incomum de falhas. Para encontrar a raiz do problema, você criou uma consulta para extrair todos os eventos com falha que ocorreram com esses usuários, usando os IDs de usuário correspondentes.

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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
 

Exemplo 7: localizar todos os usuários que enfrentam uma falha específica

Sua equipe acidentalmente lançou um bug crítico para um grupo de testadores Beta. Usando a consulta do exemplo "encontrar as falhas de maior impacto" acima, sua equipe conseguiu identificar o ID específico da falha. Agora, ela quer executar uma consulta para extrair a lista de usuários do app que foram afetados pela falha.

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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;

Exemplo 8: número de usuários afetados por uma falha discriminados por país

Sua equipe detectou um bug crítico durante o lançamento de uma nova versão. Você conseguiu usar a consulta do exemplo "encontrar as falhas de maior impacto" acima para identificar o ID específico da falha. Sua equipe agora quer ver se essa falha se espalhou para usuários em diferentes países ao redor do mundo.

Para criar essa consulta, ela precisa fazer o seguinte:

  1. Ative a exportação de dados do Google Analytics para o BigQuery. Acesse Exportar dados do projeto para o BigQuery.

  2. Atualize o app para transmitir um ID do usuário para o SDK do Google Analytics e para o SDK do 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. Crie uma consulta que use o campo ID do usuário para agrupar eventos no conjunto de dados do Google Analytics com falhas no conjunto de dados do Crashlytics.

    Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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

Exemplo 9: os cinco principais problemas até agora

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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;

Exemplo 10: cinco principais problemas desde DATE, incluindo hoje

Também é possível combinar as tabelas em lote e em tempo real com uma consulta de agrupamento para adicionar informações em tempo real aos dados confiáveis em lote. Como event_id é uma chave primária, o DISTINCT event_id pode ser usado para eliminar os eventos em comum das duas tabelas.

Este é um exemplo de consulta para um app Android. Para apps iOS, use o ID do pacote e IOS (em vez do nome do pacote 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;

A seguir