添加Sidekiq工作上下文ActiveRecord查询日志标记

2022年10月25日 - - - - - - 2分钟阅读
添加Sidekiq工作上下文ActiveRecord查询日志标记

任何曾与Rails对于任何大量的时间可能知道Rails性能往往是紧密耦合的数据库查询性能。出于这个原因,是极具价值的和你当地的交朋友慢速查询日志,你可以确定最长的查询,需要调优。所以,一旦你确定了你慢查询(ies),是时候得到优化,对吧?没有那么快。首先你需要找出来在代码中这个查询的方法是生成。如果你做的事情Rails的方式和使用ActiveRecord生成这些查询,可以很艰难,因为你不能只是grep发现查询的代码。

输入查询日志标记

Rails 7添加一个惊人的新功能,查询日志标记。这一特性,当打开(默认是关闭),将评论添加到年底每个查询显示一些上下文帮助你追踪,查询是从哪里来的。

——从my_table_with_bajillions_of_records SELECT *之前;——从my_table_with_bajillions_of_records SELECT *后;/ *应用:MyApp,控制器:my_controller行动:my_action * /

这可以节省很多时间,试图找出什么是生成一个特别慢查询。打开它,你只需要添加以下配置/ application.rb:

config.active_record。query_log_tags_enabled = true

像往常一样Rails有理智的违约的。所以你会得到以下自动上下文在每个查询:

  1. 应用程序名称
  2. 控制器名称
  3. 控制器动作
  4. ActiveJob类

对于大多数应用程序来说,这是你所需要的。然而,我们注意到,我们的一些最查询包括在评论,只有应用程序名称如下:

从my_table_with_bajillions_of_records SELECT *;/ *应用:MyApp * /

好了,欣赏,Rails。很确定我已经知道查询来自我的程序,但由于。

那么问题是什么呢?为什么我们没有获得更多在这些查询上下文?

Sidekiq

我们的忠实粉丝Sidekiq在BetterUp。事实上,我们喜欢它,我们用很多的企业和专业功能。现在,为了使用一些更高级的功能(如大部分排队你需要使用Sidekiq::工作直接API,而不是通过Rails ActiveJob抽象。这是好,但也许你会看到这是:因为我们没有使用ActiveJob,我们没有得到那份工作名称自动查询日志中的标签。

那么,我们如何解决呢?ActiveSupport这样::ExecutionContext救援!事实证明,我们可以把任何我们想要的执行上下文,然后配置查询日志标记包括那件事在我们的查询。我们生了一个非常简单的Sidekiq中间件看起来像这样:

模块SidekiqMiddleware类ActiveSupportExecutionContext def调用(_worker_class、工作、_queue &) #如果设置了“包装”,这是一个“ActiveJob”已在执行上下文(“包装”).present sidekiq_job_class =工作?吗?零:工作(类的)。to_s ActiveSupport这样::ExecutionContext。集(sidekiq_job_class: sidekiq_job_class &)端端端

然后我们添加以下配置/ application.rb:

config.active_record。query_log_tags < <: sidekiq_job_class

和大作。现在我们有Sidekiq工作类的名字在我们查询!

从my_table_with_bajillions_of_records SELECT *;/ *应用:MyApp, sidekiq_job_class: MySidekiqJob * /

关于作者

布莱恩2017年加入BetterUp作为一个完整的堆栈高级工程师。他住在明尼阿波利斯地区与他的妻子和两个儿子。布莱恩是一个热爱家庭时间,徒步旅行、骑自行车、视频游戏、和串行优化。

太棒了!接下来,完全访问BetterUp成套检测产品的博客。
欢迎回来!你已经成功地登录。
您已经成功订阅BetterUp产品博客。
成功!你的帐户是完全激活,你现在可以访问所有内容。
成功!您的账单信息已经更新。
你的账单没有更新。
Baidu
map