Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Exportar dados do Firebase Crashlytics para o BigQuery

É possível exportar seus dados do Crashlytics para o BigQuery se quiser uma análise mais detalhada. Com ele, é possível analisar os dados usando o SQL do BigQuery, exportá-los para outro provedor de nuvem e usá-los em visualizações e painéis personalizados com o Google Data Studio.

Ativar o Big Query Export

  1. Acesse a página Integrações no Console do Firebase.
  2. No cartão BigQuery, clique em Vincular.
  3. Siga as instruções na tela para ativar o BigQuery.

Quando você vincula seu projeto ao BigQuery:

  • O Firebase configura as sincronizações diárias de seus dados do projeto do Firebase para o BigQuery.
  • Todos os apps no projeto são vinculados ao BigQuery por padrão, e todos os apps adicionados posteriormente ao projeto são vinculados automaticamente ao BigQuery. É possível gerenciar quais apps enviam dados.
  • O Firebase exporta uma cópia dos seus dados existentes para o BigQuery. Para cada app vinculado, é incluída uma tabela em lote com os dados da sincronização diária.
  • Se você ativar a exportação de streaming do Crashlytics para BigQuery, todos os apps vinculados também terão uma tabela em tempo real contendo dados sempre atualizados.

Para desativar o BigQuery Export, desvincule seu projeto no Console do Firebase.

Quais dados são exportados para o BigQuery?

Os dados do Firebase Crashlytics são exportados para um conjunto de dados do BigQuery chamado firebase_crashlytics. Por padrão, tabelas individuais serão criadas dentro do conjunto de dados do Crashlytics para cada app no seu projeto. O Firebase nomeia as tabelas com base no identificador do pacote do app, com pontos convertidos em sublinhados e um nome de plataforma anexado ao final.

Por exemplo, os dados de um app com o ID com.google.test estariam em uma tabela chamada com_google_test_ANDROID. Essa tabela em lote é atualizada uma vez por dia. Se você ativar a exportação de streaming do Crashlytics para BigQuery, os dados do Firebase Crashlytics também serão transmitidos em tempo real para com_google_test_ANDROID_REALTIME.

Cada linha em uma tabela representa um evento que ocorreu no app, incluindo erros fatais e não fatais.

Ativar a exportação de streaming do Crashlytics para o BigQuery

É possível transmitir seus dados do Crashlytics em tempo real com o BigQueryStreaming. Use esse recurso sempre que precisar de dados em tempo real, como apresentar informações em um painel ativo, assistir a um lançamento ao vivo ou monitorar problemas de aplicativos que acionam alertas e fluxos de trabalho personalizados.

A exportação de streaming do Crashlytics para o BigQuery não está disponível no sandbox do BigQuery.

Ao ativar a exportação de streaming do Crashlytics para o BigQuery, além da tabela em lote, você terá uma tabela em tempo real. Veja abaixo as diferenças entre as tabelas:

Tabela em lote Tabela em tempo real
  • Dados exportados uma vez por dia
  • Eventos armazenados de maneira durável antes da gravação em lote no BigQuery
  • Pode ser preenchido até 90 dias antes
  • Dados exportados em tempo real
  • Nenhum preenchimento disponível

A tabela em lote é ideal para análise de longo prazo e identificação de tendências ao longo do tempo, porque armazenamos eventos de maneira durável antes de gravá-los. Além disso, eles podem ser preenchidos na tabela por até 90 dias. Quando gravamos dados na sua tabela em tempo real, eles são gravados imediatamente no BigQuery e, por isso, é ideal para painéis ao vivo e alertas personalizados. Essas duas tabelas podem ser combinadas com uma consulta de agrupamento para fornecer os benefícios de ambas. Veja a consulta Exemplo 9 abaixo.

Por padrão, a tabela em tempo real tem um prazo de validade de partição de 30 dias. Para saber como modificar isso, consulte Como atualizar a expiração da partição.

Ativar o streaming do Crashlytics para BigQuery

Para ativar o streaming, navegue até a seção do Crashlytics da página integrações do BigQuery e marque a caixa de seleção Incluir streaming.

Modelo do Data Studio

Para ativar os dados em tempo real no seu modelo do Data Studio, siga as instruções em Como visualizar dados exportados do Crashlytics com o Data Studio.

