sqlcommenterをRuby on Railsのデモアプリケーションで動かしてみる

Googleが提供しているオープンソースのツールで、ORMが生成するSQLの調査を容易にしてくれるらしいので使ってみました。
具体的にはログなどに、コメントが含まれるようになり、ORMが生成したSQL文はどのコードで生成されたものかを知ることができるみたいです。

今回Rails APIモードのデモアプリケーションが用意されているので、どのようなコメントが出力されるか動かして確認してみます。
[google/sqlcommenter | GitHub](https://github.com/google/sqlcommenter)

sqlcommenterが対応する言語、フレームワーク、DBは以下

### 言語
- Ruby
- Python
- JavaScript
- Node.js
- Java

### フレームワーク
- Ruby on Rails
- Flask
- Django
- Express
- Knex.js
- etc...etc

### DB
- MySQL
- MariaDB
- PostgreSQL
- SQLite
- Google Cloud SQL


## デモRailsアプリケーションで試してみる
[google/sqlcommenter | Rails demo](https://github.com/google/sqlcommenter/tree/master/ruby/sqlcommenter-ruby/sqlcommenter_rails_demo#sqlcommenter_rails-demo)

RailsのAPIデモアプリケーションでとりあえずsqlcommenterがどんなものかを体験ができるみたいです。
ただ、sqlcommenter_railsはrubygemsではリリースされていないようなので、上記のREADMEの手順に沿って環境構築すればとりあえずは使うことができます。


APIは以下の２つが用意されています。

- Get /posts
- POST /posts

APIを叩くcurl

```bash:bash
curl localhost:3000/posts
```

```bash:bash
curl -X POST localhost:3000/posts -d 'title=my-post'
```


### POST /postsを実行

```bash:bash
curl -X POST localhost:3000/posts -d 'title=my-post'
```

```bash
INSERT INTO "posts" ("title", "created_at", "updated_at") VALUES (?, ?, ?)
 /*action='create',application='SqlcommenterRailsDemo',controller='posts',db_driver='ActiveRecord::ConnectionAdapters::SQLite3Adapter',
 framework='rails_v6.0.3.5',route='/posts', traceparent='00-e71c784d7151a939ef4e8d886a326456-82ad00a116eaa038-01'*/
```

初期設定では以下の情報が出力されるようです。

- action
- application
- controller
- db_driver
- framework
- route
- traceparent

設定を追加することで、出力する情報の変更 / 追加が可能です。



```bash:bash
mkdir config/initializers
touch config/initializers/marginalia.rb
vim config/initializers/marginalia.rb

# 追加
Marginalia::Comment.components = [ :action, :application, :controller_with_namespace, :hostname, :job, :line]
~
~
~
```
Rails serverを再起動して再度curlを実行すると先ほど追加した情報が表示されます

```bash
/*action='create',application='SqlcommenterRailsDemo',controller_with_namespace='PostsController',
hostname='xxxx',line='/app/controllers/posts_controller.rb:25:in `create\''*/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285374/dbcec930-5b18-9dff-b097-1b8ec2e4e6bb.png)



### GET /postsを実行

次にpostの一覧を取得してみます。

```bash:bash
curl localhost:3000/posts
```


```bash
SELECT "posts".* FROM "posts"
/*action='index',application='SqlcommenterRailsDemo',controller_with_namespace='PostsController',
hostname='xxxx',line='/app/controllers/posts_controller.rb:19:in `index\''*/
```

先程のPOSTと同じくactionや実際にSQL文が生成されたコードの位置を出力してくれました。

posts_controller.rbは以下のようになっています。

```ruby:app/controllers/posts_controller.rb
#...
17 class PostsController < ApplicationController
18   def index
19    render json: Post.all
20   end
21
22   def create
23     title = params[:title].to_s.strip
24     head :bad_request if title.empty?
25     render json: Post.create!(title: title)
26   end
27  end
```

## 参考

- [Introducing Sqlcommenter: An open source ORM auto-instrumentation library](https://cloud.google.com/blog/topics/developers-practitioners/introducing-sqlcommenter-open-source-orm-auto-instrumentation-library)
- [日本語 Introducing Sqlcommenter: An open source ORM auto-instrumentation library](https://cloud.google.com/blog/ja/products/databases/introducing-sqlcommenter-open-source-orm-auto-instrumentation-library)
- [google/sqlcommenter | GitHub](https://github.com/google/sqlcommenter)
- [sqlcommenter_rails demo | GitHub](https://github.com/google/sqlcommenter/tree/master/ruby/sqlcommenter-ruby/sqlcommenter_rails_demo#sqlcommenter_rails-demo)
- [https://google.github.io/sqlcommenter/faq/](https://google.github.io/sqlcommenter/faq/)
- [【Rails】sqlcommenterのデモアプリを試してみた](https://simple-minds-think-alike.hatenablog.com/entry/sqlcommenter-rails)