將 Firebase Crashlytics 資料匯出至 BigQuery

您可以將 Crashlytics 資料匯出至 BigQuery 以便查詢及分析BigQuery 可讓您使用 BigQuery SQL 分析資料,並將資料匯出 並用於視覺化和自訂資訊主頁 用 Google 數據分析做研究

啟用 BigQuery Export

  1. 前往 整合 頁面。
  2. 在「BigQuery」資訊卡中,按一下「連結」
  3. 按照畫面上的指示啟用 BigQuery。

將專案連結至 BigQuery 時:

  • Firebase 會設定每天同步處理 Firebase 專案的資料 BigQuery。
  • 根據預設,專案中的所有應用程式都會連結至 BigQuery 和所有應用程式 。個人中心 可管理該傳送資料的應用程式
  • Firebase 匯出現有資料的副本 至 BigQuery。每個連結的應用程式都會產生一個批次資料表,當中含有 每日同步的資料
  • 如果啟用 Crashlytics BigQuery 串流匯出功能,所有已連結的應用程式 也有即時表格,其中包含 需要持續更新資料

如要停用 BigQuery Export 取消連結專案

哪些資料會匯出至 BigQuery?

Firebase Crashlytics 資料會匯出至名為「名稱」的 BigQuery 資料集 firebase_crashlytics。根據預設,系統會在個別資料表中建立個別資料表 可為專案中每個應用程式建立 Crashlytics 資料集。Firebase 會將 表格,格式為 底線,以及結尾附加的平台名稱。

舉例來說,ID 為 com.google.test 的應用程式資料會在表格中 com_google_test_ANDROID。這個批次資料表每天會更新一次。如果 您啟用 Crashlytics BigQuery 串流匯出、Firebase Crashlytics 資料也會即時串流至 com_google_test_ANDROID_REALTIME

表格中的每一列都代表應用程式發生的事件,包括 當機、一般錯誤和 ANR 事件

啟用 Crashlytics BigQuery 串流匯出功能

你可以透過以下項目,即時串流 Crashlytics 資料: BigQueryStreaming: 你可以使用 並用於任何需要即時資料的用途,例如在 即時資訊主頁、查看推出作業即時影像,或監控應用程式問題 觸發快訊和自訂工作流程

Crashlytics BigQuery 串流匯出功能不適用於 BigQuery 沙箱。

除了 就會擁有即時資料表以下說明 請留意資料表

批次資料表 即時資料表
  • 每天匯出一次資料
  • 事件可長期儲存,再批次寫入 BigQuery
  • 可以補充 最多 30 天前
  • 即時匯出資料
  • 沒有可用的補充作業

批次表格非常適合長期分析並找出變化趨勢 因為我們必須在寫入事件之前儲存資料,而且這些事件可以補充 資料表最多保留 30 天當我們將資料寫入即時資料表時, 立即寫入 BigQuery,因此很適合用於即時資訊主頁 自訂快訊您可以結合這兩個資料表與拼接查詢, 優點請參閱下方的「範例 9」查詢。

根據預設,即時資料表的分區到期時間為 30 天。目的地: 要瞭解如何修改這項設定,請參閱 更新分區到期時間

啟用 Crashlytics BigQuery 串流

如要啟用串流功能,請前往 BigQuery 的「Crashlytics」部分 整合 頁面,然後勾選「包含串流」核取方塊。

數據分析範本

如要在數據分析範本中啟用即時資料,請按照 請參閱「使用數據分析以視覺化方式呈現匯出的 Crashlytics 資料」一文。

檢視表

您可以使用 BigQuery UI 將下列查詢範例轉換成檢視表。詳情請見 建立檢視表

你可以如何處理匯出的資料?

BigQuery 匯出作業包含原始當機資料,包括裝置類型、作業系統、 例外狀況 (Android 應用程式) 或錯誤 (Apple 應用程式),以及 Crashlytics 記錄 視為其他資料

在 BigQuery 中使用 Firebase Crashlytics 資料

以下範例說明您可以在 Crashlytics 資料中執行的查詢。 這些查詢會產生 Crashlytics 無法提供的報表 儀表板中指定這項設定。

Crashlytics 查詢的範例

