趣味でhubotいじったりしてるんですが、たまに死んでる時があります。
Slackでコマンド打って何も返ってこないと切なくなるので、
死んだ時に死んでしまうとは情けないと言えるようにしたいというのが今回の目的です。
突然の死の原因
ログを見るとこんな感じで突然の死を遂げているようです。
接続エラーでリトライしてもダメなときにclientを止めているように見えます。
[Sun Jun 14 2015 03:58:52 GMT+0900 (JST)] INFO Connecting... [Sun Jun 14 2015 03:58:54 GMT+0900 (JST)] INFO Logged in as dark of ngineerxiv, but not yet connected [Sun Jun 14 2015 03:58:55 GMT+0900 (JST)] INFO Slack client now connected [Sun Jun 14 2015 14:25:38 GMT+0900 (JST)] ERROR Last pong is too old: 14.823 [Sun Jun 14 2015 14:25:38 GMT+0900 (JST)] INFO Reconnecting in 1000ms [Sun Jun 14 2015 14:25:39 GMT+0900 (JST)] INFO Attempting reconnect [Sun Jun 14 2015 14:25:39 GMT+0900 (JST)] INFO Connecting... [Sun Jun 14 2015 14:25:41 GMT+0900 (JST)] INFO Slack client closed
これだけだとよくわからない。
(原因ご存知のかたコメント頂きたいです・・・(´・ω・`))
とりあえず再起動すればなんとかなるので、プロセスが死んだことに気がつけるようにします。
そこでmackerelですよ
他の手段もありそうですが、とりあえず触ってみたかったのでmackerelを使ってみました。
特に他の何かと比較したとかありません。
mackerelにはデフォルトのメトリックがいくつか用意されていますが、今回はカスタムメトリックを利用します。
※メトリクスとも言いますが、mackerelではメトリックで統一しているらしいですね。 用語集 - Mackerel ヘルプ
こちらのメトリックで監視している値が、ある閾値を超えたらアラートを投げるという設定をすることにしました。
2015/06/23現在、Slackへの通知が可能ということなので、
hubotのプロセスが止まっていたらSlackに通知するということをすることにします。
アラートの条件設定
とりあえず、プロセス数が1未満だとアラートみたいな設定をしました。
この時下記の記事を参考にしています。
設定はこんな感じ
ps aux|grep ...|wc -l を利用してプロセス数をechoしています。
ゴリ押しですねw
# Configure ... [plugin.metrics.dark-ngineerxiv] command = "echo \"dark.ngineerxiv\t$(ps aux | grep dark|grep make|grep ngineerxiv| grep -v grep | wc -l)\t$(date -u +%s)\"" ...
設定したらmackerel-agent serviceを再起動します。
そうすれば数分後に下記のようなグラフがmackerelの自分のページに表示されるはずです。
さらにアラートの設定を下記のようにすれば設定完了です。
アラートが流れた時の挙動とまとめ
もしhubotが死んだ時こんな投稿がSlackに投稿されます。
これでhubotが死んだ時にちゃんと気がつけますね。
dark poem と打つと
オサレなポエムを返してくれるようにしているのですが
返してくれないと本当に悲しくなるので活用していきたいと思います。
この他にも実はtd-agentとかの監視にも使ってますが、その話はまた今度。