FastAPI に Sentry を導入する方法(sentry-sdk[fastapi] 対応)
副業で開発に参加していた FastAPI プロダクトに、Sentry を使ったエラートラッキングを導入した記録です。「エラー監視ツールの導入」と聞くと大掛かりに感じますが、実際に手を動かしてみると数十行の設定で完了しました。同じ構成で試そうとしている方に届けばと思い、手順とコードをまとめます。
背景
Vue + FastAPI で構築された取引先のシステムで、バックエンド側にエラー監視が入っていませんでした。フロントエンドにはすでに Sentry が導入されていたため、バックエンドも同じ Sentry に揃える方針になりました。
自分は Sentry について事前知識がほぼゼロの状態から調べながら実装したので、この記事はそのときに把握した内容を整理したものです。
Sentry とは
Sentry はソフトウェアのエラー追跡とパフォーマンス監視のためのオープンソースツールです。

Application Performance Monitoring & Error Tracking Software
Application performance monitoring for developers & software teams to see errors clearer, solve issues faster & continue learning continuously. Get started at sentry.io.
GitHub - getsentry/sentry: Developer-first error tracking and performance monitoring
Developer-first error tracking and performance monitoring - getsentry/sentry
エラーは debug・info・warning・error の 4 段階で通知でき、例外が発生した場合はスタックトレースも一緒に送信されます。パフォーマンス監視機能では HTTP リクエストの応答時間やデータベースのレイテンシを計測できます。
Bugsnag・Rollbar との違い
本業では Ruby on Rails のプロダクトで Bugsnag を使っていたので、Sentry と何が違うのかも調べました。
機能面の差は大きくなく、選定の観点としては次のような整理が参考になりました。
- Bugsnag: サードパーティアプリとの連携が豊富。エラーを根本原因でグルーピングする機能が強み
- Sentry: 類似エラーの解決ワークフローが整理されている。コードレベルの問題を特定しやすい UI
stackshare.io/stackups/bugsnag-vs-sentry
食べログさんのフロントエンドブログでは、Sentry を選んだ理由として「時間単位の受信制限でコスト管理できる」「管理画面のフィルタリングが使いやすい」「参考記事が多い」が挙げられていました。

月間13億PVのエラートラッキングにSentryで挑む|食べログ フロントエンドエンジニアブログ
はじめまして。食べログFE(フロントエンド)チームの佐伯と申します。 このタイトルを書いてみて、数字の大きさに驚きを隠せません。 通常形態のフリーザ様(53万)何人分でしょうか。 2019年9月より食べログではフロントエンドのエラートラッキングにSentryを使用しており、今回は実際に運用して見えてきた課題などをご紹介させていただきたと思います。 ※PV数は2020年6月時点のものを参考にしております https://corporate.kakaku.com/press/mission 概要 ・トラッキングツールの選定理由 ・Sentry導入だけでは全て解決されません ・費用に
Rollbar も同系統のツールとして比較対象になりますが、今回は既存のフロントエンド側に合わせて Sentry を選びました。

Rollbar | Error logging & tracking service for software teams
Real-time error monitoring and tracking for software teams. Rollbar connects errors, session replays, and releases in one place. Free plan available.
FastAPI への導入手順
公式ドキュメントの Python ガイドを参考にして実装しました。

Python | Sentry for Python
Learn how to set up Sentry in your Python app, capture your first errors and traces, and view them in Sentry.
1. sentry-sdk のインストール
FastAPI(Starlette ベース)向けの extra を含めてインストールします。
pip install --upgrade "sentry-sdk[fastapi]"
[fastapi] extra を指定すると StarletteIntegration と FastApiIntegration が同梱されます。SQLAlchemy を使っている場合は [fastapi,sqlalchemy] としてもよいです。
2. 環境変数に DSN を設定
Sentry のプロジェクトページで「Settings → Client Keys (DSN)」から DSN を取得し、環境変数に設定します。

