小さい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を使う

logentriesLogglyとか沢山あるログ収集系の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メール」

の図式に(常識的なメール数の中で)なるのでみんなで頑張ってエラー減らしまっしょい!という雰囲気になって良いです。

Comments


(Option)