下列範例示範如何產生報表,將當機事件資料匯總至更容易理解的摘要中。

範例 1:每日當機次數

在盡可能修正錯誤後,待開發客戶開發人員認為她的團隊 終於準備好推出新的相片分享應用程式了。在使用產品前 查詢過去一個月內每天的當機次數,確認 error-bash 使應用程式隨著時間更穩定:

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;

範例 2:找出最普遍的當機事件

為了適當安排生產計畫的優先順序,專案經理會思考如何指出 瞭解產品中最常發生的 10 個當機事件會產生一項查詢 提供了相關資料點:

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;

示例 3:前 10 大當機裝置

秋天是換新手機的季節!開發人員知道這也代表新裝置了 各季別。面對即將到來的相容性問題 整理出一項查詢,找出 10 個 過去一週內的當機次數:

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;

範例 4:依自訂鍵篩選

某遊戲開發人員想知道自家遊戲體驗的哪個關卡最受歡迎 當機。為協助對方追蹤這項統計資料,他們設定了自訂 Crashlytics 鍵 current_level,並且在每次使用者達到新的關卡時更新。

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Swift

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

Java

Crashlytics.setInt("current_level", 3);

在 BigQuery Export 中使用該鍵,就能編寫查詢來回報 與每個當機事件相關的 current_level 值分佈情形:

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

範例 5:User ID 擷取

開發人員有提供搶先體驗版應用程式。大多數使用者都愛不釋手,但其中有 3 個 發生異常當機次數前往 因此會撰寫查詢,為這些使用者擷取所有當機事件 指定使用者 ID

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

範例 6:找出面臨特定當機問題的所有使用者

開發人員已向一群 Beta 版測試人員發布重大錯誤。團隊 能使用上述範例 2 中的查詢找出特定當機問題 問題 ID。現在,他們想執行查詢來擷取應用程式使用者清單 受到此當機情形影響的對象:

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;

示例 7:受到當機問題影響的使用者人數 (按國家/地區細分)

現在團隊在推出新版本時偵測到重大錯誤。 使用上述範例 2 中的查詢找出具體 當機問題 ID。團隊希望能確認這個當機問題是否蔓延到 不同國家/地區的用戶

如要撰寫這項查詢,團隊必須:

  1. 為 Google Analytics 啟用 BigQuery 匯出功能。 請參閱將專案資料匯出至 BigQuery

  2. 更新應用程式,將使用者 ID 一併傳遞至 Google Analytics SDK 以及 Crashlytics SDK

    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. 撰寫查詢,使用 User-ID 欄位彙整 Crashlytics 中有當機事件的 Google Analytics BigQuery 資料集 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
    

示例 8:目前為止的前 5 大問題

必須啟用 Crashlytics 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;

示例 9:自 DATE 至今的前 5 大問題,包括今天

必須啟用 Crashlytics BigQuery 串流匯出功能。

本例中,我們合併「批次」表格和「即時」表格 可靠的批次資料由於 event_id 是主鍵 可以使用 DISTINCT event_id 從兩個資料表中刪除重複的常見事件。

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;

瞭解 BigQuery 中的 Firebase Crashlytics 結構定義

將 Crashlytics 連結 BigQuery 後,Firebase 會匯出近期事件 (當機、一般錯誤和 ANR 次數),包括最多兩天的事件 其中含有 候補 長達 30 天

從連結開始到停用連結為止,Firebase 會匯出 Crashlytics 每日執行事件系統可能需要幾分鐘才能提供資料 。

資料集

Firebase Crashlytics 會在 BigQuery 中為 Crashlytics 建立新的資料集 資料。資料集涵蓋整個專案,即使專案包含多個應用程式亦然。

資料表

Firebase Crashlytics 會在資料集內為下列應用程式建立表格: 。Firebase 名稱 表格的格式為 底線,以及結尾附加的平台名稱。

舉例來說,ID 為 com.google.test 的 Android 應用程式資料會在 名為「com_google_test_ANDROID」的表格,而即時資料 (如果啟用) 會顯示在 在名為 com_google_test_ANDROID_REALTIME 的資料表中