SENTRY_DSN=<DSN の値>
3. 初期化関数を作成
sentry.py を作成して init_sentry() 関数にまとめます。SENTRY_DSN が未設定のとき(ローカル開発など)は何もしない設計にしておくと、環境ごとの切り替えが楽です。
# sentry.py
import sentry_sdk
from sentry_sdk.integrations.fastapi import FastApiIntegration
from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration
from sentry_sdk.integrations.starlette import StarletteIntegration
from app.core.config import settings
def init_sentry() -> None:
if settings.SENTRY_DSN is None:
return
sentry_sdk.init(
dsn=settings.SENTRY_DSN,
environment=settings.ENV,
integrations=[
StarletteIntegration(),
FastApiIntegration(),
SqlalchemyIntegration(),
],
traces_sample_rate=1.0,
)
StarletteIntegration と FastApiIntegration はセットで指定する必要があります。FastAPI は Starlette をベースにしているため、両方を渡すことでリクエスト情報が正しくキャプチャされます。
traces_sample_rate=1.0 はすべてのトランザクションをトレースする設定です。トラフィックが多い環境では 0.1(10%サンプリング)などに下げてコストを調整します。
4. main.py から呼び出す
# main.py(追加分のみ)
from app.sentry import init_sentry
init_sentry()
アプリ起動時に一度呼び出すだけです。これでエラーが発生したときにスタックトレースと詳細情報が Sentry に送信されるようになります。

やってみた感想
設定量は思ったより少なく、sentry_sdk.init() の呼び出しとインテグレーション指定がほぼすべてでした。ASGI フレームワーク向けに StarletteIntegration が用意されているおかげで、自分でミドルウェアを書く必要がありません。
パフォーマンス計測・Slack 通知・サンプリングレートの細かい調整など、今回は使わなかった機能がまだ多いので、規模が大きくなったタイミングで追って設定を見直す予定です。
参考

エラー監視には Sentry が超便利! - Qiita
避けられないアプリケーションのエラー監視 アプリケーションを運用する上でエラー監視は避けて通れませんよね。 とはいえ、エラー監視のツールやサービスは今やたくさんあるので、どれを使ったらいいか迷うところでもあります。 僕はお仕事で Sentry を使っているのですが、これま...

Sentryで始めるエラー監視

Next.jsにSentryを導入した際の課題と解決策について|食べログ フロントエンドエンジニアブログ
はじめまして、2021年11月に食べログFE(フロントエンド)チームにジョインした遠藤です。 Next.jsを採用した新規プロジェクトに参画し、Sentryの導入を行いました。本記事ではSentryを導入した際の課題と解決策について記載していきます。 1. はじめに 「Sentryとは何か?」、「食べログでSentryを選定した理由」などにご興味がある方はまず下記の記事を読んでみてください。 Sentryは便利ですが以前はアプリケーションに導入するにはいくつかのファイルを作成して、エラーやパフォーマンスをトラッキングするのに様々な設定を行う必要がありました。 そこでSent
Sentryを活用するためにやっていること - Classi開発者ブログ
フロントエンドエキスパートチームのlacolacoです。 この記事ではアプリケーション監視プラットフォームのSentryをClassiの中でどのように活用しているかを少し紹介します。Sentryの運用に悩んでいる方の参考になれば幸いです。 Sentryの用途 Classiでは大きく2つの目的でSentryを利用しています。ひとつはアプリケーションのエラーの監視(以後エラー監視と呼びます)、もうひとつはWebフロントエンドのパフォーマンスの監視(以後パフォーマンス監視と呼びます)です。 Sentryは多くのプログラミング言語用にSDKがあり、Classiでは主にJavaScriptとRubyのS…
Sentryのパフォーマンス監視 - 清水川のScrapbox
Sentryのパフォーマンス監視 https://sentry.io/for/performance/ 利用するメリット 処理の重いAPI・画面・機能が把握できる DBに発行したSQLと処理時間が分かる コスト 設定は簡単 -> sentry-sdk サービス利用料 https://sentry.io/pricing/ Developer Plan (無料)では50K通知/月まで Team Pla

SentryのPerformance Monitoringを活用する

Sentryのパフォーマンス監視機能とPythonで使える便利設定 — HACK The Nikkei
Sentryのパフォーマンス監視機能の概要や、Pythonで使用する場合の便利な設定を紹介します
記事の更新をメールで受け取る
質問・リクエストを送る
記事についての質問や、取り上げてほしいテーマがあればお気軽にどうぞ。いただいた質問はブログ記事として回答し、Q&Aページで公開することがあります。