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の機能に乗っかって監視の運用を設定できますね。