Marginaliaによるデータベースクエリコメント

Marginalia gemは、ActiveRecordが生成するPostgreSQLクエリに、アプリケーション関連のコンテキスト情報を含むクエリコメントを追加するために使用します。

問題のあるクエリをアプリケーションソースまでトレースするのに非常に便利です。

オンコール中のエンジニアは、コメントからクエリとそのアプリケーションソースの完全なコンテキストを得ることができます。

コメント内のメタデータ情報

Railsから生成されたクエリには、コメントに以下のメタデータが含まれます:

  • application
  • correlation_id
  • endpoint_id
  • line

Sidekiqワーカーから生成されたクエリには、コメントに以下のメタデータが含まれます:

  • application
  • jid
  • correlation_id
  • endpoint_id
  • line

endpoint_id は単一のフィールドで、アプリケーション内の任意のエンドポイントを表すことができます:

  • Railsコントローラの場合は、コントローラとアクションです。たとえば、Projects::BlobController#show.
  • Grape API エンドポイントの場合はルートとなります。たとえば/api/:version/users/:id
  • Sidekiqワーカーの場合は、ワーカークラス名です。例えば、UserStatusCleanup::BatchWorker

line は、追加のオーバーヘッドが必要なため、プロダクションログには存在しません。

コメント付きクエリの例:

  • Rails:

     /*application:web,controller:blob,action:show,correlation_id:01EZVMR923313VV44ZJDJ7PMEZ,endpoint_id:Projects::BlobController#show*/ SELECT "routes".* FROM "routes" WHERE "routes"."source_id" = 75 AND "routes"."source_type" = 'Namespace' LIMIT 1
    
  • グレープ

     /*application:web,correlation_id:01EZVN0DAYGJF5XHG9N4VX8FAH,endpoint_id:/api/:version/users/:id*/ SELECT COUNT(*) FROM "users" INNER JOIN "user_follow_users" ON "users"."id" = "user_follow_users"."followee_id" WHERE "user_follow_users"."follower_id" = 1
    
  • Sidekiq:

     /*application:sidekiq,correlation_id:df643992563683313bc0a0288fb55e23,jid:15fbc506590c625d7664b074,endpoint_id:UserStatusCleanup::BatchWorker,line:/app/workers/user_status_cleanup/batch_worker.rb:19:in `perform'*/ SELECT $1 AS one FROM "user_statuses" WHERE "user_statuses"."clear_status_at" <= $2 LIMIT $3