raven-python で非同期に Sentry にイベントを投げる

昨日書いたやつで同期で Sentry にイベントを送りつけると送信元のサイトのパフォーマンスが遅くなるのが気になったので、非同期に送る方法がないか調べてみた。

Githubraven-python/async.py at master · getsentry/raven-python · GitHub とかあるので、これを使えば行けるのかと思って以下のようにした。

# -*- coding: utf-8 -*-
from raven.contrib.async import AsyncClient
from raven.contrib.flask import Sentry
from flask import Flask


def create_app():
    app = Flask(__name__)
    sentry = Sentry(app, client=AsyncClient(), dsn='http://public_key:secret_key@example.com/1'))
    return app

で、これで Flask を起動したら

DeprecationWarning: AsyncClient is deprecated. Use the threaded+http transport instead.
  warnings.warn('AsyncClient is deprecated. Use the threaded+http transport instead.', DeprecationWarning)

と怒られた。

"Use the threaded+http transport instead." とあるのでどういう事かというと、dsn の設定でプロトコル部分に threaded+ とつけると非同期になるよう。

sentry = Sentry(app, dsn='threaded+http://public_key:secret_key@example.com/1')

threaded は文字通り Python の Thread を使う。


Sentry Documentation
Gevent とか Tornado とかあって試してみたが、Gevent はレスポンスは速くなったけど Sentry にログが記録されなかった。
Tornado は同期のクライアントとあんまり速度が変わらなかった。
Threaded が一番効果があった。
サイトのレスポンスが Raven を入れる前とほぼ変わらないレスポンス速度が返ってきた。


ということで、Python を使う場合は threaded+ を付けるとよさそう。
なお、JavaScript

raven-jsでスクロールイベントでエラー通知ぶん投げまくってみたらパフォーマンス落ちなかったので非同期だと良い感じの予感です。

http://b.hatena.ne.jp/basicchannel/20130326#bookmark-138050162

との事。


他の言語のクライアントで非同期な仕組みが組み込まれてるか分からないけど(Ruby とかなさそう?)、スレッドやマルチプロセスを使えば良さそう。
PHP は…どうするのが良いんだろう。