Rails

【Rails7】SQLの出力元を調査することができる「query_log_tags」を使ってみる

Rails

こんにちは、千葉(@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.rbconfig.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
Rails
【Rails】秒速でアプリケーション開発できるscaffoldの使い方を簡単にまとめてみた手っ取り早くアプリケーションを開発することができるscaffold(スキャフォールド)の使い方について簡単に解説しています。新しい機能実装をテストしてみたい、すぐにでもアプリケーションを立ち上げたいといった場合に便利な機能なので、ぜひ覚えておきましょう。...

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」を導入することでログが追いやすくなり、負荷対策の方針をいくつか見出せそうだと感じました。興味のある方はぜひ導入してみてください。