小さいrailsサービスあるある
railsで何かサービスを作ったとする。ExceptionNotificationも入れた。NewRelicで5分毎に死活監視もしてる。なのに「落ちてるみたいです」とTwitterで言われる。
nginx + unicornの組み合わせでアクセスが増えた時、大抵真っ先に起こるのがunicornのtime out。
2013/02/08 18:36:10 [error] 20932#0: *3506622 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 〜
ってやつ。
重いDBのクエリとかでアクセスをさばくスピードより接続数が増えてきて起こる。railsアプリまで処理が行かないのでExceptionは起こらない。NewRelicで監視してるURL以外で起きたり時々起きたりしてるからこちらが気付かない。
Nginxのエラーログを監視する
要はNginxのエラーログも監視しないといけない。syslog(rsyslog)でもplainなfileを監視したりalertメール飛ばしたり、複数台のログを1台に集約したりプラグインでできるけど、不必要なエラーログをフィルタリングしたりの設定が少し面倒くさい。
nagios or ganglia or monit入れる?この程度のサービスでfluentd使うのも大袈裟だしなあ。
logentriesを使う
logentriesはLogglyとか沢山あるログ収集系のWebサービスです。多分これ系のどのサービス使っても同じ事できますが、LogglyだとAlertingは別サービスになってたりしてメンドイ。logentriesはWeb UIはイマイチですが設定は簡単だしalertメール飛ばすだけなら十分便利です。
logをlogentriesに送る方法は色々ありますが、専用agentを入れるのが一番簡単です。
$ su -
# echo 'deb http://rep.logentries.com/ squeeze main' >/etc/apt/sources.list.d/logentries.list
# gpg --keyserver pgp.mit.edu --recv-keys C43C79AD && gpg -a --export C43C79AD | apt-key add -
# apt-get update
# apt-get install python-setproctitle logentries
# le register
# apt-get install logentries-daemon
NginxのErrorログを監視。
# le follow /var/log/nginx/error.log --name Nginx-Error
しばらくするとこんな感じでログが集まってくる。
nginxのerror logは普通に404とかのエラーもあるので全部をalertメールしてたらウザいのでパターンにタグをつけます。
そしてそのタグに対してAlerts設定でメールを飛ばせばOK。「1時間に10回以上起きたら」とか「1時間に1回しか送りません」とかもWebから設定できるので簡単。
これで
「お客さんのエラー体験 = 俺らにAlertメール」
の図式に(常識的なメール数の中で)なるのでみんなで頑張ってエラー減らしまっしょい!という雰囲気になって良いです。