首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails中记录长时间运行的事务

在Rails中记录长时间运行的事务
EN

Stack Overflow用户
提问于 2013-12-05 05:40:34
回答 1查看 824关注 0票数 2

我在我的production Rails应用程序中遇到了"Mysql2::Error: Lock wait timeout exceeded“错误,我正在寻找调试哪个事务锁定表的时间过长的帮助。据我所知,MySQL有一个“慢查询”日志,但没有慢事务日志。

有没有一种方法可以直接从ActiveRecord记录事务花费多长时间的信息?

EN

回答 1

Stack Overflow用户

发布于 2017-06-14 21:26:44

我的团队将缓慢的事务记录如下:

lib/slow_transaction_logger.rb

代码语言:javascript
复制
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

代码语言:javascript
复制
class ActiveRecord::Base
  class << self
    prepend SlowTransactionLogger
  end
end

因此,默认情况下,它在每个环境中记录事务的速度都低于5秒。

如果您设置了LOG_TRANSACTIONS_SLOWER_THAN_SECONDS环境变量(例如,在Heroku上),则可以调整该限制。

我们故意使用puts进行日志记录,因为它最终会出现在Heroku的日志中,而且我们在开发和测试中也更容易看到它。但是如果你愿意,你可以随意使用Rails.logger

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20386598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档