Help us learn about your current experience with the documentation. Take the survey.

使用 Marginalia 的数据库查询注释

Marginalia gem 用于向 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 不会出现在生产日志中。

带注释的查询示例:

  • Rails:

    /*application:web,controller:blob,action:show,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