2012-09-28 24 views
3

因此,我们必须的MySQL慢查询日志的一套应用程序,主要是在Ruby中,一些使用他人使用。我们希望能够轻松地将特定的(MySQL)慢查询返回到生成它的代码。是否有可以在这些工具中启用的功能,或者可以应用于它们的修补程序,这些功能添加了插入到SQL注释中的工具...类似于FILE功能标识符?工具或补丁的Ruby续集或ORM插装SQL查询慢查询日志分析

回答

2

有趣的问题,这里是我会怎么处理呢?

我会用config.active_record.auto_explain_threshold_in_secondsautomatically explain slow queries,因为它听起来像你正在做的。

然后,我将覆盖ActiveRecord::Explain中的logging_query_plan方法,将任何相关数据添加到您的日志中。这里是一个将当前堆栈跟踪的例子:

# /config/initializers/add_additional_instumentation_to_explain.rb 
module ActiveRecord 
    module Explain 


    def logging_query_plan # :nodoc: 
     return yield unless logger 

     threshold = auto_explain_threshold_in_seconds 
     current = Thread.current 
     if threshold && current[:available_queries_for_explain].nil? 
     begin 
      queries = current[:available_queries_for_explain] = [] 
      start = Time.now 
      result = yield 
      if Time.now - start > threshold 
      # START ADDING ADDITIONAL INFORMATION 
      begin 
       puts 'ADDING ADDITIONAL INFORMATION...' 
       raise 'foo' 
      rescue 
       puts 'DISPLAYING THE CURRENT STACKTRACE FOR THE FOLLOWING EXPLAIN' 
       puts [email protected] 
      end 

      logger.warn(exec_explain(queries)) 

      end 
      result 
     ensure 
      current[:available_queries_for_explain] = nil 
     end 
     else 
     yield 
     end 
    end 


    end 
end 

,我宁愿不依赖于从铁轨整个修饰方法的方法,但是这是我能得到它可靠地工作的唯一途径。

对于它的价值来说,这将很容易转化为一个宝石,为每个rails版本添加一个新的宝石,并且为每个应用添加相关的宝石版本,因为它听起来像是可能的支持多种版本的导轨。这将有助于使所述方法的一些脆性最小化。无论如何,希望这有助于 - 祝你好运!