[2022年版] Symfony5にSentry4系を導入する手順
過去に
という記事を書きましたが、Sentryがバージョン4系になって設定方法などが多少変わっていたので、改めて導入手順をまとめておきたいと思います。
1. SentryBundleをインストール
$ composer require sentry/sentry-symfony
レシピも実行します。
- WARNING sentry/sentry-symfony (>=3.0): From github.com/symfony/recipes-contrib:master
The recipe for this package comes from the "contrib" repository, which is open to community contributions.
Review the recipe at https://github.com/symfony/recipes-contrib/tree/master/sentry/sentry-symfony/3.0
Do you want to execute this recipe?
[y] Yes
[n] No
[a] Yes for all packages, only for the current installation session
[p] Yes permanently, never ask again for this project
(defaults to n): y
これで、
-
config/packages/sentry.yaml
が作成される -
.env
にSENTRY_DSN=
が追記される -
config/bundles.php
にSentryBundleが追記される
まで自動で行われます。
2. 組み込みErrorListenerの代わりにMonologと統合する
多くのSymfonyアプリでは Monolog が導入されているだろうという勝手な想定のもと、本記事では組み込みのErrorListenerの代わりにMonologと統合してSentryを使用する方法を解説します🙏
を参考に、ErrorListenerを無効にして、代わりにMonolog経由でSentryにエラーを送信できるように設定します。
まず、 config/packages/sentry.yaml
に以下を追記してErrorListenerを無効にします。
sentry:
dsn: '%env(SENTRY_DSN)%'
+ register_error_listener: false
もし、依存ライブラリの中に E_NOTICE
E_STRICT
E_DEPRECATED
等のレベルのエラーを出しているものがある場合などは、以下を追記することでそれらのエラーを無視することもできます。
sentry:
dsn: '%env(SENTRY_DSN)%'
register_error_listener: false
+ options:
+ error_types: E_ALL & ~(E_NOTICE|E_STRICT|E_DEPRECATED)
次に、config/packages/monolog.yaml
に以下を追記します。
monolog:
handlers:
# ...
sentry:
type: sentry
level: !php/const Monolog\Logger::ERROR
hub_id: Sentry\State\HubInterface
基本的にはこれだけで導入完了です✋
3. 400系のエラーを報告しないようにする
404 Not Foundや405 Method Not Allowedなどのエラーは報告しないように設定しておきたいこともあるかと思います。
Sentry3系では config/packages/sentry.yaml
に excluded_exceptions
というオプションで設定することができました が、4系ではこのオプションは廃止されています。
代わりにMonologの excluded_http_codes
オプションを使って設定します。
monolog:
handlers:
# ...
- sentry:
- type: sentry
- level: !php/const Monolog\Logger::ERROR
- hub_id: Sentry\State\HubInterface
+ sentry:
+ type: fingers_crossed
+ action_level: error
+ handler: sentry_nested
+ excluded_http_codes: [404, 405]
+ buffer_size: 50
+ sentry_nested:
+ type: sentry
+ level: !php/const Monolog\Logger::ERROR
+ hub_id: Sentry\State\HubInterface
参考:
4. LiipTestFixturesBundleを使っている場合はtest環境でDbalTracingを無効にする必要あり?(詳細未確認)
ここまででほぼ設定完了なのですが、僕の環境だと、テスト時に LiipTestFixturesBundle の loadAliceFixture()
が
Doctrine\DBAL\Exception: Operation 'Doctrine\DBAL\Platforms\AbstractPlatform::getListDatabasesSQL' is not supported by platform.
というエラーになりました🤔
ちょっと詳細な原因は追えていないのですが、試行錯誤の結果 config/bundles.php
でSentryBundleを登録すると再現することが分かったので、
- sentry-symfony/src/SentryBundle.php
- sentry-symfony/src/DependencyInjection/Compiler/DbalTracingPass.php
#L34-L40
あたりを見て、config/packages/test/sentry.yaml
を
sentry:
tracing:
dbal:
enabled: false
という内容で作成してみたところ解消されました。
詳細分かる方いらしたらぜひ 情報いただけると 嬉しいです🙏
Discussion