Visualizações

É possível transformar as consultas de exemplo abaixo em visualizações usando a IU do BigQuery. Consulte Como criar visualizações para instruções detalhadas.

O que você pode fazer com os dados exportados?

As exportações do BigQuery contêm dados de falhas brutos, incluindo tipo de dispositivo, sistema operacional, exceções (apps Android) ou erros (apps iOS) e registros do Crashlytics, além de outros dados.

Trabalhar com dados do Firebase Crashlytics no BigQuery

Nos exemplos a seguir, mostramos consultas que podem ser executadas nos dados do Crashlytics. Essas consultas geram relatórios não disponíveis no painel do Crashlytics.

Exemplos de consultas Crashlytics

Nos exemplos abaixo, veja como gerar relatórios que agregam dados de eventos com falha em resumos mais fáceis de entender.

Exemplo 1: número de falhas por dia

Depois de trabalhar para corrigir o máximo de bugs possível, um desenvolvedor líder acredita que a equipe dele está finalmente pronta para lançar o novo app de compartilhamento de fotos. Antes disso, eles verificam o número de falhas por dia, durante o último mês, para ter certeza de que a busca por bugs tornou o app mais estável ao longo do tempo:

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;

Exemplo 2: encontrar falhas mais abrangentes

Para priorizar corretamente os planos de produção, um gerente de projetos avalia como apontar as 10 falhas mais abrangentes nos produtos da empresa. Então, eles criam uma consulta que fornece pontos de dados 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;

Exemplo 3: os 10 dispositivos que apresentam mais falhas

O outono é a temporada de lançamento de novos smartphones. Um desenvolvedor sabe que isso também significa uma nova temporada de problemas específicos de cada dispositivo. Para superar as preocupações relacionadas a compatibilidade, eles criaram uma consulta que identifica os 10 dispositivos que apresentaram mais falhas na última semana:

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;

Exemplo 4: filtrar por chave personalizada

Um desenvolvedor de jogos quer saber em qual nível o jogo apresenta mais falhas. Para ajudá-lo a rastrear essa estatística, ele configura uma chave Crashlytics current_level personalizada e a atualiza cada vez que o usuário atinge um novo nível.

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Swift

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

Java

Crashlytics.setInt("current_level", 3);

Com essa chave na respectiva exportação do BigQuery, uma consulta é gravada para registrar a distribuição dos valores de current_level associados a cada evento com falha:

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

Exemplo 5: extração de ID do usuário

Um desenvolvedor tem um app no acesso antecipado. A maioria dos usuários adorou, mas três vivenciaram uma quantidade incomum de falhas. Para encontrar a raiz do problema, ele gravou uma consulta para extrair todos os eventos com falha ocorridos com esses usuários, usando o ID do usuário correspondente:

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

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

Um desenvolvedor lançou um bug crítico para um grupo de testadores Beta. A equipe conseguiu usar a consulta do Exemplo 2 acima para identificar o ID específico da falha. Agora, eles querem executar uma consulta para extrair a lista de usuários do app que foram afetados por essa falha:

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;

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

Agora, a equipe detectou um bug crítico durante o lançamento de uma nova versão. Eles conseguiram usar a consulta do Exemplo 2 acima para identificar o ID específico da falha. A equipe agora quer ver se essa falha se espalhou para usuários em diferentes países ao redor do mundo.

Para criar essa consulta, a equipe precisará realizar estas ações:

  1. Ativar as exportações do BigQuery para o Google Analytics. Consulte Exportar dados do projeto para o BigQuery.

  2. Atualizar o app para transmitir um ID de usuário para o SDK do Google Analytics e o do Crashlytics.

    Objective-C
    CrashlyticsKit setUserIdentifier:@"123456789";
    FIRAnalytics setUserID:@"12345678 9";
    
    Swift
    Crashlytics.sharedInstance().setUserIdentifier("123456789");
    Analytics.setUserID("123456789");
    
    Java
    Crashlytics.setUserIdentifier("123456789");
    mFirebaseAnalytics.setUserId("123456789");
    
  3. Criar uma consulta que use o campo "ID do usuário" para participar de eventos no conjunto de dados do BigQuery para Google Analytics que apresentam falhas no conjunto de dados do Crashlytics para o BigQuery:

    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
    

