Database query comments with Marginalia
마가넬리아 젬은 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*/ "routes"에서 "routes"."source_id" = 75 및 "routes"."source_type" = 'Namespace'인 것을 선택하기 위해 "routes".*를 선택합니다. 1
-
Grape:
/*application:web,correlation_id:01EZVN0DAYGJF5XHG9N4VX8FAH,endpoint_id:/api/:version/users/:id*/ "users"에서 "user_follow_users"를 INNER JOIN하여 "users"."id" = "user_follow_users"."followee_id"인 것을 선택하기 위해 "users"의 COUNT(*)를 선택합니다. 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'*/ "user_statuses"에서 "user_statuses"."clear_status_at" <= $2인 것을 선택하기 위해 "user_statuses"."clear_status_at"맨 위에서 $1을 선택합니다. 3