GoogleAppsScript
GoogleSpreadSheet
Mackerel

乱立するGoogleスプレッドシートから逃げるように、Mackerelのサービスメトリクスに投稿して監視してみた

みんな大好きGoogleスプレッドシート

みなさん、Googleスプレッドシートは好きですか?

私たち「あなたのマイスター」では無事、大量のGoogleスプレッドシートが増産されています!w

マスタ系のデータやテストケースとかは関係ないのですが、KPI系の数値はグラフで見たいってこともよくあって、スプレッドシートのグラフを活用しています。

しかし、定期的に入れ替わる測定項目や、大元のシートに変更があったりして混乱が起きることが・・・

はい、日常ですよね。

あなたのマイスター」ではシステムのモニタリングをMackerelで行なっています。

毎日そこは目に触れてるので、サービスのKPIトラッキングも併せて表示すれば、エンジニアたちが頻度高く見てくれるようになる! と少し心踊り、少しずつMackerelに寄せていきたいと思うようになりました。

そして、そんなGoogleスプレッドシートとめちゃくちゃ相性がいいのが、GAS(Google Apps Script)です。

以下にGASを使って、Mackerelのサービスメトリクスにデータを連携する方法を紹介します。

無題のプレゼンテーション_-_Google_スライド-2.png

Mackerelの設定を確認する

  1. オーガニゼーションページを表示する
    https://mackerel.io/orgs/{オーガニゼーション名}

  2. APIキーのタブを選択する
    yourmystar_·_yourmystar.png

  3. APIキーをコピーしておく

スプレッドシートを準備する

  1. スプレッドシートを新規作成 もちろん、もともと存在するスプレッドシートでも構いません。 例えば以下のようなスプレッドシートを準備したとします。
a b c
1 10 100
2 20 200
3 30 300
4 40 400
5 50 500
6 60 600
7 70 700
  1. シート名をコピーしておく(あとで使う) ここでは watashi-no-sheet というシート名だったと仮定します。

Google Apps Scriptを書く

  1. スプレッドシートの ツール > スクリプトエディタ を開く
    自動でエディタが開きます。
    無題のプロジェクト_と_Viber__818044151622.png

  2. コードを書く
    下記がサンプルコードです。外部APIにPOSTするところは相手がMackerelじゃなくても応用がきくと思います。例えば、SlackのIncoming WebhookとかにPOSTすれば通知なんかもできると思います。

code.js
var epoch = Date.now() / 1000; // Mackerel投稿用タイムスタンプ
var mackerelApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // MackerelのAPIキー
var mackerelServiceName = "sandbox"; // サービスメトリクスを投稿したいMackerelのサービスネーム
var sheetName = "watashi-no-sheet"; // スプレッドシートのシート名

function main() {
  var ss =SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheetByName(sheetName)
  SpreadsheetApp.setActiveSheet(sheet);

  // ここは自分の取りたいセルを選べるように、いろんな書き方があると思います
  var row = sheet.getLastRow(); // 最終行を取得
  var a = sheet.getRange(row, 1).getValue(); // 最終行の1列目(先ほどの例の7)
  var b = sheet.getRange(row, 2).getValue(); // 最終行の2列目(先ほどの例の70)
  var c = sheet.getRange(row, 3).getValue(); // 最終行の3列目(先ほどの例の700)

  var payload = [
    {"name" : "testmetrics.a", "time" : epoch, "value" : a},
    {"name" : "testmetrics.b", "time" : epoch, "value" : b},
    {"name" : "testmetrics.c", "time" : epoch, "value" : c}
  ];

  var response = post(mackerelApiKey, mackerelServiceName, payload);

}

function post(apiKey, mackerelServiceName, payload) {
  var headers = {
    "X-Api-Key" : apiKey
  };
  var options = {
    'contentType' : 'application/json',
    'method': 'POST',
    'headers': headers,
    'payload': JSON.stringify(payload),
    'muteHttpExceptions' : true
  };

  var response = UrlFetchApp.fetch('https://api.mackerelio.com/api/v0/services/'+ mackerelServiceName + '/tsdb', options);

  var json = response.getContentText();
  var data = JSON.parse(json);

  return data;
}

Google Apps Scriptを実行する

  1. 実行 > 関数を実行 > main を選択する
  2. Mackerelのサービスメトリクス表示画面を見ると、すぐにグラフが現れて数字を見ることができます。

sandbox_·_yourmystar-2.png

Google Apps Scriptのトリガーを設定する

  1. トリガーのボタンを選択する
    Qiita投稿選手権-2.png

  2. 何分ごとに動かすか設定する
    Qiita投稿選手権.png

以上で完了です。

あとは、スプレッドシートに好きな数字を入れておいて、GASの定期実行でMackerelのモニタリングが可能になります。

参考

http://www.yasuhisay.info/entry/2016/12/06/000000

https://qiita.com/chihiro/items/09c996d41d80f0d30e17

http://pineplanter.moo.jp/non-it-salaryman/2016/05/20/google-apps-script-minute-timer/

なんの苦労もなく、いろんなサービスを連携できるようになったので、本当に便利な世の中になったなあ。
個人的に初めて使うサービスだったので、そこに至った方法を丁寧に残しておきました。