InfoGrab DocsInfoGrab Docs

데이터베이스 쿼리 주석

요약

ActiveRecord::QueryLogs 는 ActiveRecord가 생성한 PostgreSQL 쿼리에 애플리케이션 관련 컨텍스트 정보를 담은 쿼리 주석을 추가하는 데 사용합니다. 문제가 되는 쿼리를 애플리케이션 소스까지 추적하는 데 매우 유용합니다.

ActiveRecord::QueryLogs 는 ActiveRecord가 생성한 PostgreSQL 쿼리에 애플리케이션 관련 컨텍스트 정보를 담은 쿼리 주석을 추가하는 데 사용합니다.

문제가 되는 쿼리를 애플리케이션 소스까지 추적하는 데 매우 유용합니다.

온콜 대응 중인 엔지니어는 주석만으로 쿼리와 그 애플리케이션 소스의 전체 컨텍스트를 파악할 수 있습니다.

주석에 포함되는 메타데이터 정보#

Rails에서 생성된 쿼리의 주석에는 다음 메타데이터가 포함됩니다.

  • application
  • correlation_id
  • endpoint_id
  • db_config_database
  • line

Sidekiq 워커에서 생성된 쿼리의 주석에는 다음 메타데이터가 포함됩니다.

  • application
  • jid
  • correlation_id
  • endpoint_id
  • db_config_database
  • line

endpoint_id는 애플리케이션의 모든 엔드포인트를 표현할 수 있는 단일 필드입니다.

  • Rails 컨트롤러에서는 컨트롤러와 액션입니다. 예를 들면 Projects::BlobController#show 입니다.
  • Grape API 엔드포인트에서는 라우트입니다. 예를 들면 /api/:version/users/:id 입니다.
  • Sidekiq 워커에서는 워커 클래스 이름입니다. 예를 들면 UserStatusCleanup::BatchWorker 입니다.

db_config_database는 database.yml의 데이터베이스 설정 해시에 있는 database 필드를 나타내는 단일 필드입니다.

line은 추가 오버헤드가 발생하므로 프로덕션 로그에는 포함되지 않습니다. CI에서도 기본적으로 비활성화돼 있으며, QUERY_LOG_LINE=true로 활성화할 수 있습니다.

주석이 포함된 쿼리 예시는 다음과 같습니다.

  • Rails:

    /*application:web,correlation_id:01EZVMR923313VV44ZJDJ7PMEZ,endpoint_id:Projects::BlobController#show,db_config_database:gitlabhq_production*/ SELECT "routes".* FROM "routes" WHERE "routes"."source_id" = 75 AND "routes"."source_type" = 'Namespace' LIMIT 1
    
  • Grape:

    /*application:web,correlation_id:01EZVN0DAYGJF5XHG9N4VX8FAH,endpoint_id:/api/:version/users/:id,db_config_database:gitlabhq_production*/ 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,db_config_database:gitlabhq_production,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
    

데이터베이스 쿼리 주석

GitLab v19.4
원문 보기

요약

ActiveRecord::QueryLogs 는 ActiveRecord가 생성한 PostgreSQL 쿼리에 애플리케이션 관련 컨텍스트 정보를 담은 쿼리 주석을 추가하는 데 사용합니다. 문제가 되는 쿼리를 애플리케이션 소스까지 추적하는 데 매우 유용합니다.

ActiveRecord::QueryLogs 는 ActiveRecord가 생성한 PostgreSQL 쿼리에 애플리케이션 관련 컨텍스트 정보를 담은 쿼리 주석을 추가하는 데 사용합니다.

문제가 되는 쿼리를 애플리케이션 소스까지 추적하는 데 매우 유용합니다.

온콜 대응 중인 엔지니어는 주석만으로 쿼리와 그 애플리케이션 소스의 전체 컨텍스트를 파악할 수 있습니다.

주석에 포함되는 메타데이터 정보#

Rails에서 생성된 쿼리의 주석에는 다음 메타데이터가 포함됩니다.

  • application
  • correlation_id
  • endpoint_id
  • db_config_database
  • line

Sidekiq 워커에서 생성된 쿼리의 주석에는 다음 메타데이터가 포함됩니다.

  • application
  • jid
  • correlation_id
  • endpoint_id
  • db_config_database
  • line

endpoint_id는 애플리케이션의 모든 엔드포인트를 표현할 수 있는 단일 필드입니다.

  • Rails 컨트롤러에서는 컨트롤러와 액션입니다. 예를 들면 Projects::BlobController#show 입니다.
  • Grape API 엔드포인트에서는 라우트입니다. 예를 들면 /api/:version/users/:id 입니다.
  • Sidekiq 워커에서는 워커 클래스 이름입니다. 예를 들면 UserStatusCleanup::BatchWorker 입니다.

db_config_database는 database.yml의 데이터베이스 설정 해시에 있는 database 필드를 나타내는 단일 필드입니다.

line은 추가 오버헤드가 발생하므로 프로덕션 로그에는 포함되지 않습니다. CI에서도 기본적으로 비활성화돼 있으며, QUERY_LOG_LINE=true로 활성화할 수 있습니다.

주석이 포함된 쿼리 예시는 다음과 같습니다.

  • Rails:

    /*application:web,correlation_id:01EZVMR923313VV44ZJDJ7PMEZ,endpoint_id:Projects::BlobController#show,db_config_database:gitlabhq_production*/ SELECT "routes".* FROM "routes" WHERE "routes"."source_id" = 75 AND "routes"."source_type" = 'Namespace' LIMIT 1
    
  • Grape:

    /*application:web,correlation_id:01EZVN0DAYGJF5XHG9N4VX8FAH,endpoint_id:/api/:version/users/:id,db_config_database:gitlabhq_production*/ 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,db_config_database:gitlabhq_production,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