Yak shaving logs


My life is just yak shaving.

GoogleAnalyticsのリアルタイムユーザーがある一定数を下回ったらSlackにアラートを飛ばしてみる

2017/06/27 #google-apps-script #google-analytics #slack

By Yusuke Takita


こんにちは。Takitaです。

2017/07/25 更新
不具合を修正してコードを最新のものにしました。
最下部の更新履歴を確認してください。


15分毎にGoogleAnalyticsのリアルタイムユーザーを取得して、
リアルタイムユーザーがある一定数を下回っていた場合にSlackに通知する、
ということをやってみました。

15分毎にGoogleAnalyticsのリアルタイムユーザーを取得して、
リアルタイムユーザーがある一定数を下回っていた場合にSlackに通知してみます。

https://gyazo.com/08f1c337dd0e3a3bc5aedd5e42b23926

ユーザー数は隠していますが、通知はこんな感じです。

当初はGoogleのAPIを利用して実現しようかなと思っていたのですが、
Google Apps Scriptを利用すれば簡単に、しかも楽に実装できました。

スプレッドシートのツール>スクリプトエディタからGoogle Apps Scriptを起動します。

https://gyazo.com/fe78817751aaf6fc16e085834c25ec6b

Google Apps Scriptを起動するとエディタが表示されるので、このエディタ上でコーディングしていきます。

https://gyazo.com/4daf63db343563c0adf1ceb38b7f928a

任意のタイトルを設定した後で、リソース>Googleの拡張機能からAnalyticsを有効にします。

https://gyazo.com/86d46be6cbbea69fbe4949dbc7ede063

https://gyazo.com/5a9cef9b14af0b2f388ac3777a8d5d55

これらのサービスを Google API コンソールでも有効にする必要があります。

と注意書きがあるように上記の「Google API コンソール」のリンク先でも有効にしてください。
これで準備が整ったので、まず以下のコードを貼り付けます。

function execute() {
  var realTimeUserNumber = getRealTimeUserNumber()

  if (invalidRealTimeUserNumber(realTimeUserNumber))
    return

  slack('現在のユーザー数: ' + realTimeUserNumber);
}

function invalidRealTimeUserNumber(realTimeUserNumber) {
  const MINIMUM_USER_NUM_EACH_HOUR = {
     0: x,
     1: x,
     2: x,
     3: x,
     4: x,
     5: x,
     6: x,
     7: x,
     8: x,
     9: x,
    10: x,
    11: x,
    12: x,
    13: x,
    14: x,
    15: x,
    16: x,
    17: x,
    18: x,
    19: x,
    20: x,
    21: x,
    22: x,
    23: x,
    24: x
  };

  const RATIO = 0.7
  const CURRENT_HOUR = Utilities.formatDate(new Date(), "JST", "HH");  

  for(var hour in MINIMUM_USER_NUM_EACH_HOUR)
    if (hour == CURRENT_HOUR)
      Logger.log(MINIMUM_USER_NUM_EACH_HOUR[hour] * RATIO);
      return realTimeUserNumber > (MINIMUM_USER_NUM_EACH_HOUR[hour] * RATIO)

  slack('バグってます。 CURRENT_HOUR: ' + CURRENT_HOUR + ' realTimeUserNumber: ' + realTimeUserNumber + ' RATIO: ' + RATIO)
  return false;
}

function getRealTimeUserNumber() {
    return Analytics.Data.Realtime.get('ga:xxxxxx', 'rt:activeUsers').getRows();    
}

function slack(message) {
    const WebhookUrl = 'https://hooks.slack.com/services/hoge/piyo/fuga'

    var payload = {
      text: message,
      link_names: 1
    };

    UrlFetchApp.fetch(WebhookUrl, {
      method: "POST",
      payload: JSON.stringify(payload)
    });
}

個別に修正が必要な3箇所について解説していきます。

Analytics.Data.Realtime.get('ga:xxxxxx', 'rt:activeUsers').getRows();

ga:xxxxx にはGoogleAnalyticsのビューIDをセットします。
ビューIDはAnalyticsで確認できます。

https://gyazo.com/f557d1552eb9ca96f0d421f394cc7421

const MINIMUM_USER_NUM_EACH_HOUR = { ...x にユーザー数を入れてください。
invalidRealTimeUserNumberrealTimeUserNumber > (MINIMUM_USER_NUM_EACH_HOUR[hour] * RATIO) のようにしているので、 x に入れたユーザー数より3割少ないとslackに通知するようになっています。

const WebhookUrl = 'https://hooks.slack.com/services/hoge/piyo/fuga' の右辺は通知するSlackのwebhookのURLに変更します。
https://team-name.slack.com/apps でIncoming WebHooksを検索して、Add Configurationをクリックすると、どのチャンネルにintegrationsするか聞かれるのでチャンネルを選択すればwebhookのURLが発行されます。

https://gyazo.com/3aadaa8779b0427035c807404e1c4e63

最後に15分毎にこのスクリプトが実行されるように設定します。

https://gyazo.com/9b58de8cfdc81ab33d4c3bb57fef8502

参考にしたURL

http://blog.admage.jp/?p=1353
https://www.tam-tam.co.jp/tipsnote/javascript/post8499.html
https://api.slack.com/apps/A5VKERT4P/incoming-webhooks
http://www.devlog.atlas.jp/2016/11/18/1364
https://memordm.com/gas-log/

更新履歴

以下の対応をしたのでコードを更新しました。

  • リアルタイムユーザーがある一定数を下回っていないのに通知が飛んでしまう不具合を修正
  • 通知する条件(リアルタイムユーザー数 < ユーザー数閾値)のユーザー数閾値を通知内容に含める

また、コードの履歴管理が面倒なのでgistにしました。

このエントリーをはてなブックマークに追加

categories


最新記事


tags