gpt4 book ai didi

ruby-on-rails - 将调用者应用程序堆栈跟踪与每个 sql 查询一起记录

转载 作者:行者123 更新时间:2023-12-04 03:45:37 28 4
gpt4 key购买 nike

我在寻找项目中某些 sql 查询的根源时遇到了问题。

为了对其进行故障排除,我想将应用程序调用者堆栈与触发的每个查询一起记录下来。

我在谷歌上没有找到开箱即用的解决方案,所以我决定自己制作可靠且可重用的解决方案。

通过跟踪堆栈,我找到了所有查询都通过的地方 Mysql2Adapter.execute方法(我当然是指 mysql 的情况)

我在 rails initializers 目录中重写了这个方法,下面列出了带有调用者堆栈日志记录的猴子补丁:

module ActiveRecord
module ConnectionAdapters
class Mysql2Adapter < AbstractAdapter
def execute(sql, name = nil)
@connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
if name == :skip_logging
@connection.query(sql)
else
# caller logging
log_stack
# EO
log(sql, name) { @connection.query(sql) }
end
rescue ActiveRecord::StatementInvalid => exception
if exception.message.split(":").first =~ /Packets out of order/
raise ActiveRecord::StatementInvalid, "'Packets out of order'... bindings."
else
raise
end
end

private

def log_stack
#If marazmuz will take over i would not like to spam logs in production
return unless Rails.env == 'development'
#Regex with rails directory path would be helpful in taking app stack trace only
regexp = Regexp.new( Rails.root.to_s )
res = ''
caller.each_with_index{|x,i|
#We'll took only items containing Rails.root and we are not interested in current stack position, so skip i == 0
res << "#{ '#'+i.to_s}:\t#{ x.sub(regexp,'') }\n" if x =~ regexp && i != 0
}
Rails.logger.info( res ) unless res.blank?

end

end
end
end

最后将以下输出写入日志
\#4:    /app/models/contact.rb:57:in `get_raw_cols'
\#5: /app/models/contact.rb:65:in `stat_cols'
\#6: /app/components/contacts_tab.rb:85:in `configuration'
\#19: /app/views/welcome/index.html.erb:1:in `_app_views_welcome_index_html_erb___736761216545810182_25680180__4434876849107960087'
SQL (0.1ms) SELECT `contacts`.`activity` FROM `contacts`

有没有人:
  • 知 Prop 有相同功能的开箱即用的分析解决方案吗?
  • 有没有遇到过类似的问题,你是如何解决的?

  • 对上述代码的任何评论/改进也非常感谢。
    提前致谢。

    最佳答案

    对于 future 的 Google 员工:active_record_query_trace gem 也可以做到这一点。

    关于ruby-on-rails - 将调用者应用程序堆栈跟踪与每个 sql 查询一起记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7752847/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com