Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.1: Active Recordのトランザクションイベントがinstrumentationで計測可能になった(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

参考: 週刊Railsウォッチ20230926: Active Recordのトランザクションをinstrumentationで計測できるようになった

なお、transaction.active_recordは現時点でRails Guidesedgeguidesには記載されていません。

Rails 7.1: Active Recordのトランザクションイベントがinstrumentationで計測可能になった(翻訳)

Active Supportのinstrumentation(計測)APIは、アプリケーション内で特定のイベントが発生したときに通知の受信を可能にするフックを提供します。Railsには、サブスクライブ可能な組み込みのイベントを多数提供しています。フレームワーク用フックのリストは以下にあります。

参考: §3 Railsフレームワーク用フック -- Active Support Instrumentation で計測 - Railsガイド

ここに最近追加されたのがtransaction.active_recordイベントであり、これはActive Recordの管理するトランザクションが発生したときにトリガーされます。これは、パフォーマンス監視や最適化のためにデータベーストランザクションをトラッキング・分析する監視システム(New Relicなど)を構築する場合に特に有用です。

このイベントのペイロードには、:connection:outcome(結果)、詳細タイミングが含まれます。:connectionは、トランザクションが発生したデータベースがどれなのかを特定するときに便利で、特にマルチデータベース環境で有用です。:outcomeはトランザクションの結果を示すもので、以下のいずれかとなります。

  • :commit
  • :rollback
  • :restart
  • :incomplete

これを利用するには、config/initializers/events.rbイニシャライザで以下のようにイベントをサブスクライブします。

ActiveSupport::Notifications.subscribe(
  "transaction.active_record"
) do |event|
  MetricsLogger.record_transaction(event.payload)
end

上の例のMetricLoggerは、トランザクションの詳細を記録する責務を担っています。これで、遅いトランザクションを分析して報告し、それを元に適切な措置を取れるようになります。これはinstrumentationのニーズに合わせて変更できます。

詳しくは以下のプルリクをご覧ください。

関連記事

Rails 8: 組み込みのレート制限APIを導入(翻訳)

Rails: Solid Queueで重要なUPDATE SKIP LOCKEDを理解する(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。