Google Analyticsのリアルタイムレポートを利用してアクセス急増を監視

プログラミング

Google Analyticsのリアルタイムレポート機能とGoogle Apps Scriptを使用して簡単に簡易サーバ監視を作成できたのでその手順を記録しておきます。

機能

  1. 15分おきにリアルタイムのユーザー数を取得
  2. 設定してある閾値よりも大きい場合にslackへ通知

手順

Slackに通知用のチャネルを追加

例:#alert

Slackに着信Webフックアプリを追加する

  1. 「incomming web hook」で検索して着信Webフックを選択
  2. 「設定を追加」を押下
  3. 追加した通知用チャネルを選択した状態で追加ボタンを押下

Webhook URLを使用します。

Google Apps Scriptにプログラムを記述

Apps Script – Google Apps Script
  1. 適当にプロジェクトを作成します。
  2. プロパティを設定します。
    1. 「ファイル」→「プロジェクトのプロパティ」を選択します。
    2. スクリプトのプロパティに設定を追加します。
      プロパティ
      ID Google AnalyticsのビューID

      (例:123456789)

      THRESHOLD 閾値(例:50)
      COLOR 色(例:#D00)
      TITLE_LINK タイトルリンク

      (google analyticsのリンクを指定しておくと便利)

      URL 上で取得したWebhook URL
    3. 保存を押下
  3. 以下のプログラムを追加します。
    function run() {
      notify(getUserNumber());
    }
    
    function getUserNumber() {
      var ID = PropertiesService.getScriptProperties().getProperty("ID");
      var rows = Analytics.Data.Realtime.get('ga:' + ID, 'rt:activeUsers').getRows();
      if (rows === undefined) return 0;
      return rows[0][0];
    }
    
    function notify(number) {
      var THRESHOLD = PropertiesService.getScriptProperties().getProperty("THRESHOLD");
      if (number > THRESHOLD) {
        slack(getTitle(number, THRESHOLD), getMessage(number, THRESHOLD));
      }
    }
    
    function getTitle(number, threshold) {
      return "リアルタイムユーザー数が閾値を超えています";
    }
    
    function getMessage(number, threshold) {
      return "ユーザー数:" + number + "\n閾値:" + threshold;
    }
    
    function createPayload(title, message) {
      var COLOR = PropertiesService.getScriptProperties().getProperty("COLOR");
      var TITLE_LINK = PropertiesService.getScriptProperties().getProperty("TITLE_LINK");
      return JSON.stringify({
        attachments: [{
          fallback: title,
          pretext: title,
          color: COLOR,
          title: "アクセスアラート",
          title_link: TITLE_LINK,
          text: message
        }]
      });
    }
    
    function slack(payload) {
      var URL = PropertiesService.getScriptProperties().getProperty("URL");
      UrlFetchApp.fetch(URL, {
        method: "POST",
        payload: createPayload(title, message)
      });
    }
    
  4. トリガーを設定します。
    1. 設定ボタンを押下
    2. 15分ごとのトリガーを設定
    3. 保存を押下

動作

これまでの手順で設定は終わりです。

15分ごとのチェック時にリアルタイムユーザー数が閾値を超えていると以下のようなメッセージがslackに届くはずです。

まとめ

今回は閾値を超えた場合に通知を送る設定にしましたが、逆に少なすぎる場合も設定することも簡単にできそうです。

外部サーバやサービスを用意するのが面倒な場合はこれで十分だと思います。

コメント