イベントログ収集ツールの Sentry が凄そう

Disqus が作っている Sentry というツールが凄そうというお話。
# 元 Disqus の社員さんだったみたい


Sentry って何かというと "Sentry is a realtime event logging and aggregation platform." と書いてる通りアプリケーションからイベントログを送信して、それを表示してくれるもの。
Sentry | Error Tracking Software — JavaScript, Python, PHP, Ruby, more


サービスとして課金をして利用もできるが、OSS になっているので自分で構築する事も出来る。
GitHub - getsentry/sentry: Sentry is cross-platform application monitoring, with a focus on error reporting.
構築方法は以下を参考にローカルに試しに作ってみたらあっさりできた。
https://sentry.readthedocs.org/en/latest/


ログ収集ツールというと Fluentd だと思うけどこっちはアプリケーションで例外が発生した場合とかに Raven というクライアントを使って Sentry に向けてログを HTTP で渡すようなイメージ。


収集したログは可視化されて Web ブラウザで見れる。
例えば例外だと

try:
    1 / 0
except ZeroDivisionError:
    sentry.captureException()

と埋め込むだけで、例外のスタックトレースを Sentry に送りつけて、見えるようになる。
直近で起きたイベントとか、類似のイベントとか、タグ付けして分類とかできる。
試しにやってみたらブラウザの情報とかも表示された。
# 因に面白い機能として同じリクエストを送信するという機能があって Sentry からクライアントを埋め込んだサイトに対してリクエストを送る事が出来る


Sentry 自体は Python(Django)製のアプリケーションだけど、クライアントは色んな言語で使える。
Sentry 自体が提供しているのは、Python, PHP, Ruby, JavaScript(Browser), iOS/Objective-C, C# を提供している。
その他サードパーティJava, Node.js がある。
実験的クライアントという位置づけで Action Script3, CFML, Erlang, R が利用できるよう。
Logging ライブラリとしてのハンドラを持ってるので、ログ出力するような感じでも使える気がする。


ただ試してみて HTTP で通信して Sentry に渡すため遅くなるのが気になった。
Flask で HTML を返すだけのを作って、10msec で応答があったのが Sentry を入れてみると例外のキャプチャだと 140msec くらい掛かって大幅に遅くなった感じ。
例外じゃないメッセージの場合は 60msec とかだった。
サンプルは http://raven.readthedocs.org/en/latest/config/flask.html#usage にあるのをそのまま使った


数時間使ってみただけの感想だけど通常のログを出力するような感じでカジュアルに使っていればサイトのレスポンス自体に影響が出てくるかもしれない。
例えば例外が起きたときにのみ Sentry に渡すとかした方が良いのかもしれない。
あるいはログ出力の時だけ別プロセスを起動して非同期に渡すとか考えた方が良さそう。
raven-python のソースを眺めてみると AsyncClient*1 とかあるのでそれを使えば非同期に送れるのかも(試してない)。
# PHP どうすんだろ…


あとは Sentry 自体にプラグイン機構があるので、Sentry に送りつつ Github とか Redmine に Issue を立てるとかもできるよう。
https://sentry.readthedocs.org/en/latest/plugins/index.html#rd-party-extensions


昔 EC サイトの保守をやっててエラーの調査とかをログファイルを grep とか泥臭いことで見てたけど、これを使えば綺麗に可視化ができるので良さそう。
今の仕事で使うかは微妙だけど、自社のプロダクトとかには使ってみようと思う。


追記:
Python で非同期に Sentry に投げてみた。
raven-python で非同期に Sentry にイベントを投げる - Memo