はてなが作った監視ツールでMackerelというのがあり、値段もお手頃で自動監視を行うにはピッタリです。
以前は監視を仕掛けて、Slackに飛ばしていたのですが、当社ではGoogle chat spaceを使っているのでそちらでも投稿できるようにしてみました。あまり他にこういった記事がないので使っている人にはお役に立つかもしれません。
仕組み
Mackerelで上がったアラートをGASでGoogle chat spaceに投稿できるフォーマットに修正して投稿する。
Mackerel登録
サイトからアカウント登録
メールで認証
監視対象ホストの登録
ホストにエージェントをインストール
アラートのメトリクス設定
Google Chat Spaceの設定
※Google Workspace課金している人のみ
Spaceの作成
アプリと統合からWebhookの設定
GASでAPI作成
// APIにしてPOSTで受ける形式にする場合は必ずdoPostという関数にする必要あり
function doPost(e) {
// JSONをパース
if (e == null || e.postData == null || e.postData.contents == null) {
return;
}
var requestJSON = e.postData.contents;
var requestObj = JSON.parse(requestJSON);
//GoogleChatで設定したWebhookのURLを設定
const WEBHOOK_URL = "(Webhookのアドレス)";
// 監視名称に”%”という文字を含む場合はメトリクスアラート、それ以外は外形監視アラート
if (requestObj["alert"]["monitorName"].indexOf('%') > 0){
// メトリクス
var orgName = requestObj["orgName"];
var event = requestObj["event"];
var imageUrl = requestObj["imageUrl"];
var host = requestObj["host"]['name'];
var host_url = requestObj["host"]['url'];
var metricLabel = requestObj["alert"]['metricLabel'];
var metricValue = requestObj["alert"]['metricValue'] ?? '-';
var isOpen = requestObj["alert"]['isOpen'];
var status = requestObj["alert"]['status'];
var alert_url = requestObj["alert"]['url'];
//メッセージを作成
var msg = '【Mackerel Alert】\n';
msg += 'orgName: '+orgName+'\n';
msg += 'event: '+event+'\n';
msg += 'host: '+host+'\n'
msg += 'metricLabel: '+metricLabel+'\n';
msg += 'metricValue: '+metricValue+'\n';
msg += 'isOpen: '+isOpen+'\n';
msg += 'status: '+status+'\n';
msg += 'imageUrl: '+imageUrl+'\n';
msg += 'alert_url: '+alert_url+'\n';
msg += 'host_url: '+host_url+'\n';
}else{
// 外形監視
var orgName = requestObj["orgName"];
var monitorName = requestObj["alert"]['monitorName'];
var memo = requestObj["memo"];
var isOpen = requestObj["alert"]['isOpen'];
var status = requestObj["alert"]['status'];
//メッセージを作成
var msg = '【Mackerel Alert】\n';
msg += 'orgName: '+orgName+'\n';
msg += 'monitorName: '+monitorName+'\n';
msg += 'isOpen: '+isOpen+'\n';
msg += 'status: '+status+'\n';
msg += 'memo: '+memo+'\n';
}
//メッセージを連想配列に格納
var message = {
'text' : msg
};
//HTTPリクエストのパラメータを設定
var options = {
'payload' : JSON.stringify(message),
'myamethod' : 'POST',
'contentType' : 'application/json'
};
//Google Chatへ投稿(WebhookURLへHTTP POSTを実行)
var response = UrlFetchApp.fetch(WEBHOOK_URL,options);
}
デプロイ
外部アクセス可能な設定でデプロイ
デプロイIDとウェブアプリをコピーして控える
引き続きMackerelの設定
通知チャンネルにWebhookを追加
上記のウェブアプリURLをここに入力。通知するイベントも必要なものにONしておく。
他にも必要なメトリクス、外形監視あれば設定
どうテスト?
Apache Benchとかで負荷かけてもいいのですが、簡単にメトリクスのしきい値下げてみるのでいい気がします。
投稿イメージ
最後に
いかがでしょうか?一応安全のためにメールでも通知するようにしておりますが、ここまでやっておけば自動監視もなんとかできるのではないでしょうか?この仕組みを使って初動を早めることができればと思っております。