資料表含有一組標準的 Crashlytics 資料,以及任何自訂的 開發人員定義的 Crashlytics 金鑰。

資料列

每個在資料表中的資料列都代表應用程式遇到的某個錯誤。

當機事件、一般錯誤和 ANR 情形表中的資料欄相同。如果 接著是啟用 Crashlytics BigQuery 串流匯出,然後查看即時資料表 會包含與批次資料表相同的欄。匯出中的資料欄 。

沒有堆疊追蹤

顯示各列的資料欄,該資料列代表不含堆疊追蹤的事件。

欄位名稱 資料類型 說明
platform STRING Apple 或 Android 應用程式
套裝組合 ID STRING 軟體包 ID,例如com.google.gmail
event_id STRING 事件的專屬 ID
is_fatal BOOLEAN 應用程式是否當機
錯誤類型 STRING 事件的錯誤類型 (FATAL、NON_FATAL、ANR)
問題 ID STRING 與事件相關的問題
子類 ID STRING 與這個事件相關聯的問題變化版本
請注意,並非所有事件都有相關聯的問題變化版本。
event_timestamp TIMESTAMP 事件發生時間
device RECORD 發生事件的裝置
device.manufacturer STRING 裝置製造商
device.model STRING 裝置型號
device.frameworkure STRING X86_32、X86_64、ARMV7、ARM64、ARMV7S 或 ARMV7K
記憶體 RECORD 裝置的記憶體狀態
Memorystore.used INT64 已使用的記憶體位元組數
記憶體用量 INT64 剩餘的記憶體位元組數
儲存空間 RECORD 裝置的永久儲存空間
storage.used INT64 已使用的儲存空間位元組數
storage.free INT64 剩餘的儲存空間位元組數
作業系統 RECORD 裝置上作業系統的詳細資料
作業系統.display_version STRING 裝置的 OS 版本
operating_system.name STRING 裝置上的 OS 名稱
作業系統.modification_state STRING 裝置是否遭到修改,例如已越獄解鎖/已啟用 Root 權限 (修改或已取消)
作業系統.type STRING 裝置上執行的作業系統類型 (例如 IOS、MACOS);僅 適用於 Apple 平台應用程式
作業系統.device_type STRING 裝置類型 (例如行動裝置、平板電腦、電視等);也稱為 「裝置類別」
調度應用程式資源 RECORD 產生事件的應用程式
app.build_version STRING 應用程式的建構版本
應用程式.display_version STRING
使用者 RECORD 選用:系統收集到應用程式使用者的資訊
user.name STRING 選填:使用者的名稱
<使用者名稱>.電子郵件地址 STRING 選填:使用者的電子郵件地址
user.id STRING 選用:與使用者相關聯的應用程式專屬 ID
自訂鍵 重複紀錄 開發人員定義的鍵/值組合
custom_keys.key STRING 開發人員定義的金鑰
custom_keys.value STRING 開發人員定義的值
安裝作業 STRING 識別專屬應用程式的 ID;裝置安裝
Crashlytics_sdk_versions STRING 產生事件的 Crashlytics SDK 版本
應用程式方向 STRING PORTRAIT、LANDSCAPE、FACE_UP 或 FACE_DOWN
裝置螢幕方向 STRING PORTRAIT、LANDSCAPE、FACE_UP 或 FACE_DOWN
process_state STRING 背景資訊
logs 重複紀錄 Crashlytics 記錄器產生的記錄訊息 (如有啟用) 並加上時間戳記
log.timestamp TIMESTAMP 記錄建立時間
記錄.message STRING 記錄的訊息
導覽標記 重複紀錄 加上時間戳記的 Google Analytics 導覽標記 (如有啟用)
breadcrumbs.timestamp TIMESTAMP 與導覽標記相關聯的時間戳記
breadcrumbs.name STRING 與導覽標記相關聯的名稱
breadcrumbs.params 重複紀錄 與導覽標記相關聯的參數
breadcrumbs.params.key STRING 與導覽標記相關聯的參數鍵
breadcrumbs.params.value STRING 與導覽標記相關聯的參數值
blame_Frame RECORD 經認定為當機或錯誤的根本原因
blame_Frame.line INT64 影格檔案的行號
blame_Frame.file STRING 框架檔案名稱
blame_frame.symbol STRING 液化符號或生氣的符號 (如無法飲水)
blame_frame.offset INT64 做為包含程式碼的二進位映像檔的位元組偏移,未設定 Java 例外狀況
blame_Frame.address INT64 二進位映像檔中的位址,含有程式碼,已針對 Java 取消設定 影格
blame_Frame.library STRING 包含框架的程式庫顯示名稱
blame_frame.owner STRING 開發人員、供應商、執行時間、平台或系統
blame_frame.blamed BOOLEAN Crashlytics 的分析結果是否指出這個影格是否為原因 當機或錯誤資訊的
例外狀況 重複紀錄 僅限 Android 裝置:這個事件期間發生的例外狀況。巢狀例外狀況 資料按時間順序由新到舊排序 (讀取:上一筆記錄為 擲回例外狀況)
Rules.type STRING 例外狀況類型,例如:java.lang.IllegalStateException
例外狀況.exception_message STRING 與例外狀況相關的訊息
Exception.nested BOOLEAN 除了最後一次的例外狀況 (例如第一筆記錄) 外,其餘所有屬性皆為 True
例外狀況.title STRING 討論串的標題
Exception.subtitle (例外狀況) STRING 討論串的副標題
Rules.blamed BOOLEAN 如果 Crashlytics 判定負責 錯誤或當機
Rules.Frames 重複紀錄 與例外狀況相關的影格
Exception.Frames.line INT64 影格檔案的行號
Rules.Frames.file STRING 框架檔案名稱
Exception.Frames.symbol STRING 液化符號或生氣的符號 (如無法飲水)
Rules.Frames.offset INT64 做為包含程式碼的二進位映像檔的位元組偏移,未設定 Java 例外狀況
Rules.Frames.address INT64 二進位映像檔中的位址,含有程式碼,已針對 Java 取消設定 影格
Exception.Frames.library STRING 包含框架的程式庫顯示名稱
Rules.Frames.owner STRING 開發人員、供應商、執行時間、平台或系統
Rules.Frames.blamed BOOLEAN Crashlytics 的分析結果是否指出這個影格是否為原因 當機或錯誤資訊的
錯誤 重複紀錄 僅限 Apple 應用程式:一般錯誤
error.queue_name STRING 執行執行緒的佇列
error.code INT64 與應用程式自訂記錄 NSError 相關聯的錯誤代碼
error.title STRING 討論串的標題
錯誤。子標題 STRING 討論串的副標題
error.blamed BOOLEAN Crashlytics 的分析結果是否指出這個影格是否為原因 錯誤
error.Frames 重複紀錄 堆疊追蹤的框架
error.Frames.line INT64 影格檔案的行號
error.Frames.file STRING 框架檔案名稱
error.Frames.symbol STRING 液化符號或生氣的符號 (如無法飲水)
error.Frames.offset INT64 做為包含程式碼的二進位圖像的位元組偏移
error.Frames.address INT64 包含程式碼的二進位映像檔中的位址
error.Frames.library STRING 包含框架的程式庫顯示名稱
error.Frames.owner STRING 開發人員、供應商、執行時間、平台或系統
error.Frames.blamed BOOLEAN Crashlytics 的分析結果是否指出這個影格是否為原因 錯誤
討論串 重複紀錄 活動進行時顯示的討論串
Thread.crashed BOOLEAN 執行緒是否當機
執行緒.thread_name STRING 討論串名稱
Thread.queue_name STRING 僅限 Apple 應用程式:執行執行緒的佇列
Thread.signal_name STRING 造成應用程式當機的信號名稱 (僅在當機時顯示) 原生執行緒
Thread.signal_code STRING 造成應用程式當機的信號程式碼。只在當機時顯示 原生執行緒
Thread.crash_address INT64 造成應用程式當機的信號位址。僅顯示 以便瞭解原生執行緒停止運作的情況
Thread.code INT64 僅限 Apple 應用程式:應用程式自訂記錄 NSError 的錯誤代碼
Thread.title STRING 討論串的標題
Thread.subtitle STRING 討論串的副標題
Thread.blamed BOOLEAN Crashlytics 的分析結果是否指出這個影格是否為原因 當機或錯誤資訊的
Thread.Frames 重複紀錄 執行緒的框架
Threads.Frames.line INT64 影格檔案的行號
Thread.Frames.file STRING 框架檔案名稱
Threads.frames.symbol STRING 脫水符號或原始符號 (如不確定性)
Thread.Frames.offset INT64 做為包含程式碼的二進位圖像的位元組偏移
Thread.Frames.address INT64 包含程式碼的二進位映像檔中的位址
Thread.Frames.library STRING 包含框架的程式庫顯示名稱
Threads.Frames.owner STRING 開發人員、公開交易、運作時間、平台或系統
Thread.Frames.blamed BOOLEAN Crashlytics 的分析結果是否指出這個影格是否為原因 錯誤
unity_metadata.unity_version STRING 在這部裝置上執行的 Unity 版本
unity_metadata.debug_build BOOLEAN 如果這是偵錯版本
unity_metadata.processor_type STRING 處理器類型
unity_metadata.processor_count INT64 處理器 (核心) 數量
unity_metadata.processor_frequency_mhz INT64 處理器頻率(以 MHz 為單位)
unity_metadata.system_memory_size_mb INT64 Mb 中的系統記憶體大小
unity_metadata.graphics_memory_size_mb INT64 圖形記憶體 (MB)
unity_metadata.graphics_device_id INT64 圖形裝置的 ID
unity_metadata.graphics_device_vendor_id INT64 圖形處理器供應商的 ID
unity_metadata.graphics_device_name STRING 圖形裝置名稱
unity_metadata.graphics_device_vendor STRING 圖形裝置的供應商
unity_metadata.graphics_device_version STRING 圖形裝置的版本
unity_metadata.graphics_device_type STRING 圖形裝置類型
unity_metadata.graphics_shader_level INT64 圖形的著色器層級
unity_metadata.graphics_render_target_count INT64 圖形算繪目標數量
unity_metadata.graphics_copy_texture_support STRING 支援 Unity API 中定義的圖像紋理複製功能
unity_metadata.graphics_max_texture_size INT64 轉譯紋理專用的大小上限
unity_metadata.screen_size_px STRING 螢幕尺寸 (以像素為單位),格式為「寬 x 高」
unity_metadata.screen_Resolution_dpi STRING 螢幕的 DPI 以浮點數表示
unity_metadata.screen_refresh_rate_hz INT64 螢幕刷新率 (以 Hz)

