1. mtskhs

    Posted

    mtskhs
Changes in title
+スポーツ解説アプリ SpoLive における分析基盤の構築
Changes in tags
Changes in body
Source | HTML | Preview

本記事は、 日目の記事です。

これは何

  • スポーツ解説アプリ SpoLive における分析基盤構築についてのノウハウ共有
  • サーバーレスで、要件に応じて柔軟に分析できる基盤を構築した話

SpoLive について

SpoLive は、「スポーツファンとアスリートの距離を、デジタルの力で縮める」ことをビジョンに掲げた新サービスです。例えば試合中に、「なんで今のプレーが許されてるんだっけ?」「この選手どんな人だっけ?」といった気になることをすぐに解決できるのはもちろんのこと、より手軽に、より深く豊かな選手の情報に触れることができるようなアプリを目指して日々アップデートを重ねています。

本記事では、SpoLiveにおける分析基盤を構築したノウハウを述べます。構築の前提条件として下記がありました。

  • データをビジネスサイドのメンバー(SQL を書いて分析できるメンバーがいる)が柔軟に分析できる基盤を用意したい
  • 開発・運用コストはできるだけ抑えたい

分析基盤

SpoLive は、Firebaseexpo で開発をしています。
基盤構築の方針として下記の方針が考えられますが、後述の理由で2 を採用しました。

  • 1. Firebase Analytics + BigQuery
  • 2. Google Analytics + BigQuery
  • 3. 別の分析ツール(Amplitude・Mix Panel 等)

理由: Firebase を利用していたら、 Firebase Analytics を利用することが主流だと思いますが、 expo において対応できるライブラリは(自分の知る限り)なく、別の分析ツールではなくまずは世の中の知見も多くシンプルな構成から入ろうと考えたためです。

Bigqueryは、データ分析にあたってはよく用いられているサービスで、SQLで複数データを統合して集計することも用意ですし、例えば、Googleデータポータルを利用して可視化すること などができ、柔軟に分析ができます。

技術要素

前述の方針に基づき、分析基盤を構築するにあたり、下記の要素に分割できます。

アプリ =(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 へアプリの利用状況に関するデータを収集します。

// 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);
// 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では、これからも利用者の方により楽しくスポーツを楽しんでいただけるアプリを目指して日々改善中です。ぜひご利用ください。

明日は〜TODO〜