Crashlytics + Google Analytics 自動查詢 App Crash-Free Users Rate

ZhgChgLi
ZRealm Robotic Process Automation
15 min readNov 21, 2021

--

使用 Google Apps Script 透過 Google Analytics 查詢 Crashlytics 自動填入到 Google Sheet

上篇「Crashlytics + Big Query 打造更即時便利的 Crash 追蹤工具」我們將 Crashlytics 閃退紀錄 Export Raw Data 到 Big Query,並使用 Google Apps Script 自動排程查詢 Top 10 Crash & 發布訊息到 Slack Channel。

本篇接續自動化一個與 App 閃退相關的重要數據 — Crash-Free Users Rate 不受影響使用者的百分比,想必很多 App Team 都會持續追縱、紀錄此數據,以往都是傳統人工手動查詢,本篇目標是將此重複性工作自動化、也能避免人工查詢時可能貼錯數據的狀況;同之前所述,Firebase Crashlytics 沒有提供任何 API 供使用者查詢,所以我們同樣要借助將 Firebase 數據串接到其他 Google 服務,再透過該服務 API 查詢相關數據。

一開始我以為這個數據同樣能從 Big Query 查詢出來;但其實這方向完全錯誤,因為 Big Query 是 Crash 的 Raw Data,不會有沒有閃退的人的數據,因此也算不出 Crash-Free Users Rate;關於這個需求在網路上的資料不多,查詢許久才找到有人提到 Google Analytics 這個關鍵字;我知道 Firebase 的 Analytics、Event 都能串到 GA 查詢使用,但沒想到 Crash-Free Users Rate 這個數據也包含在內,翻閱了 GA 的 API 後,Bingo!

API Dimensions & Metrics

Google Analytics Data API (GA4) 提供兩個 Metrics:

  • crashAffectedUsers:受閃退影響的使用者數量
  • crashFreeUsersRate:不受閃退影響的使用者百分比(小數表示)

知道路通之後,就可以開始動手實作了!

串接 Firebase -> Google Analytics

可參考官方說明步驟設定,本篇省略。

GA4 Query Explorer Tool

開始寫 Code 之前,我們可以先用官方提供的 Web GUI Tool 來快速建造查詢條件、取得查詢結果;實驗完結果是我們想要的之後,再開始寫 Code。前

前往 >>> GA4 Query Explorer

  • 在左上方記得選到 GA4
  • 右方登入完帳號後,選擇相應的 GA Account & Property
  • Start Date、EndDate:可直接輸入日期或用特殊變數表示日期 (ysterday, today, 30daysAgo, 7daysAgo)
  • metrics:增加 crashFreeUsersRate
  • dimensions:增加 platform (設備類型 iOS/Android/Desktop...)
  • dimension filter:增加 platformstringexactiOS or Android

針對雙平台的 Crash Free Users Rate 分別查詢。

拉到最下面點擊「Make Request」查看結果,我們就能得到指定日期範圍內的 Crash-Free Users Rate。

可以回頭打開 Firebase Crashlytics 比對同樣條件數據是否相同。
這邊有發現兩邊數字可能會有微微差距(我們有一項數字差了 0.0002),原因不明,不過在可以接受的誤差範圍內;若統一都使用 GA Crash-Free Users Rate 那也不能算是誤差了。

使用 Google Apps Script 自動填入數據到 Google Sheet

再來就是自動化的部分,我們將使用 Google Apps Script 查詢 GA Crash-Free Users Rate 數據後自動填入到我們的 Google Sheet 表單;已達自動填寫、自動追蹤的目標。

假設我們的 Google Sheet 如上圖。

可以點擊 Google Sheet 上方的 Extensions -> Apps Script 建立 Google Apps Script 或是點此前網 Google Apps Script -> 左上方 新增專案即可。

進來後可以先點上方未命名專案名稱,給個專案名稱。

在左方的「Services」點「+」加上「Google Analytics Data API」。

回到剛剛的 GA4 Query Explorer 工具,在 Make Request 按鈕旁邊可以勾選「Show Request JSON」取得此條件的 Request JSON。

將此 Request JSON 轉換成 Google Apps Script 後如下:

// Remeber add Google Analytics Data API to Services, or you'll see this error: ReferenceError: AnalyticsData is not defined
// https://ga-dev-tools.web.app/ga4/query-explorer/ -> property id
const propertyId = "";
// https://docs.google.com/spreadsheets/d/googleSheetID/
const googleSheetID = "";
// Google Sheet 名稱
const googleSheetName = "App Crash-Free Users Rate";

function execute() {
Logger.log(fetchCrashFreeUsersRate())
}

