OpsGenieとMonitを連携してプロセスの死活監視してみた
OpsGenieとMonitを連携してプロセスの死活監視してみたので、設定方法のメモを残しておきます。
このエントリではnginx上にhealthcheck用のファイルを配置して、そのファイルをhttp経由で取得出来るかどうかをmonitでチェックして、そのチェック結果をOpsGenieに送ってみることにします。
OpsGenie: https://www.opsgenie.com/
Monit: https://mmonit.com/monit/
公式のドキュメントではメール連携の方法が紹介されてますが、このエントリではWebAPIを使ってやってみます(あまのじゃくに)。
参考: Monit Integration - OpsGenie
https://www.opsgenie.com/docs/integrations/monit-integration
全体の流れは、以下の通りです。
- OpsGenieでAPIキーを作る
- 監視対象サーバにnginxをセットアップ
- 監視対象サーバにMonitのセットアップ
- アラームを上げてみる
OpsGenieでAPIキーを作る
OpsGenieにログインし、左側メニューの「Integrations」を選びます。
次に「Add Service Integrations」から「API」の「Add」ボタンを押すと、「API」が追加され、「API Key」が発行されます。
Monitからの連携にこのキーを利用するので、どこかにコピーしておきます。
では、curlを使って、API経由でOpsGenieにアラームを上げ、さらにクローズしてみます。
以下のコマンドで、アラームを上げます。
$ curl -XPOST 'https://api.opsgenie.com/v1/json/alert' -d '
{
"apiKey": "※発行したAPI Key※",
"message" : "alarm sample by api",
"alias" : "alarm_sample"
}'
以下のコマンドで、アラームをクローズします。
$ curl -XPOST 'https://api.opsgenie.com/v1/json/alert/close' -d '
{
"apiKey": "※発行したAPI Key※",
"alias" : "alarm_sample"
}'
これらのWebAPIをMonitの監視結果に応じて呼び出すようにすれば、MonitとOpsGenieを連携して監視と通知が出来るようになる訳です。
2つ後の節で実際に設定してみます。
AlertAPIについては以下を参考にして下さい。
参考: Alert API - OpsGenie
https://www.opsgenie.com/docs/web-api/alert-api
監視対象サーバにnginxをセットアップ
監視対象のサービスとして、監視対象のサーバにnginxも入れておきます。
$ sudo yum install -y nginx
$ sudo chkconfig nginx on
$ sudo service nginx start
このエントリでは「/healthcheck」というリクエストに対する応答を監視するので、「healthcheck」というファイルを作っておきます。
$ echo "alive" > /usr/share/nginx/html/healthcheck
監視対象サーバにMonitをセットアップ
まずは、監視対象プロセスを動かすサーバにMonitをインストールします(ここでは、EPELからインストールします)
$ sudo yum install -y epel-release
$ sudo yum install -y monit
MonitからOpsGenieのWebAPIを呼び出すためのシェルスクリプトを作っておきます。次のような感じで作ります。
/usr/local/sbin/monit2opsgenie_alert: アラームを上げるためのスクリプト
#!/bin/sh
OPSGENIE_API_KEY=※発行したAPI Key※
curl -XPOST 'https://api.opsgenie.com/v1/json/alert' -d "
{
\"apiKey\": \"${OPSGENIE_API_KEY}\",
\"message\" : \"${MONIT_SERVICE}@${MONIT_HOST}: ${MONIT_DESCRIPTION}\",
\"alias\" : \"monit:${MONIT_SERVICE}@${MONIT_HOST}\",
\"details\": {
\"monit_event\":\"${MONIT_EVENT}\",
\"monit_service\":\"${MONIT_SERVICE}\",
\"monit_host\":\"${MONIT_HOST}\",
\"monit_description\":\"${MONIT_DESCRIPTION}\"
}
}"
/usr/local/sbin/monit2opsgenie_close: アラームをクローズするためのスクリプト
#!/bin/sh
OPSGENIE_API_KEY=※発行したAPI Key※
curl -XPOST 'https://api.opsgenie.com/v1/json/alert/close' -d "
{
\"apiKey\": \"${OPSGENIE_API_KEY}\",
\"alias\" : \"monit:${MONIT_SERVICE}@${MONIT_HOST}\"
}"
「MONIT_XXXX」という環境変数の意味は次を参照して下さい。
参考:ENVIRONMENTS - Monit documentation
https://mmonit.com/monit/documentation/monit.html#ENVIRONMENT
シェルスクリプトには、忘れずに実行権限もつけておきます。
$ chmod +x /usr/local/sbin/monit2opsgenie_alert
$ chmod +x /usr/local/sbin/monit2opsgenie_close
Monitに設定を加えてnginxを監視します。この設定から先ほど作成したシェルスクリプトを呼び出します。
/etc/monit.d/nginx.conf: nginxの監視設定
check process nginx with pidfile "/var/run/nginx.pid"
start = "/etc/init.d/nginx start"
stop = "/etc/init.d/nginx stop"
if failed
host 127.0.0.1 port 80 protocol http request "/healthcheck"
then exec "/usr/local/sbin/monit2opsgenie_alert"
else if succeeded then exec "/usr/local/sbin/monit2opsgenie_close"
これで監視設定が出来たので、Monitを起動してみます。
$ sudo chkconfig monit on
$ sudo service monit start
アラームを上げてみる
最後に、サービスを停止させて、アラームがあがることを確認してみます。
プロセスを停止させた場合は、Monitで起動させるようにしているので、nginx止めてもアラームは上がらずに再起動します(ここはOpsGenie関係ないですね)。
$ sudo service nginx stop
nginx を停止中: [ OK ]
$ sudo service nginx status
nginx は停止しています
※しばらく待つ※
$ sudo service nginx status
nginx (pid XXXX) を実行中...
次に、ヘルスチェックファイルを削除してOpsGenieにアラームがあがることを確認します。
$ rm /usr/share/nginx/html/healthcheck
それでは、ヘルスチェックファイルを作り直してアラームがクローズされることを確認してみます。
$ echo "alive" > /usr/share/nginx/html/healthcheck
うまくいかない場合は「/var/log/monit」でMonitのログを確認してみて下さい。
このようにしてMonitからOpsGenieに監視の状態を連携すれば、あとはOpsGenie側のPolicyで時間帯による通知On/Offを設定したり、などOpsGenieの機能に乗っかって監視の運用を設定できますね。