こんにちは、千葉(@yoshi_chibaaa) です。
今回はRails7から追加された、SQLの出力元を調査することができる「query_log_tags」を使ってみたので紹介したいと思います。「query_log_tags」を導入することでスロークエリの発生箇所を特定しやすくなり、ログが見やすくなるため、デバッグを行う際に役立ちます。
query_log_tagsとは
「query_log_tags」とは、SQLのログにコントローラ名やアクション名、(ActiveJobを使用している場合)ジョブ名などのコメントを含めることができる機能です。この機能はRails7で追加されました。
TRANSACTION (0.3ms) BEGIN /*application:QueryLogTagsDemo,controller:users,action:create,database:query_log_tags_demo_development,app_version:1.0.0*/
↳ app/controllers/users_controller.rb:27:in `block in create'
User Create (3.7ms) INSERT INTO `users` (`name`, `name_kana`, `created_at`, `updated_at`) VALUES ('SQLくん', 'エスキューエルクン', '2024-05-27 06:16:42.758162', '2024-05-27 06:16:42.758162') /*application:QueryLogTagsDemo,controller:users,action:create,database:query_log_tags_demo_development,app_version:1.0.0*/
↳ app/controllers/users_controller.rb:27:in `block in create'
TRANSACTION (5.3ms) COMMIT /*application:QueryLogTagsDemo,controller:users,action:create,database:query_log_tags_demo_development,app_version:1.0.0*/
使い方
新規アプリケーションを作成しながら「query_log_tags」機能を試してみます。
新規アプリケーションの作成
% rails new query-log-tags-demo -d mysql
% cd query-log-tags-demo
% rails db:create
- アプリケーション名: query-log-tags-demo
- Ruby: 3.2.2
- Rails: 7.0.8.3
- DB: MySQL
query_log_tags機能の有効化
config/application.rb
にconfig.active_record.query_log_tags_enabled = true
の記述を追加するだけで「query_log_tags」機能が有効化されます。
module QueryLogTagsDemo
class Application < Rails::Application
# 省略
config.active_record.query_log_tags_enabled = true
end
end
デフォルトでは、以下の内容がSQLのコメントに付与されます。
- application: アプリケーション名
- controller: コントローラ名
- action: アクション名
- job: ジョブ名
UserのCRUDを作成
Sccafoldの機能を用いて、Userに関するCRUDを作成します。
% rails g scaffold User name:string name_kana:string
% rails db:migrate

SQLログの確認
サーバーを起動し、ユーザー一覧画面(http://localhost:3000/users)にアクセスしてみます。出力されるSQLにコメントが付与されていることが確認できるかと思います。
User Load (0.8ms) SELECT `users`.* FROM `users` /*application:QueryLogTagsDemo,controller:users,action:index*/
同様にユーザー新規作成ページ(http://localhost:3000/users/new)から新規ユーザーを作成した際も、出力されるSQLにコメントが付与されているはずです。
TRANSACTION (0.2ms) BEGIN /*application:QueryLogTagsDemo,controller:users,action:create*/
↳ app/controllers/users_controller.rb:27:in `block in create'
User Create (0.6ms) INSERT INTO `users` (`name`, `name_kana`, `created_at`, `updated_at`) VALUES ('SQLさん', 'エスキューエルサン', '2024-05-27 05:52:10.263525', '2024-05-27 05:52:10.263525') /*application:QueryLogTagsDemo,controller:users,action:create*/
↳ app/controllers/users_controller.rb:27:in `block in create'
TRANSACTION (1.4ms) COMMIT /*application:QueryLogTagsDemo,controller:users,action:create*/
SQLコメントのカスタマイズ
SQLに付与されるコメントはquery_log_tags
で指定することができます。
試しにquery_log_tags
を以下のように指定してみます。
module QueryLogTagsDemo
class Application < Rails::Application
# 省略
config.active_record.query_log_tags_enabled = true
config.active_record.query_log_tags = [
:application,
:controller,
:action,
:database,
{
app_version: "1.0.0",
current_user: -> { current_user.email if defined?(current_user)} # 今回はここは出力されません
}
]
end
end
その後、ユーザー新規作成ページ(http://localhost:3000/users/new)から新規ユーザーを作成すると、出力されるSQLに指定したコメントが付与されているはずです。
TRANSACTION (0.3ms) BEGIN /*application:QueryLogTagsDemo,controller:users,action:create,database:query_log_tags_demo_development,app_version:1.0.0*/
↳ app/controllers/users_controller.rb:27:in `block in create'
User Create (3.7ms) INSERT INTO `users` (`name`, `name_kana`, `created_at`, `updated_at`) VALUES ('SQLくん', 'エスキューエルクン', '2024-05-27 06:16:42.758162', '2024-05-27 06:16:42.758162') /*application:QueryLogTagsDemo,controller:users,action:create,database:query_log_tags_demo_development,app_version:1.0.0*/
↳ app/controllers/users_controller.rb:27:in `block in create'
TRANSACTION (5.3ms) COMMIT /*application:QueryLogTagsDemo,controller:users,action:create,database:query_log_tags_demo_development,app_version:1.0.0*/
指定できるオプションは以下になります。
- application: アプリケーション名
- pid: プロセスID
- socket: ソケット
- db_host: DBホスト
- database: DB名
- controller: コントローラ名
- action: アクション名
- namespaced_controller: namespaceされたコントローラ名
- job: ジョブ名
まとめ
- 「query_log_tags」とは、SQLのログにコントローラ名やアクション名、(ActiveJobを使用している場合)ジョブ名などのコメントを含めることができる機能
- 「query_log_tags」はRails7から追加された機能
- 「query_log_tags」を使用することでスロークエリやエラー原因の調査に役立つ
- 出力されるコメントは
query_log_tags
で指定することが可能
参考
今回はSQLの出力元を調査することができる「query_log_tags」について紹介しました。「query_log_tags」を導入することでログが追いやすくなり、負荷対策の方針をいくつか見出せそうだと感じました。興味のある方はぜひ導入してみてください。