使用數據分析視覺化匯出的 Crashlytics 資料

Google 數據分析可讓 在 BigQuery 中將 Crashlytics 資料集轉換成易於閱讀的報告 而且可完全自訂

如要進一步瞭解如何使用數據分析,請參閱數據分析快速入門指南。 歡迎使用數據分析

使用 Crashlytics 報表範本

「數據分析」提供一個 Crashlytics 範例報表,其中包含 從匯出的 Crashlytics BigQuery 架構中取得一組維度和指標。如果 已啟用 Crashlytics BigQuery 串流匯出功能 數據分析範本的「即時趨勢」頁面中的資料,您可以使用 做為範本,方便您快速建立新的報表和圖表 存取您應用程式的原始當機資料:

  1. 開啟 Crashlytics 數據分析資訊主頁範本
  2. 按一下右上角的 [Use Template] (使用範本)
  3. 在「新資料來源」下拉式選單中,選取「建立新資料來源」
  4. 在「BigQuery」資訊卡上,按一下 [Select] (選取)
  5. 選取含有 Crashlytics 匯出資料的表格,請選擇 我的專案 > [your-project-name] >firebase_crashlytics > [your-table-name]。您隨時都能選取批次表格:如果 已啟用 Crashlytics BigQuery 串流匯出功能 即時資料表。
  6. 在「Configuration」(設定) 底下,將 [Crashlytics Template level] (Crashlytics 範本等級) 設為 [Default] (預設)
  7. 按一下 [Connect] (連結) 建立新的資料來源。
  8. 按一下 [Add to Report] (新增至報表) 傳回 Crashlytics 範本。
  9. 最後按一下「Create Report」建立 Crashlytics 副本 數據分析資訊主頁範本。