2014-01-24 4 views
1

У нас есть несколько сценариев Rake и Runner, которые выполняются cron через Whenever gem. Недавно мы обнаружили, что один из них потерпел неудачу более одного дня, и мы этого не заметили. Есть ли хороший способ поймать и сообщить об ошибках в фоновых заданиях? У нас есть NewRelic для мониторинга, но он, похоже, не обнаруживает эти проблемы.Как улавливать ошибки во время работы cron?

В идеале, мне бы понравилось решение, которое я могу реализовать, когда это магически применимо ко всем сценариям Everyever/cron Rake/Runner.

ответ

4

Для специальных задач рейка вы можете установить newrelic-rake gem. Этот жемчуг должен позволять вам записывать ошибки, которые происходят в любых рейк-задачах (хотя они не будут фиксировать ошибки в вызовах «rails runner»).

Для вызовов рельсов-бегунов вы можете определить простую трассировку трассировки и обернуть вызов каждого «бегуна» в ваш файл в этой обертке.

Например, если у вас есть следующие в 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.

+0

Великие - спасибо – adambrod

2

Я использовал ответ от пользователя1816629, но слегка изменил его, чтобы сделать код 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 
Смежные вопросы