BLOGブログ

GAS(Google Apps Script)で作るサーバレスなWebアプリケーション監視ツール

遅まきながら、最近GASの便利さに感動し色々なツールを空いた時間に作成しています。

今回は簡単にWebアプリケーションの監視を行うツールを作成しましたので、もし良ければ使ってみてください。

お金をかけずにWebアプリケーションのHTTPステータスをグローバル環境から監視したい。という考えがあったので、この要件にマッチする場合は時間をかけずにそのままコピペで使っていただけると思います。

要件

作るにあたって定めた要件は以下の通りです。

 

  • 幾つかのWebアプリへHTTPステータスを送信し結果を取得
  • 毎分実行し(過去1時間分の)履歴を残す

以下に設定手順を記載します。

1. シートを作成

スプレッドシートの「シート1」を以下の画像のように設定します。

1

入力する値は以下のサンプルデータです。
「Request Data」にはGET/POSTのリクエストパラメータをJSONで設定します。
「Request Header」にはリクエストヘッダーに追記する値をJSONで設定します。

Title URL Method Request Data Request Header
テストサイト http://example.com/ GET
テストAPI http://example.com/api POST {“name1″:”value1″,”name2″:”value2”}
テスト認証 http://example.com/auth GET {“Authorization”:”Basic xxxxxxxxxx”}
 

2. 時間軸のラベル設定

次に、1分間隔で監視を行い過去60回分まで記録を残すため時間軸のラベルを「HH:mm】(時:分)の表示になるように設定します。

「F1:BN1」までの範囲を選択しメニューから
「123」→「表示形式の詳細設定」→「カスタム数値形式…」を選択します。

6

カスタム数値形式には「hh:mm」を入力し「適用」を押下します。

7

以上で、シート側の準備は完了です。

3. スクリプトエディタを作成

次に「ツール」→「スクリプトエディタ」より「コード.gs」に以下のソースコードを貼り付けます。

/**
 * 監視対象リストのシート名
 */
var TARGET_SHEET = 'シート1';

function init () {
  var ss    = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(TARGET_SHEET);
  main(sheet);
}

function main (sheet) {
  // ラベル更新
  refreshLabels(sheet);
  var start_row = 2;
  var last_row  = sheet.getLastRow();
  for (var i = start_row; i <= last_row; i++) {
    // 変更前の値
    var before = sheet.getRange('F' + i + ':' + 'BN' + i).getValues();
    // 送信情報取得
    var title   = sheet.getRange("A" + i).getValue();
    var url     = sheet.getRange("B" + i).getValue();
    var method  = sheet.getRange("C" + i).getValue();
    var params  = sheet.getRange("D" + i).getValue();
    var headers = sheet.getRange("E" + i).getValue();
    if (!title || !url || !method) continue;
    // HTTPリクエスト
    var response    = httpRequest(url, method, params, headers);
    var status_code = response.getResponseCode();
    sheet.getRange('F' + i).setValue(status_code);
    // 履歴を右に移動
    var start_col = 7; // G
    for (var j = 0; j < (before[0].length - 1); j++) {
      sheet.getRange(i, start_col).setValue(before[0][j]);
      start_col++;
    }
  }
}

function refreshLabels (sheet) {
  var before    = sheet.getRange('F1:BN1').getValues();
  var start_col = 6; // F
  var date      = new Date();
  var hour      = ('00'  + date.getHours()).slice(-2);
  var min       = ('00'  + date.getMinutes()).slice(-2);
  sheet.getRange(1, start_col).setValue(hour + ':' + min);
  start_col++;
  for (var i = 0; i < (before[0].length - 1); i++) {
    sheet.getRange(1, start_col).setValue(before[0][i]);
    start_col++;
  }
}

function httpRequest (url, method, params, headers) {
  try {
    var options = {
      method            : (method || 'get'),
      muteHttpExceptions: true
    };
    if (params)  options['payload'] = JSON.parse(params);
    if (headers) options['headers'] = JSON.parse(headers);
    return UrlFetchApp.fetch(url, options);
  }catch(e){
    return 999;
  }
}

4. スクリプトエディタを実行

設定が完了したので、対象とする関数に「init」を選択し実行ボタンを押下します。

2

すると以下のように承認を求められるので「許可を確認」を選択します。

3

このスクリプトではスプレッドシートの編集と外部へのリクエストを行うため以下の許可を行います。

4

5. 実行結果の確認

「シート1」に戻ると以下のようにリクエスト結果が登録されているはずです。

5

6. 実行結果の確認

手動による動作確認が問題無ければ
「ツール」→「スクリプトエディタ」より「現在のプロジェクトのトリガー」を選択し

10

以下のように、毎分実行するようトリガー設定を行い保存します。

9

以上の設定が終わると「シート1」の「F1:BN1」が自動的に毎分更新されHTTPステータスコードの監視を行うことが出来ます。

最後に

実際に使用しているツールはもう少し複雑になっていますが、特定のステータスコードが返った場合にメールやSlackを送信したり、履歴を残しているので以下のようにスプレッドシートのグラフを使い可視化しても良いかもしれません。

11

※ 管理対象に無いサーバへの監視は行わないようご注意ください。

関連する記事

記事を書いた人

kibe

ジムに通い肉体改造に挑むエンジニア。 主にインフラ・ビッグデータに関連する仕事を行っているためエンジニア向けの記事を投稿。 最近はFPVに興味あり。