Exemplo 8: os cinco principais problemas até agora

Exige a ativação da exportação de streaming do Crashlytics para o BigQuery

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM
  `your_project.firebase_crashlytics.package_name_ANDROID_REALTIME`
WHERE
  DATE(event_timestamp) = CURRENT_DATE()
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

Exemplo 9: cinco principais problemas desde DATE, incluindo hoje

Exige a ativação da exportação de streaming do Crashlytics para o BigQuery.

Neste exemplo, combinamos tabelas em lote e em tempo real para adicionar informações em tempo real aos dados em lote confiáveis. Como event_id é uma chave primária, podemos usar DISTINCT event_id para eliminar os eventos comuns das duas tabelas.

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM (
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `your_project.firebase_crashlytics.package_name_ANDROID_REALTIME`
  UNION ALL
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `your_project.firebase_crashlytics.package_name_ANDROID`)
WHERE
  event_timestamp >= "2020-01-13"
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

Noções básicas sobre o esquema do Firebase Crashlytics no BigQuery

Quando você vincula o Crashlytics ao BigQuery, o Firebase exporta eventos de falha recentes fatais e não fatais, incluindo aqueles que aconteceram até dois dias antes da vinculação, com a opção de preenchimento de até 90 dias.

Enquanto a vinculação estiver ativada, os eventos do Crashlytics serão exportados diariamente pelo Firebase. Após cada exportação, levará alguns minutos para que os dados estejam disponíveis no BigQuery.

Conjuntos de dados

O Firebase Crashlytics cria um novo conjunto no BigQuery para os dados do Crashlytics. O conjunto de dados abrange todo o projeto, mesmo que tenha vários apps.

Tabelas

No Firebase Crashlytics, é criada uma tabela no conjunto de dados para cada app no seu projeto, a não ser que você opte por não exportar dados para esse app. O Firebase nomeia as tabelas com base no identificador do pacote do app, com pontos convertidos em sublinhados e um nome de plataforma anexado ao final.

Por exemplo, os dados de um app para Android com o ID com.google.test estariam em uma tabela chamada com_google_test_ANDROID e os dados em tempo real (se ativados) estariam em uma tabela chamada com_google_test_ANDROID_REALTIME

As tabelas contêm um conjunto padrão de dados do Crashlytics, além de quaisquer chaves personalizadas do Crashlytics definidas pelos desenvolvedores.

Linhas

Cada linha em uma tabela representa um erro encontrado pelo app.

Colunas

As colunas em uma tabela são idênticas para erros fatais e não fatais. Se a exportação de streaming do Crashlytics para o BigQuery estiver ativada, a tabela em tempo real terá as mesmas colunas da tabela em lote. As colunas da exportação estão listadas abaixo.

Sem stack traces

Colunas presentes em linhas que representam eventos sem rastreamentos de pilha.

