Ruby on Rails
Introduction
sqlcommenter_rails adds comments to your SQL statements.
It is powered by marginalia and also adds OpenCensus information to the comments if you use the opencensus gem.
sqlcommenter_rails configures marginalia and marginalia-opencensus to match the SQLCommenter format.
Installation
Add this line to your application’s Gemfile
gem 'sqlcommenter_rails'
Then run bundle
and restart your Rails server.
To enable OpenCensus support, add the opencensus
gem to your Gemfile, and add the following line in the beginning of config/application.rb
:
require 'opencensus/trace/integrations/rails'
Usage
All of the SQL queries initiated by the application will now come with comments!
Fields
The following fields will be added to your SQL statements as comments:
Field | Included by default? | Description | Provided by |
---|---|---|---|
action | ✔ | Controller action name | marginalia |
application | ✔ | Application name | marginalia |
controller | ✔ | Controller name | marginalia |
controller_with_namespace | ❌ | Full classname (including namespace) of the controller | marginalia |
database | ❌ | Database name | marginalia |
db_driver | ✔ | Database adapter class name | sqlcommenter_rails |
db_host | ❌ | Database hostname | marginalia |
framework | ✔ | rails_v followed by Rails::VERSION | sqlcommenter_rails |
hostname | ❌ | Socket.gethostname | marginalia |
job | ❌ | Classname of the ActiveJob being performed | marginalia |
line | ❌ | File and line number calling query | marginalia |
pid | ❌ | Current process id | marginalia |
route | ✔ | Request’s full path | sqlcommenter_rails |
socket | ❌ | Database socket | marginalia |
traceparent | ❌ | The W3C TraceContext.Traceparent field of the OpenCensus trace | marginalia-opencensus |
To include the traceparent
field, install the marginalia-opencensus gem and it will be automatically included by default.
To change which fields are included, set Marginalia::Comment.components = [ :field1, :field2, ... ]
in config/initializers/marginalia.rb
as described in the marginalia documentation.
End to end example
A Rails 6 sqlcommenter_rails demo is available at: https://github.com/google/sqlcommenter/tree/master/ruby/sqlcommenter-ruby/sqlcommenter_rails_demo
The demo is a vanilla Rails API application with sqlcommenter_rails and OpenCensus enabled.
First, we create a vanilla Rails application with the following command:
gem install rails -v 6.0.0.rc1 rails _6.0.0.rc1_ new sqlcommenter_rails_demo --api
Then, we add and implement a basic Post
model and controller:
bin/rails g model Post title:text
bin/rails g controller Posts index create
Implement the controller:
# app/controllers/posts_controller.rb class PostsController < ApplicationController def index render json: Post.all end def create title = params[:title].to_s.strip head :bad_request if title.empty? render json: Post.create!(title: title) end end
Configure the routes:
# config/routes.rb Rails.application.routes.draw do resources :posts, only: %i[index create] end
Then, we add sqlcommenter_rails
and OpenCensus:
# Gemfile gem 'opencensus' gem 'sqlcommenter_rails'
# config/application.rb require "opencensus/trace/integrations/rails"
Finally, we run bundle
to install the newly added gems:
bundle
Now, we can start the server:
bin/rails s
In a separate terminal, you can monitor the relevant SQL statements in the server log with the following command:
tail -f log/development.log | grep 'Post '
Results
The demo application has 2 endpoints: GET /posts
and POST /posts
.
GET /posts
curl localhost:3000/posts
Post Load (0.1ms) SELECT "posts".* FROM "posts" /* action='index',application='SqlcommenterRailsDemo',controller='posts', db_driver='ActiveRecord::ConnectionAdapters::SQLite3Adapter', framework='rails_v6.0.0.rc1',route='/posts', traceparent='00-ff19308b1f17fedc5864e929bed1f44e-6ddace73a9debf63-01'*/
POST /posts
curl -X POST localhost:3000/posts -d 'title=my-post'
Post Create (0.2ms) INSERT INTO "posts" ("title", "created_at", "updated_at") VALUES (?, ?, ?) /*action='create',application='SqlcommenterRailsDemo', controller='posts',db_driver='ActiveRecord::ConnectionAdapters::SQLite3Adapter', framework='rails_v6.0.0.rc1',route='/posts', traceparent='00-ff19308b1f17fedc5864e929bed1f44e-6ddace73a9debf63-01'*/