function fetchCrashFreeUsersRate(platform = "iOS", startDate = "30daysAgo", endDate = "today") {
const dimensionPlatform = AnalyticsData.newDimension();
dimensionPlatform.name = "platform";

const metric = AnalyticsData.newMetric();
metric.name = "crashFreeUsersRate";

const dateRange = AnalyticsData.newDateRange();
dateRange.startDate = startDate;
dateRange.endDate = endDate;

const filterExpression = AnalyticsData.newFilterExpression();
const filter = AnalyticsData.newFilter();
filter.fieldName = "platform";
const stringFilter = AnalyticsData.newStringFilter()
stringFilter.value = platform;
stringFilter.matchType = "EXACT";
filter.stringFilter = stringFilter;
filterExpression.filter = filter;

const request = AnalyticsData.newRunReportRequest();
request.dimensions = [dimensionPlatform];
request.metrics = [metric];
request.dateRanges = dateRange;
request.dimensionFilter = filterExpression;

const report = AnalyticsData.Properties.runReport(request, "properties/" + propertyId);

return parseFloat(report.rows[0].metricValues[0].value) * 100;
}

在一開始的選擇 Property 選單中,選擇的 Property 下方的數字就是 propertyId

將以上程式碼貼到 Google Apps Script 右方程式碼區塊&上方執行方法選擇「execute」function 後可以點擊 Debug 測試看看是否能正常取得資料:

第一次執行會出現要求授權視窗:

按照步驟完成帳號授權即可。

執行成功會在下方 Log Print 出 Crash-Free Users Rate,代表查詢成功。

再來我們只要再加上自動填入 Google Sheet 就大功告成了!

完整 Code:

// Remeber add Google Analytics Data API to Services, or you'll see this error: ReferenceError: AnalyticsData is not defined

// https://ga-dev-tools.web.app/ga4/query-explorer/ -> property id
const propertyId = "";
// https://docs.google.com/spreadsheets/d/googleSheetID/
const googleSheetID = "";
// Google Sheet 名稱
const googleSheetName = "";

function execute() {
const today = new Date();
const daysAgo7 = new Date(new Date().setDate(today.getDate() - 6)); // 今天不算,所以是 -6

const spreadsheet = SpreadsheetApp.openById(googleSheetID);
const sheet = spreadsheet.getSheetByName(googleSheetName);

var rows = [];
rows[0] = Utilities.formatDate(daysAgo7, "GMT+8", "MM/dd")+"~"+Utilities.formatDate(today, "GMT+8", "MM/dd");
rows[1] = fetchCrashFreeUsersRate("iOS", Utilities.formatDate(daysAgo7, "GMT+8", "yyyy-MM-dd"), Utilities.formatDate(today, "GMT+8", "yyyy-MM-dd"));
rows[2] = fetchCrashFreeUsersRate("android", Utilities.formatDate(daysAgo7, "GMT+8", "yyyy-MM-dd"), Utilities.formatDate(today, "GMT+8", "yyyy-MM-dd"));
sheet.appendRow(rows);
}

function fetchCrashFreeUsersRate(platform = "iOS", startDate = "30daysAgo", endDate = "today") {
const dimensionPlatform = AnalyticsData.newDimension();
dimensionPlatform.name = "platform";

const metric = AnalyticsData.newMetric();
metric.name = "crashFreeUsersRate";

const dateRange = AnalyticsData.newDateRange();
dateRange.startDate = startDate;
dateRange.endDate = endDate;

const filterExpression = AnalyticsData.newFilterExpression();
const filter = AnalyticsData.newFilter();
filter.fieldName = "platform";
const stringFilter = AnalyticsData.newStringFilter()
stringFilter.value = platform;
stringFilter.matchType = "EXACT";
filter.stringFilter = stringFilter;
filterExpression.filter = filter;

const request = AnalyticsData.newRunReportRequest();
request.dimensions = [dimensionPlatform];
request.metrics = [metric];
request.dateRanges = dateRange;
request.dimensionFilter = filterExpression;

const report = AnalyticsData.Properties.runReport(request, "properties/" + propertyId);

return parseFloat(report.rows[0].metricValues[0].value) * 100;
}

再次點擊上方 Run or Debug 執行「execute」。

回到 Google Sheet,數據新增成功!

新增 Trigger 排程自動執行

選擇左方時鐘按鈕 -> 右下方「+ Add Trigger」。

  • 第一個 function 選擇「execute」
  • time based trigger 可選擇 week timer 每週追蹤&新增一次數據

設定完點擊 Save 即可。

完成

現在開始,紀錄追蹤 App Crash-Free Users Rate 數據完全自動化;不需要人工手動查詢&填入;全部交給機器自動處理!

我們只需專注在解決 App Crash 問題!

p.s. 不同於上一篇使用 Big Query 需要花錢查詢資料,此篇查詢 Crash-Free Users Rate、Google Apps Script 都是完全免費,可以放心使用。

如果想將結果同步發送到 Slack Channel 可參考上一篇文章

延伸閱讀

有任何問題及指教歡迎與我聯絡

--

--

ZhgChgLi
ZRealm Robotic Process Automation

An iOS, web, and automation developer from Taiwan 🇹🇼 who also loves sharing, traveling, and writing. https://link.zhgchg.li/