Mackerel に Google Analytics のリアルタイムユーザーを監視させる

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

KUSANAGI を使用してサイトの運用を始めたは良いものの、Mackerelでの監視項目がやはりまだわからないサーバー初心者な著者。。。
特に今回のきっかけになったサイトがオートスケールでの運用ではない為、事前の準備ができなかった場合にサーバー処理が止まってしまうことが懸念点。

そこで、Google Analytics のリアルタイムユーザーをMackerelで監視させて一定のユーザーが増えた時に通知が来るように設定します。

このあたり初心者な著者はめっちゃググりました。
いろんな手法を皆さん試されているようでとてもむずかしいものから簡単なものまでいっぱい。
でもやはりシステム寄りな方々が書かれてるだけあってフロントから入ってきた自分にはわかりづらすぎる!!!
なので良いとこ取りして作ってみました!

用意するものは以下!

  1. Google スプレッドシート
  2. Google Analyticsアカウント
  3. Mackerel APIキー

Google スプレッドシートにリアルタイムユーザーを記録していく。

GoogleスプレットシートにGoogleアナリティクスのリアルタイムアクティブユーザー数を日別シートに書き出す – hotoolong’s blog
http://hotoolong.hatenablog.com/entry/2017/02/08/015929

上記の hotoolong さんの記事を参考に1分毎にリアルタイムのアクセスを取得できるようにします。
(hotoolongさんの記事が一番わかりやすかった!)

ただ、運用を考えると1日1シートではちょっと1年後とか大変かなー、、、と思うので、 getSeet() 関数内のシートの指定を以下に変更

function getSheet() {
  if (getSheet.cache) { return getSheet.cache; }
  var toMonth = Utilities.formatDate(new Date(), "JST", "yyyy-MM");
  getSheet.cache = SpreadsheetApp.getActive().getSheetByName(toMonth);
  if (!getSheet.cache) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    ss.insertSheet(toMonth, 0);
    getSheet.cache = ss.getSheetByName(toMonth);
  }
  return getSheet.cache;
}

変更点は 変数 toDaytoMonth に変更し、シート名を yyyy-MM に変更しております。
これで1月のデータ毎にシートを作っていきます。

また、hotoolong さんの記事のとおりにスクリプトの定期実行設定を忘れずに設定しください。


取得したリアルタイムのアクセスを mackerel にサービスメトリックとして監視させる

こちらは下記の記事が参考になりました。

nasneの残量やGoogle Analyticsの情報をMackerelに監視させよう | yasuhisa’s blog
http://www.yasuhisay.info/entry/2016/12/06/000000#Google-Analyticsのユーザー数をサービスメトリックとして投稿監視

上記の参考記事では Google Spreadsheetアドオン Google Analytics を使用しての作業を行っていますが、
今回は先述の項目でAPIを使用して別途リアルタイムユーザーを取得しているため一部ソースだけ拝借いたします。

完成コード

var view_id = 'YOUR_ANALYTICS_VIEW_ID';
var mackerelApiKey = 'YOUR_MACKEREL_API_KEY';
var serviceName = 'YOUR_SERVICE_NAME';

// 日付シートを取得なければ作る
function getSheet() {
  if (getSheet.cache) { return getSheet.cache; }
  var toMonth = Utilities.formatDate(new Date(), 'JST', 'yyyy-MM');
  getSheet.cache = SpreadsheetApp.getActive().getSheetByName(toMonth);
  if (!getSheet.cache) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    ss.insertSheet(toMonth, 0);
    getSheet.cache = ss.getSheetByName(toMonth);
  }
  return getSheet.cache;
}

// Mackerel へデータを送信する
function postMackerelServiceMetric(apiKey, serviceName, payload) {
  return UrlFetchApp.fetch(
    'https://mackerel.io/api/v0/services/' + serviceName + '/tsdb',
    {
    'contentType' : 'application/json',
    'method' : 'post',
    'headers' : {
      'X-Api-Key' : apiKey
    },
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions' : true
    }
  );
}

function gaRTuser() {
  var activeUserCount = Analytics.Data.Realtime.get('ga:' + view_id, 'rt:activeUsers').getRows() || 0;
  var yyyymmddhhmmss = Utilities.formatDate(new Date(), 'JST', ' yyyy/MM/dd HH:mm:ss ');
  var sheet = getSheet();
  var last = sheet.getLastRow();
  var epoch = Date.now() / 1000;
  // 最後の行の次に出力
  sheet.getRange(last + 1, 1).setValue(yyyymmddhhmmss);
  sheet.getRange(last + 1, 2).setValue(activeUserCount);
  
  // Mackerel用にobjectを整形
  var payload = [
    {
      'name' : 'analytics.rt.users',
      'time' : epoch,
      'value' : Number(activeUserCount[0][0])}
  ];
  // Mackerelへプッシュ
  postMackerelServiceMetric(mackerelApiKey, serviceName, payload);
}

主な追加点

  1. postMackerelServiceMetric() を拝借。
  2. gaRTuser() 内に Mackerel用にobjectを整形してプッシュする指定を追加する

この2の objectを整形 する部分で activeUserCount と先にユーザー数をしているのでそのまま変数を追加したらよいかと思いきや、この変数内には配列でデータが入っているので、ちゃんと指定箇所まで値を指定しないとサービスメトリックで数値を正常に受け取ってくれません。

こちらのコードで取得完了です。
あとはMackerelで監視ルールを追加して一定以上のアクセスがあった場合に通知するようにしましょう〜!

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

SNSでもご購読できます。