sentry-sdk
PyPI
sentry_sdk
sentry_sdk.init() すれば自動的にエラー等を捕まえてくれる
Django と統合、logging と統合、といったインテグレーションはオプションで指定する
色々なコードに patch して情報を取得しているようだ
PII (Personaly Identifiable Information) の送信制御を指定できる
送信制御できるのはエラー時のみ(ver 0.16.3)で、APMはサービス側でフィルタする
WARNING,ERRORだけどSentryに送りたくないログもここでフィルタする
設定例
Djangoの場合
code:python
import sentry_sdk.utils
sentry_sdk.utils.MAX_STRING_LENGTH = 2048 # monkey patch first
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
def strip_sensitive_data(event, hint):
# エラーハンドリング時(loggerのwarning以上か、例外発生時)に呼ばれる。
# eventに送信するデータがJSONで格納されている
return event
sentry_sdk.init(
release=__version__,
dsn="<your dsn>",
integrations=[
DjangoIntegration(), # Djangoの場合
],
_experiments={
# "auto_enabling_integrations": True,
"record_sql_params": True, # Disabled by default with memory issue
},
# If you wish to associate users to errors (assuming you are using
# django.contrib.auth) you may enable sending PII data.
send_default_pii=True,
# for APM. be sure to lower this in production to prevent quota issues
traces_sample_rate=0.1, # 10回に1回送信する
# filter data for non transactions
before_send=strip_sensitive_data,
)
send-default-piiについて
ログインしているユーザー情報(ユーザー名やid値など)などをSentryに送りたい
emailアドレスなども送られるが、Sentryサーバー側でフィルタしてから保持してくれる設定もある
Trueにしつつも、どうしても送りたくないデータなどは before_send コールバック関数で処理できる
before_send について
エラー時に呼ばれる(APM用途には呼ばれない)
イベントにタグを付けたり、データを削除したりできる
traces_sample_rate について
1日10,000回APIアクセスのあるサービスの場合
無料プランの 50K/月 に収めるには traces_sample_rate = 0.16 以下に設定する
50000 / (10000 * 30) = 0.166....
10000回アクセスは、1日8時間に同時利用3.5人程度の想定
画面操作や非同期のAPI呼び出しが1人あたり1分間に6回あると仮定
10000 / 8h / 60m / 6 = 3.47
開発中や動作検証で使う分には無料プランで十分そう
sentry_sdk.integrations.django.DjangoIntegration について
sentry_sdk.integrations.logging.LoggingIntegration について
Sentryはデフォルトでloggerの情報をハンドリングしいる
INFOレベル以上のログはエラー時に添付している(レベル変更可能)
ERRORレベル以上をエラー監視対象としている(レベル変更可能)
添付されたログをすべて、エラーハンドリング時のBreadcrumbに表示してくれる
Errorの前に実行されたSQLだけでなく、logger.infoの出力も(設定でdebugも)Breadcrumbsに表示されるので、問題発生に至る状況を把握しやすい
https://gyazo.com/6a0c674f052094425901266f22acf006
_experiments={"record_sql_params": True} について
現在の sentry-sdk==0.16.3 はデフォルトでSQLのパラメータ値をSentryに送らない
巨大なデータを送ろうとしてメモリを圧迫する問題があるためらしい
とはいえ、SQLパラメータ値が分からないと追跡が難しくなるため、Trueに設定しておく
使っていて問題が起きたらFalseにすればいいか...
MAX_STRING_LENGTH = 2048 パッチについて
sentry_sdk.utils.MAX_STRING_LENGTH = 2048
デフォルト値の512だと、長いクエリは途中で切ってからSentryに送られるため
より細かく制御するには
Sentryに送る情報をコントロールできるが、view関数などにそのためのwithブロックを実装したりが必要