🎻

[2022年版] Symfony5にSentry4系を導入する手順

2022/02/10に公開

過去に

[超簡単] SymfonyプロジェクトにSentryを導入する

という記事を書きましたが、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 が作成される
  • .envSENTRY_DSN= が追記される
  • config/bundles.php にSentryBundleが追記される

まで自動で行われます。

2. 組み込みErrorListenerの代わりにMonologと統合する

多くのSymfonyアプリでは Monolog が導入されているだろうという勝手な想定のもと、本記事では組み込みのErrorListenerの代わりにMonologと統合してSentryを使用する方法を解説します🙏

Symfony | Sentry Documentation #monolog-integration

を参考に、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.yamlexcluded_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を無効にする必要あり?(詳細未確認)

ここまででほぼ設定完了なのですが、僕の環境だと、テスト時に LiipTestFixturesBundleloadAliceFixture()

Doctrine\DBAL\Exception: Operation 'Doctrine\DBAL\Platforms\AbstractPlatform::getListDatabasesSQL' is not supported by platform.

というエラーになりました🤔

ちょっと詳細な原因は追えていないのですが、試行錯誤の結果 config/bundles.php でSentryBundleを登録すると再現することが分かったので、

あたりを見て、config/packages/test/sentry.yaml

sentry:
  tracing:
    dbal:
      enabled: false

という内容で作成してみたところ解消されました。

詳細分かる方いらしたらぜひ 情報いただけると 嬉しいです🙏

GitHubで編集を提案

Discussion