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