SODA Engineering Blog
⚠️

Firebase Crashlytics のレポートをSlackに自動通知する

2023/08/22に公開

これは何?

Firebase Console 上では Firebase Crashlytics の指定した期間のレポートを閲覧することができます。ただ、ログインし Console まで見にいく手間があったり、Slack 連携の機能は提供されているのですが、レポートを Slack 毎日通知してくれる機能はないです。
そこで、お手製で BigQuery と Google Apps Script で Slack へのレポート通知を実現しました。
この記事ではその手法を紹介します。


Slackへの通知画像

Firebase Crashlytics とは

Firebase Crashlytics は軽量なリアルタイムのクラッシュ レポートツールで、アプリの品質を低下させる安定性の問題を追跡し、優先順位を付け、修正するのに役立ちます。Crashlytics を使用すると、クラッシュをインテリジェントにグループ化し、クラッシュにつながった状況をあぶり出すことによって、トラブルシューティングの時間を節約できます。

特定のクラッシュが多くのユーザーに影響を与えるかどうかを調べたり、問題の重大度が急激に増した場合にアラートを受け取ったりできるほか、コード内でクラッシュの原因となっている行を特定することもできます。

https://firebase.google.com/docs/crashlytics?hl=ja

自動通知がどう役に立つか

Firebase Crashlytics のレポートは毎日閲覧するべきですが、モバイルアプリの開発をしないなど権限がない人が一定数いたり、権限があっても Firebase Console を開き確認することを忘れてしまうことがあります。
そこで、Firebase Console 上で閲覧できる Firebase Crashlytics のダッシュボードと同等のものを Slack に通知をすることで、アプリのクラッシュ状況を効率的に監視したいと考えました。


Firebase Console のダッシュボード画面

やったこと

クラッシュレポートのSlack通知の実現方法を以下に示します。

  1. Firebase Crashlytics データを BigQuery にエクスポートする
  2. Google Apps Script で BigQuery のデータを集計し Slack 通知

以下、それぞれのステップの詳細を説明します。

Firebase Crashlytics データを BigQuery にエクスポートする

公式のドキュメントが出ているので以下の手順でデータをエクスポートできます。

https://firebase.google.com/docs/crashlytics/bigquery-export?hl=ja

Google Apps Script で BigQuery のデータを集計し Slack 通知

データの取得

BigQuery にクエリーを実行するエンドポイントが用意されているので、こちらに自分のプロジェクトID や取得したいクエリを指定してデータを取得します。

https://cloud.google.com/bigquery/docs/reference/rest#rest-resource:-v2.jobs

今回は日付ごとにグルーピングしてクラッシュ数、非重大なエラー数の取得をするクエリを用意してデータの取得をしました。

SELECT
  DATE(event_timestamp, 'Asia/Tokyo') AS time,
  COUNTIF(error_type = 'NON_FATAL') as non_fatal_count,
  COUNTIF(error_type = 'FATAL') as fatal_count
FROM
  table_name -- 取得したいテーブル名
WHERE
  event_timestamp >= TIMESTAMP_ADD(TIMESTAMP(CURRENT_DATE('Asia/Tokyo')), INTERVAL -7 DAY)
GROUP BY
  time
ORDER BY
  time
;

レポート画像生成

取得したデータを元にレポート画像の生成を行います。
まずは以下画像のようなシートとグラフを用意します。


設定をしたスプレッドシート

Google Apps Script 上で BigQuery から取得したデータで表のデータを上書きするとレポート通知したいグラフに更新することができます。

// var result = BigQuery からの取得結果を [日付, 非重大数, クラッシュ数] という形式で保持

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("シート");
sheet.clearContents();
sheet.appendRow(["日付", "非重大", "クラッシュ"]);
result.rows.forEach(function(row) {
  sheet.appendRow([row.f[0].v, row.f[1].v, row.f[2].v]);
});

Slack への通知

Google Apps Script から画像を取得し、通知したいチャンネルを指定して通知をすることができます。

function notifySlack(config, sheetName, filename, isAlert) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート");

  var charts = sheet.getCharts();
  var chartImage = charts[0].getBlob().getAs('image/png').setName("graph.png");
  var url        = 'https://slack.com/api/files.upload';

  var payload = {
    'token'            : 'xxxx',
    'channels'         : '通知したいチャンネル',
    'file'             : chartImage,
    'filename'         : filename,
  };

  var params = {
    'method'  : 'post',
    'payload' : payload
  };  
  var response = UrlFetchApp.fetch(url, params);
}

細かい設定は Slack のドキュメントを参照ください。

まとめ

今回の設定を行うことで毎日自動でクラッシュレポートが Slack に通知することができるようになりました!
このレポートによりリリース後に気がついた不具合もあり品質の向上につながっています。

現状の課題としては、レポートへのラグがあり Firebase Console を見にいく方が早いですが今後も改善してより効率的にモバイルアプリの監視をできるようにしていきたいと考えています。

最後に

▼下記ではより詳しく弊社のプロダクト開発組織について紹介してますので 是非ご覧ください!

https://recruit.soda-inc.jp/engineer

またSODAでは特にエンジニアを積極的に採用しておりますので
少しでも弊社に興味を持っていただけましたらご応募お持ちしております!

▼詳しい会社情報はこちらから

https://recruit.soda-inc.jp/

SODA Engineering Blog
SODA Engineering Blog

Discussion