Nome do campo Tipo de dado Descrição
platform STRING Android ou iOS
bundle_identifier STRING O ID do pacote, como com.google.gmail
event_id STRING Um código exclusivo do evento
is_fatal BOOLEANO Se o app apresentou uma falha
issue_id STRING Um problema associado ao evento
event_timestamp TIMESTAMP Quando o evento ocorreu
device RECORD O dispositivo em que o evento ocorreu
device.manufacturer STRING O fabricante do dispositivo
device.model STRING O modelo do dispositivo
device.architecture STRING X86_32, X86_64, ARMV7, ARM64, ARMV7S ou ARMV7K
memory RECORD O status da memória do dispositivo
memory.used INT64 Bytes de memória usados
memory.free INT65 Bytes de memória restantes
storage RECORD Armazenamento permanente do dispositivo
storage.used INT64 Bytes de armazenamento usados
storage.free INT64 Bytes de armazenamento restantes
operating_system RECORD Detalhes do SO do dispositivo
operating_system.display_version STRING A versão do SO
operating_system.name STRING O nome do SO
operating_system.modification_state STRING MODIFICADO ou NÃO MODIFICADO, ou seja, se o dispositivo está com jailbreak/acesso root
application RECORD O app que gerou o evento
application.build_version STRING A versão de compilação do app
application.display_version STRING
user RECORD Opcional: informações coletadas no usuário do app
user.name STRING Opcional: o nome do usuário
user.email STRING Opcional: o endereço de e-mail do usuário
user.id STRING Opcional: um código específico do app associado ao usuário
custom_keys REGISTRO REPETIDO Pares de chave-valor definidos pelo desenvolvedor
custom_keys.key STRING Uma chave definida pelo desenvolvedor
custom_keys.value STRING Um valor definido pelo desenvolvedor
installation_uuid STRING Um código que identifica um app e uma instalação exclusivos no dispositivo
crashlytics_sdk_versions STRING A versão do SDK do Crashlytics que gerou o evento
app_orientation STRING PORTRAIT, LANDSCAPE, FACE_UP ou FACE_DOWN
device_orientation STRING PORTRAIT, LANDSCAPE, FACE_UP ou FACE_DOWN
process_state STRING BACKGROUND ou FOREGROUND
logs REGISTRO REPETIDO Mensagens de registro com um carimbo de data/hora geradas pelo registrador do Crashlytics, se ativadas
logs.timestamp TIMESTAMP Quando o registro foi feito
logs.message STRING A mensagem registrada
breadcrumbs REGISTRO REPETIDO Localização atual com carimbo de data/hora do Google Analytics, se ativado
breadcrumbs.timestamp TIMESTAMP O carimbo de data/hora associado à localização atual
breadcrumbs.name STRING O nome associado à localização atual
breadcrumbs.params REGISTRO REPETIDO Parâmetros associados à localização atual
breadcrumbs.params.key STRING Uma chave de parâmetro associada à localização atual
breadcrumbs.params.value STRING Um valor de parâmetro associado à localização atual
blame_frame RECORD O frame identificado como a causa raiz da falha ou do erro
blame_frame.line INT64 O número da linha no arquivo do frame
blame_frame.file STRING O nome do arquivo do frame
blame_frame.symbol STRING O símbolo hidratado, ou símbolo bruto, se não for hidratável
blame_frame.offset INT64 O deslocamento de byte na imagem binária que contém o código, não configurado para exceções Java
blame_frame.address INT64 O endereço na imagem binária que contém o código, não configurado para quadros Java
blame_frame.library STRING O nome de exibição da biblioteca que inclui o frame
blame_frame.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM ou SYSTEM
blame_frame.blamed BOOLEANO Se a análise do Crashlytics determinou que esse quadro é a causa da falha ou do erro
exceptions REGISTRO REPETIDO Apenas Android: exceções que ocorreram durante este evento. As exceções aninhadas são apresentadas em ordem cronológica inversa, ou seja, o último registro é a primeira exceção lançada
exceptions.type STRING O tipo de exceção, como java.lang.IllegalStateException
exceptions.exception_message STRING Uma mensagem associada à exceção
exceptions.nested BOOLEANO Verdadeiro para todas, exceto a última exceção lançada (ou seja, o primeiro registro)
exceptions.title STRING O título da thread
exceptions.subtitle STRING A legenda da thread
exceptions.blamed BOOLEANO Verdadeiro se o Crashlytics determinar que a exceção é responsável pelo erro ou pela falha
exceptions.frames REGISTRO REPETIDO Os frames associados à exceção
exceptions.frames.line INT64 O número da linha no arquivo do frame
exceptions.frames.file STRING O nome do arquivo do frame
exceptions.frames.symbol STRING O símbolo hidratado, ou símbolo bruto, se não for hidratável
exceptions.frames.offset INT64 O deslocamento de byte na imagem binária que contém o código, não configurado para exceções Java
exceptions.frames.address INT64 O endereço na imagem binária que contém o código, não configurado para quadros Java
exceptions.frames.library STRING O nome de exibição da biblioteca que inclui o frame
exceptions.frames.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM ou SYSTEM
exceptions.frames.blamed BOOLEANO Se a análise do Crashlytics determinou que esse quadro é a causa da falha ou do erro
error REGISTRO REPETIDO Apenas iOS: erros não fatais
error.queue_name STRING A fila em que a thread estava sendo executada
error.code INT64 Código de erro associado ao NSError personalizado registrado no app
error.title STRING O título da thread
error.subtitle STRING A legenda da thread
error.blamed BOOLEANO Se a análise do Crashlytics determinou que esse quadro é a causa do erro
error.frames REGISTRO REPETIDO Os frames do rastreamento de pilha
error.frames.line INT64 O número da linha no arquivo do frame
error.frames.file STRING O nome do arquivo do frame
error.frames.symbol STRING O símbolo hidratado, ou símbolo bruto, se não for hidratável
error.frames.offset INT64 O deslocamento de byte na imagem binária que contém o código
error.frames.address INT64 O endereço na imagem binária que contém o código
error.frames.library STRING O nome de exibição da biblioteca que inclui o frame
error.frames.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM ou SYSTEM
error.frames.blamed BOOLEANO Se a análise do Crashlytics determinou que esse quadro é a causa do erro
threads REGISTRO REPETIDO Threads presentes no momento em que ocorreu o evento
threads.crashed BOOLEANO Se a thread apresentou uma falha
threads.thread_name STRING O nome da thread
threads.queue_name STRING Apenas iOS: a fila em que a thread estava sendo executada
threads.signal_name STRING O nome do sinal que causou a falha do app. Presente apenas em threads nativas com falha
threads.signal_code STRING O código do sinal que causou a falha do app. Presente apenas em threads nativas com falha
threads.crash_address INT64 O endereço do sinal que causou a falha do app. Presente apenas em threads nativas com falha
threads.code INT64 Apenas iOS: código de erro do NSError registrado no app
threads.title STRING O título da thread
threads.subtitle STRING A legenda da thread
threads.blamed BOOLEANO Se a análise do Crashlytics determinou que esse quadro é a causa da falha ou do erro
threads.frames REGISTRO REPETIDO Os frames da thread
threads.frames.line INT64 O número da linha no arquivo do frame
threads.frames.file STRING O nome do arquivo do frame
threads.frames.symbol STRING O símbolo hidratado, ou bruto, se não for hidratável
threads.frames.offset INT64 O deslocamento de byte na imagem binária que contém o código
threads.frames.address INT64 O endereço na imagem binária que contém o código
threads.frames.library STRING O nome de exibição da biblioteca que inclui o frame
threads.frames.owner STRING DEVELOPER, VENDOR, RUNTIME, PLATFORM ou SYSTEM
threads.frames.blamed BOOLEANO Se a análise do Crashlytics determinou que esse quadro é a causa do erro

