heroku でWebサービスを運営している時って、監視系はみなさんどうしてますか?
おそらく定番アドオンである New Relic と Air Brake を使用していると思うのですが、これらでは heroku で発生するタイムアウトを検知できません。
30秒以内に応答返せなかったらってアレですね。
考えてみれば heroku の Error Code12 は例外がスローされてるわけじゃないので、Air Brake 対象外。
タイムアウト処理しているのは WebDyno じゃなくて heroku/router なので New Relic で捕捉できない、ってことのようで。
どうしようかなといろいろ調べましたが、結局 Papertrail の検索結果送信機能を使うことにしました。
Papertrail を使う
Papertrail は heroku のログ取り扱いアドオンです。
Logly と違ってログ内に日本語があっても正常に表示されるし、一定期間内のログを Web 上で閲覧することができます。
このログ閲覧機能がすごく優秀で、キーワード検索も時刻での検索もでき、検索条件の保存もできるので、もう手放せない存在になっています。
もちろん、Amazon S3 へ圧縮したログを自動で保存してくれます。
んで、この検索条件保存機能はただ保存するだけじゃなくて、検索条件に一致するログが記録された場合、それを通知することもできるようになっているんですね。
監視間隔を毎分、毎時、毎日に設定できるので、即時性がほしい場合も問題ないでしょう。
ちなみに毎日の場合、設定されているタイムゾーンの朝5時にバッチ実行されるようです。
通知方式はごく普通にメールのほか、いくつかのWebサービスを対象とすることもできます。コラボレーションツールの Campfire (日本のクラウドファンディングサービスとは多分無関係)とか、モニタリングツールの Boundary とか。
リクエストタイムアウトのログは、このように記録されています。
Apr 29 02:46:09 application-name heroku/router: at=error code=H12 desc="Request timeout" method=GET path=/hogehoge/fugafuga/error_uri host=jobhub.jp fwd="192.168.0.1" dyno=web.2 connect=1ms service=30000ms status=503 bytes=0
このログが引っかかるように検索条件を保存してアラート設定してあげると良いです。
主目的はタイムアウトの補足ですが、他のエラーも検知したいので、キーワードは at=error code=
にしてみました。
実はこの辺の情報は、先日 heroku に実装された Production-Check 機能のヘルプで解説されています。
Production Check|Heroku Dev Center
公式の方でも、ログのアドオンは Papertrail を推しているようですね。