Help us learn about your current experience with the documentation. Take the survey.
使用 Marginalia 的数据库查询注释
Marginalia gem 用于向 ActiveRecord 生成的 PostgreSQL 查询中添加包含应用程序相关上下文信息的查询注释。
这对于将有问题的查询追溯到应用程序源代码非常有用。
在值班事件期间,工程师可以通过注释获取查询的完整上下文及其应用程序源代码。
注释中的元数据信息
从 Rails 生成的查询在注释中包含以下元数据:
applicationcorrelation_idendpoint_iddb_config_databaseline
从 Sidekiq 工作进程生成的查询在注释中包含以下元数据:
applicationjidcorrelation_idendpoint_iddb_config_databaseline
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