接続プールごとのクエリログタグ設定を拡張

rails/rails

Rails 7.2 以降、database.ymlquery_log_tags キーで接続プール単位のタグ付け制御が可能になり、フォーマットやコメントの前置・後置を個別に上書きできるようになりました。

背景

接続プールごとに異なるタグ付けが必要になるケースが増えているという背景が本変更の出発点です。従来は config.active_record.query_log_tags_formatconfig.active_record.query_log_tags_prepend_comment で全プールに対して一律のフォーマットとコメント位置を決めていましたが、マルチデータベース構成ではデータベースごとに適切なフォーマットやコメントの有無が求められました。そこで query_log_tags キーをハッシュ化し、formatprepend_comment をプール単位で上書きできる設計が導入されました。これにより、グローバル設定を保持しつつ、個別プールで柔軟に振る舞いを変えることが可能になります。

技術的な変更

設定取得ロジックがハッシュ対応へ拡張されました。activerecord/lib/active_record/database_configurations/hash_config.rbquery_log_tags_config メソッドが追加され、query_log_tags キーの値(ハッシュまたは false)を取得します。続いて query_log_tags_formatquery_log_tags_prepend_comment がそれぞれハッシュ内の :format:prepend_comment を参照するよう変更されました。

@@
       def query_log_tags_config # :nodoc:
         configuration_hash[:query_log_tags]
       end

       def query_log_tags_format # :nodoc:
         return @query_log_tags_format if defined? @query_log_tags_format
-
-        @query_log_tags_format = configuration_hash[:query_log_tags_format]&.to_sym
+        config = query_log_tags_config
+        @query_log_tags_format = (config[:format]&.to_sym if config.is_a?(Hash))
       end

       def query_log_tags_prepend_comment # :nodoc:
         return @query_log_tags_prepend_comment if defined? @query_log_tags_prepend_comment
-
-        @query_log_tags_prepend_comment = (config[:prepend_comment] if config.is_a?(Hash))
+        config = query_log_tags_config
+        @query_log_tags_prepend_comment = (config[:prepend_comment] if config.is_a?(Hash))
       end

タグ付与ロジックがプール設定に応じて分岐するよう改修されました。activerecord/lib/active_record/query_logs.rb では、query_log_tagsfalse の場合はタグ付与をスキップし、formatprepend_comment の取得は新たに追加されたメソッドで行います。コメントの前置・後置もプールごとに上書き可能となり、従来のグローバル設定をそのまま利用したまま個別挙動をカスタマイズできます。

@@
   # The format can also be overridden per connection pool through the +query_log_tags+
   # key of a +database.yml+ entry. Connections checked out from that pool use the
   # configured +format+, while setting +query_log_tags+ to +false+ instead opts the
   # pool out of tagging entirely. Pools without any explicit configuration fall back
   # to the global defaults:
@@
-    with_query_log_tags_format("sqlcommenter") do |connection|
+    with_db_config(query_log_tags: { format: "sqlcommenter" }) do |connection|
@@
-    with_query_log_tags_format(nil) do |connection|
+    with_db_config do |connection|
@@
+    with_db_config(query_log_tags: false) do |connection|
+      assert_equal "select 1", ActiveRecord::QueryLogs.call("select 1", connection)
+    end

CHANGELOG に新機能が追記され、ユーザーへの可視化が行われました。activerecord/CHANGELOG.md では「Allow query log tags to be configured per connection pool」として、formatprepend_comment のハッシュ指定、タグ付けの無効化オプションが記載されています。

@@ -67,19 +67,29 @@
-    *   Allow the query log tags format to be configured per connection pool.
+    *   Allow query log tags to be configured per connection pool.
@@
-        query_log_tags_format: sqlcommenter
+        query_log_tags:
+          format: sqlcommenter
+          prepend_comment: false
+      replica:
+        database: replica
+        replica: true
+        query_log_tags: false

設計判断

既存キーの拡張で後方互換性を維持する方針が採用されました。新たに query_log_tags_format キーを別に追加する代わりに、既存の query_log_tags キーをハッシュ化し、formatprepend_comment をサブキーとして扱うことで、query_log_tags = true/false の既存挙動を壊さずに機能追加が実現されています。false がプール全体のタグ付け無効化として解釈される点も、設定ミスを防ぐシンプルな設計といえます。

設定取得の集中化によりコードベースのシンプル化が図られました。hash_config.rb に集約されたアクセサメソッドは、プールごとの設定取得を一元化し、query_logs.rb からはシンプルな呼び出しだけで済む構造になっています。この分離はテスト容易性と将来の拡張性を高める意図です。

テストが拡充され、振る舞いの明確化が保証されました。query_logs_test.rbwith_db_config ヘルパを用いた per‑pool の format 上書き、prepend_comment 上書き、タグ付け無効化のテストが追加され、実装とドキュメントの乖離が防がれています。テスト範囲の拡大はリリース時のリグレッションリスク低減に直結します。

まとめ

本PRは、接続プール単位でクエリログタグのフォーマット、コメント前置/後置、さらにはタグ付けの無効化までを柔軟に設定できる機能を追加しました。既存キーのハッシュ化とメソッドの集中化により後方互換性とコードの可読性を保ちながら、マルチデータベース環境での運用性が大幅に向上します。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
04d5c202

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文がタイトル直下にあり、背景、技術的詳細、設計判断(任意)、まとめの順で構成されているため、総論→各論→結論の3部構成が適切に実装されています。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは `ruby:ファイルパス` 形式で正しく記述されていますが、PRリンクの記法が `[PR #57641](URL)` となっており、要求された `[#57641](URL)` 形式になっていません。リンクテキストの形式を統一してください。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Rails の内部設定やコード変更に関する専門的な記述が中心で、エンジニア向けの適切なレベルです。初心者向けの過度な解説はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論パラグラフで要旨を示し、続く段落が具体的事実・コードを示し、最後にまとめ的段落で結論を述べています。段落は1〜5文程度でトピックセンテンスが先頭に配置され、空行で分割されています。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは提供された Diff と一致しており、削除行と追加行が正しく `-` `+` 記号で示されています。コードのファイルパスも Diff と合致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`query_log_tags`, `prepend_comment`, `hash_config.rb` などの用語は PR と Diff に記載された通り正しく使用されており、誤用は見られません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な変更点や設計判断は Diff と PR の記述に基づき正確に説明されています。因果関係や導入理由も妥当です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の全ての主張は PR のタイトル、説明、Diff に裏付けられており、未根拠の推測や外部知識の付加はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #57641 が正しく記載されており、他に数値情報は提示されていません。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の内容(per-pool query log tags の拡張)を適切に要約しており、矛盾はありません。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事内に PR には記載されていない LTS 版やリリーススケジュール等の外部知識は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現は特に使用されておらず、PR の記述と食い違う表現はありません。