Visualizar dados do Crashlytics, exportados com o Data Studio

Com o Google Data Studio, você transforma os conjuntos de dados do Crashlytics no BigQuery em relatórios totalmente personalizáveis, fáceis de ler e de compartilhar.

Para saber mais sobre como usar o Data Studio, leia o Guia de início rápido.

Como usar um modelo de relatório do Crashlytics

No Data Studio, há um relatório de amostra do Crashlytics que inclui um conjunto abrangente de dimensões e métricas do esquema exportado do Crashlytics para o BigQuery. Se você ativou a exportação de streaming do Crashlytics para o BigQuery, poderá visualizar esses dados na página Tendências em tempo real do modelo do Data Studio. É possível usar a amostra como modelo para criar rapidamente novos relatórios e visualizações com base nos dados brutos de falhas do próprio app:

  1. Abra o modelo do Painel do Data Studio do Crashlytics.
  2. Clique em Usar modelo no canto superior direito.
  3. No menu suspenso Nova fonte de dados, selecione Criar nova fonte de dados.
  4. Clique em Selecionar no cartão do BigQuery.
  5. Para selecionar uma tabela com os dados do Crashlytics exportados, escolha Meus projetos > [nome-do-projeto] > firebase_crashlytics > [nome-da-tabela]. Sua tabela em lote está sempre disponível para seleção. Se a exportação de streaming do Crashlytics para o BigQuery estiver ativada, será possível selecionar sua tabela em tempo real.
  6. Em Configuração, defina o Nível do modelo Crashlytics como Padrão.
  7. Clique em Conectar para criar a nova origem de dados.
  8. Clique em Adicionar ao relatório para retornar ao modelo do Crashlytics.
  9. Para concluir, clique em Criar relatório e crie uma cópia do modelo do Painel do Data Studio do Crashlytics.