如何在每当cron工作时陷入错误?

时间:2014-01-24 22:03:33

标签: ruby-on-rails cron newrelic whenever

我们有许多Rake和Runner脚本由cron通过Whenever gem执行。我们最近发现其中一个失败超过一天,我们没有注意到它。是否有一种很好的方法来捕获并报告后台作业中的错误?我们有NewRelic用于监控,但它似乎没有发现这些问题。

理想情况下,我喜欢一个可以实现的解决方案,一旦神奇地适用于所有Whenever / cron Rake / Runner脚本。

2 个答案:

答案 0 :(得分:4)

具体来说,对于rake任务,您可以安装newrelic-rake gem。这个gem应该允许你记录任何rake任务中发生的错误(尽管它不会捕获'rails runner'调用中的错误。)

对于rails runner调用,您可以定义一个简单的跟踪包装器,并将每个“runner”调用包装在该包装器的schedule.rb文件中。

例如,如果您在config/initializers/trace_wrapper.rb中有以下内容:

require 'newrelic_rpm'

module TraceWrapper
  extend NewRelic::Agent::Instrumentation::ControllerInstrumentation
  def self.trace(task_name)
    perform_action_with_newrelic_trace(name: task_name, category: :task) do
      yield
    end
  end
end

...然后您可以更改schedule.rb中的'跑步者'调用以包含在此调用中,如下所示:

every 1.minutes do
  runner "TraceWrapper.trace('compile models') { MyModel.compile }"
end

您需要为rails runner文件中的每个schedule.rb次调用执行此操作。

答案 1 :(得分:2)

我使用了user1816629的答案,但略微修改了它以使TraceWrapper代码更简洁。我的schedule.rb看起来像:

every 1.minutes do
  runner "TraceWrapper.trace 'MyModel.compile'"
end

这是TraceWrapper:

module TraceWrapper
  extend NewRelic::Agent::Instrumentation::ControllerInstrumentation

  def self.trace(operation)
    perform_action_with_newrelic_trace(:name => operation, :category => :task) do
      eval operation
    end
  end
end