1. mtskhs

    Posted

    mtskhs
Changes in title
+スポーツ解説アプリ SpoLive における分析基盤の構築
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,164 @@
+本記事は、 日目の記事です。
+
+## これは何
+
+- スポーツ解説アプリ [SpoLive](https://spo.live/) における分析基盤構築についてのノウハウ共有
+- サーバーレスで、要件に応じて柔軟に分析できる基盤を構築した話
+
+## SpoLive について
+
+[SpoLive](https://spo.live/) は、「スポーツファンとアスリートの距離を、デジタルの力で縮める」ことをビジョンに掲げた新サービスです。例えば試合中に、「なんで今のプレーが許されてるんだっけ?」「この選手どんな人だっけ?」といった気になることをすぐに解決できるのはもちろんのこと、より手軽に、より深く豊かな選手の情報に触れることができるようなアプリを目指して日々アップデートを重ねています。
+
+本記事では、SpoLiveにおける分析基盤を構築したノウハウを述べます。構築の前提条件として下記がありました。
+
+- データをビジネスサイドのメンバー(SQL を書いて分析できるメンバーがいる)が柔軟に分析できる基盤を用意したい
+- 開発・運用コストはできるだけ抑えたい
+
+### 分析基盤
+
+SpoLive は、`Firebase` と `expo` で開発をしています。
+基盤構築の方針として下記の方針が考えられますが、後述の理由で`2` を採用しました。
+
+- 1. Firebase Analytics + BigQuery
+- 2. Google Analytics + BigQuery
+- 3. 別の分析ツール(Amplitude・Mix Panel 等)
+
+理由: Firebase を利用していたら、 `Firebase Analytics` を利用することが主流だと思いますが、 `expo` において対応できるライブラリは(自分の知る限り)なく、別の分析ツールではなくまずは世の中の知見も多くシンプルな構成から入ろうと考えたためです。
+
+Bigqueryは、データ分析にあたってはよく用いられているサービスで、SQLで複数データを統合して集計することも用意ですし、例えば、[Googleデータポータルを利用して可視化すること](https://cloud.google.com/bigquery/docs/visualize-data-studio?hl=ja) などができ、柔軟に分析ができます。
+
+
+
+## 技術要素
+
+前述の方針に基づき、分析基盤を構築するにあたり、下記の要素に分割できます。
+
+```
+アプリ =(1)=> Google Analytics =(2)=|
+                     |
+            Firebase =(3)==> BigQyery
+```
+
+
+上記のうち、(2)(3)のGoogle Analytics/FirebaseからBigqueryへ転送するタスクは、Node.jsで実装し、CloudFunctions の 定期ジョブ としてデプロイします。
+
+理由として、BigQuery のNode.js SDKが世の中に知見が溜まっていそうな点、expo(ReactNative)と技術要素をjsで揃えることによる、メンバーのメンテしやすさの点がありました。また、後述する通り、CloudFunctionsの定期ジョブは、コードだけでスケジューリング可能で、コンソールで手動で設定・・といった必要がなく、変更管理のしやすさを感じています。
+
+
+### (1)アプリ から Google Analytics
+
+ライブラリ `expo-analytics` を利用して、アプリから GoogleNAalytics へアプリの利用状況に関するデータを収集します。
+
+
+```js
+// analitics.js
+
+import { Analytics as GoogleAnalytics, ScreenHit, Event } from "expo-analytics";
+
+class Analytics {
+ constructor(code = null) {
+ this.ga = null;
+ this.code = code;
+ }
+
+ init = () => {
+ this.ga = new GoogleAnalytics(this.code);
+ };
+
+ EventHit = (category = null, action = null, label = null, value = 0) => {
+ if (category && action) {
+ const params = [category, action];
+ if (label) {
+ params[2] = label;
+
+ if (value >= 0) {
+ params[3] = value;
+ }
+ }
+ this.ga.event(new Event(...params));
+ }
+ };
+}
+
+export default new Analytics(gaId);
+```
+
+
+```js
+// someview.js
+
+import Analytics from "app/src/libs/analytics";
+
+ Analytics.EventHit(
+ "categoryName",
+ "actionName",
+ "labelName",
+ );
+
+```
+
+### 転送タスクのデプロイ・自動起動
+
+前述のとおり、(2)(3)のGoogle Analytics/FirebaseからBigqueryへ転送するタスクは、Node.jsで実装し、CloudFunctions の 定期ジョブ としてデプロイします。
+
+```
+# ディレクトリ構成
+functions/src/index.ts
+ |
+ |--- modules/
+ |
+ |--- transferBigquery.ts
+```
+
+
+```Node.js
+
+
+import * as functions from "firebase-functions";
+import { transferBigquery } from "./modules/transferBigquery";
+
+
+// bigqueryへの定期エクスポート
+module.exports.transferBigquery = functions
+ .region("asia-northeast1")
+ .runWith({
+ timeoutSeconds: 9 * 60, // max: 9min
+ memory: "1GB"
+ })
+ .pubsub.schedule("0 4 * * *")
+ .timeZone("Asia/Tokyo")
+ .onRun(transferBigquery);
+
+```
+
+
+### (2)Google Analytics から BigQuery
+
+GoogleAnalytics の Node.js向け SDKを利用します。
+
+query は metrics / dimension をみるとよいです
+- サンプルコードは下記
+
+
+また、API利用時の認証情報
+~~しておくと、ローカルでも環境変数を利用できます
+
+```Node.js
+
+```
+
+
+### (3)Firebase から BigQuery
+
+ Bigqurey の Node.js向け SDK
+ データ追加処理毎に課金されるので、データを改行区切り JSON に出力してインポートさせている
+
+ - サンプルコードは下記
+
+## 最後に
+
+本記事では、Firebase / Cloud Functins / BigQuery などのクラウド基盤上に、サーバーレスでユーザー分析基盤を構築するノウハウについて述べました。
+
+スポーツ解説アプリ[SpoLive](https://spo.live/)では、これからも利用者の方により楽しくスポーツを楽しんでいただけるアプリを目指して日々改善中です。ぜひご利用ください。
+
+明日は〜TODO〜