Attach comments to ActiveRecord's SQL queries
Latest commit e019caf Aug 15, 2016 @arthurnn arthurnn test on 2.3
Failed to load latest commit information.
lib Check for around_action before using around_filter Apr 23, 2016
test Merge pull request #35 from codekitchen/dev/postgres Feb 24, 2015
.gitignore Remove Gemfile.lock file Dec 2, 2013
.ruby-version update ruby version Nov 5, 2015
.travis.yml test on 2.3 Aug 15, 2016
Gemfile AR dont work with mysql2 0.4 version Nov 5, 2015
LICENSE split out readme, license Mar 11, 2012 Update Readme accoring… Feb 27, 2016
Rakefile Handle pg test DB not already existing when trying to drop it Apr 29, 2012
init.rb Rename to marginalia Apr 24, 2012

marginalia Build Status

Attach comments to your ActiveRecord queries. By default, it adds the application, controller, and action names as a comment at the end of each query.

This helps when searching log files for queries, and seeing where slow queries came from.

For example, once enabled, your logs will look like:

Account Load (0.3ms)  SELECT `accounts`.* FROM `accounts` 
WHERE `accounts`.`queenbee_id` = 1234567890 

You can also use these query comments along with a tool like pt-query-digest to automate identification of controllers and actions that are hotspots for slow queries.

This gem was created at 37signals. You can read more about how we use it on our blog.

This has been tested and used in production with both the mysql and mysql2 gems, tested on Rails 2.3.5 through 4.1.x. It has also been tested for sqlite3 and postgres.

Patches are welcome for other database adapters.


For Rails 3.x and 4.x:

# Gemfile
gem 'marginalia'

For Rails 2.x:

If using cached externals, add to your config/externals.yml file.

Or, if your prefer using config.gem, you can use:

config.gem 'marginalia'

Finally, if bundled, you'll need to manually run the initialization step in an initializer, e.g.:

# Gemfile
gem 'marginalia', :require => false

require 'marginalia'


Optionally, you can set the application name shown in the log like so in an initializer (e.g. config/initializers/marginalia.rb):

Marginalia.application_name = "BCX"

For Rails 3 applications, the name will default to your Rails application name. For Rails 2 applications, "rails" is used as the default application name.

You can also configure the components of the comment that will be appended, by setting Marginalia::Comment.components. By default, this is set to:

Marginalia::Comment.components = [:application, :controller, :action]

Which results in a comment of application:#{application_name},controller:#{},action:#{action_name}.

You can re-order or remove these components. You can also add additional comment components of your desire by defining new module methods for Marginalia::Comment which return a string. For example:

module Marginalia
  module Comment
    def self.mycommentcomponent

Marginalia::Comment.components = [:application, :mycommentcomponent]

Which will result in a comment like application:#{application_name},mycommentcomponent:TEST The calling controller is available to these methods via @controller.

Marginalia ships with :application, :controller, and :action enabled by default. In addition, implementation is provided for:

  • :line (for file and line number calling query). :line supports a configuration by setting a regexp in Marginalia::Comment.lines_to_ignore to exclude parts of the stacktrace from inclusion in the line comment.
  • :controller_with_namespace to include the full classname (including namespace) of the controller.
  • :job to include the classname of the ActiveJob being performed.
  • :hostname to include Socket.gethostname.
  • :pid to include current process id.

Pull requests for other included comment components are welcome.


Start by bundling and creating the test database:

rake db:mysql:create
rake db:postgresql:create

Then, running rake will run the tests on all the database adapters (mysql, mysql2, postgresql and sqlite):