sentry-sdk
SentryのPython向けSDKについて
PyPI
sentry-sdk · PyPI 新しいsdk
raven
sentry-sdk ドキュメント https://docs.sentry.io/platforms/python/logging/
sentry_sdk
2018/08/21 - ver 0.1.0
2020/03/20 - ver 0.14.3
2020/08/05 - ver 0.16.3
2021/02/18 - ver 0.20.0
2021/05/04 - ver 1.0.0
2021/12/13 - ver 1.5.1
sentry_sdk.init() すれば自動的にエラー等を捕まえてくれる
Django と統合、logging と統合、といったインテグレーションはオプションで指定する
色々なコードに patch して情報を取得しているようだ
PII (Personaly Identifiable Information) の送信制御を指定できる
https://docs.sentry.io/data-management/sensitive-data/
送信制御できるのはエラー時のみ(ver 0.16.3)で、APMはサービス側でフィルタする
WARNING,ERRORだけどSentryに送りたくないログもここでフィルタする
https://docs.sentry.io/error-reporting/configuration/filtering/?platform=python
設定例
Djangoの場合
code:python
import sentry_sdk.utils
sentry_sdk.utils.MAX_STRING_LENGTH = 2048 # monkey patch first
# see https://github.com/getsentry/sentry-python/issues/614
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,
# see https://github.com/getsentry/sentry-python/pull/503
"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 コールバック関数で処理できる
https://docs.sentry.io/data-management/sensitive-data/#default-pii
before_send について
エラー時に呼ばれる(APM用途には呼ばれない)
イベントにタグを付けたり、データを削除したりできる
https://docs.sentry.io/error-reporting/configuration/filtering/?platform=python
https://docs.sentry.io/data-management/sensitive-data/#server-side-scrubbing
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 について
https://docs.sentry.io/platforms/python/django/
sentry_sdk.integrations.logging.LoggingIntegration について
https://docs.sentry.io/platforms/python/logging/
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に送らない
巨大なデータを送ろうとしてメモリを圧迫する問題があるためらしい
https://github.com/getsentry/sentry-python/pull/503
とはいえ、SQLパラメータ値が分からないと追跡が難しくなるため、Trueに設定しておく
https://github.com/getsentry/sentry-python/issues/614
使っていて問題が起きたらFalseにすればいいか...
MAX_STRING_LENGTH = 2048 パッチについて
sentry_sdk.utils.MAX_STRING_LENGTH = 2048
デフォルト値の512だと、長いクエリは途中で切ってからSentryに送られるため
https://github.com/getsentry/sentry-python/issues/614
より細かく制御するには
Sentryに送る情報をコントロールできるが、view関数などにそのためのwithブロックを実装したりが必要
https://docs.sentry.io/enriching-error-data/additional-data/?platform=python