Mackerelを入れてGoogle chat spaceに通知するまで

はてなが作った監視ツールでMackerelというのがあり、値段もお手頃で自動監視を行うにはピッタリです。
以前は監視を仕掛けて、Slackに飛ばしていたのですが、当社ではGoogle chat spaceを使っているのでそちらでも投稿できるようにしてみました。あまり他にこういった記事がないので使っている人にはお役に立つかもしれません。

## 仕組み
Mackerelで上がったアラートをGASでGoogle chat spaceに投稿できるフォーマットに修正して投稿する。

## Mackerel登録
### サイトからアカウント登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/f1307033-d4e6-cc84-0e18-9eb5356f71d7.png)

### メールで認証
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/6a570f98-2aea-256e-e49e-4780e0ae9f30.png)

### 監視対象ホストの登録
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/a1d5036f-68ba-f0af-8a95-76a4fd7270d6.png)

### ホストにエージェントをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/f004b8e4-903f-4026-2e62-348d92b998e7.png)

こちらで登録を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/4603b5fd-2ab4-cd0d-cca2-e001fae7b18d.png)

### アラートのメトリクス設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/fdd67e8f-9189-3d03-e031-f7b7ed40be28.png)

## Google Chat Spaceの設定
※Google Workspace課金している人のみ
### Spaceの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/4a46773b-8317-5e79-fa72-e199a1c7e41c.png)
### アプリと統合からWebhookの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/8e40e6f2-8fdf-fc7b-a70b-0662fab9487b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/3531b8b7-9dd3-e1e4-fb2f-9afef951449e.png)
こうして作成した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);
}
```

### デプロイ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/cb447b38-1416-27de-1629-b410d6b5bda3.png)

### 外部アクセス可能な設定でデプロイ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/e8cb2417-f73c-d59e-0d72-2a5bba41e81e.png)

### デプロイIDとウェブアプリをコピーして控える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/98e3c02c-a0c1-e0a6-6038-907b8d202e9f.png)
ここのウェブアプリのURLがAPIになります。

## 引き続きMackerelの設定
### 通知チャンネルにWebhookを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/cc5c1c29-66e7-3db0-fa23-2e5563a6f4f3.png)

上記のウェブアプリURLをここに入力。通知するイベントも必要なものにONしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/932923e6-2a33-c9fe-fa6d-548625e993d9.png)

### 他にも必要なメトリクス、外形監視あれば設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/1ab0ae6a-c6e6-ccb4-ffe1-06918ca31e04.png)

### どうテスト？
Apache Benchとかで負荷かけてもいいのですが、簡単にメトリクスのしきい値下げてみるのでいい気がします。

### 投稿イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1593/bb559b01-e0eb-0830-ce5f-4d60bb5bca16.png)

## 最後に
いかがでしょうか？一応安全のためにメールでも通知するようにしておりますが、ここまでやっておけば自動監視もなんとかできるのではないでしょうか？この仕組みを使って初動を早めることができればと思っております。