我在我的production Rails应用程序中遇到了"Mysql2::Error: Lock wait timeout exceeded“错误,我正在寻找调试哪个事务锁定表的时间过长的帮助。据我所知,MySQL有一个“慢查询”日志,但没有慢事务日志。
有没有一种方法可以直接从ActiveRecord记录事务花费多长时间的信息?
发布于 2017-06-14 21:26:44
我的团队将缓慢的事务记录如下:
在lib/slow_transaction_logger.rb中
module SlowTransactionLogger
LOG_IF_SLOWER_THAN_SECONDS = ENV.fetch("LOG_TRANSACTIONS_SLOWER_THAN_SECONDS", "5").to_f
def transaction(*args)
start = Time.now
value = super
finish = Time.now
duration = finish - start
return value if duration <= LOG_IF_SLOWER_THAN_SECONDS
backtrace = caller.
select { |path| path.start_with?(Rails.root.to_s) }.
reject { |row|
row.include?("/gems/") ||
row.include?("/app/middleware/") ||
row.include?("/config/initializers/")
}
puts "slow_transaction_logger: duration=#{duration.round(2)} start=#{start.to_s.inspect} finish=#{finish.to_s.inspect} class=#{name} caller=#{backtrace.to_json}"
value
end
end在config/initializers/active_record.rb中
class ActiveRecord::Base
class << self
prepend SlowTransactionLogger
end
end因此,默认情况下,它在每个环境中记录事务的速度都低于5秒。
如果您设置了LOG_TRANSACTIONS_SLOWER_THAN_SECONDS环境变量(例如,在Heroku上),则可以调整该限制。
我们故意使用puts进行日志记录,因为它最终会出现在Heroku的日志中,而且我们在开发和测试中也更容易看到它。但是如果你愿意,你可以随意使用Rails.logger。
https://stackoverflow.com/questions/20386598
复制相似问题