Marginalia를 사용한 데이터베이스 쿼리 주석

마가리아(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".*() 선택하십시오 LIMIT 1
    
  • Grape:

     /*application:web,correlation_id:01EZVN0DAYGJF5XHG9N4VX8FAH,endpoint_id:/api/:version/users/:id*/ "users"에서 "user_follow_users" 조인되어 "user_follow_users"."follower_id" = 1 "user_follow_users".* 수를 선택하십시오
    
  • 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" <= $2 $1() 선택하십시오 LIMIT $3