我可以使用什么方法来通知自己由于任何原因未按计划 运行 工作? (OOM等)

What approach can I use to notify myself of jobs that've not run as per their schedule due to any reason? (OOM, etc)

所以我有很多工人经常执行,从每天到每小时等等。已经发生过其中一些没有任何签名或失败就没有执行的事件。我需要想出一个解决方案来跟踪这些。我考虑过让一个监听器在每次工作人员启动时记录日志,但是要跟踪的工作人员太多了。一个 更好的 方法是让我知道什么时候工人~没有~ 运行。那更重要。

我考虑过创建一个 table,我可以在其中添加有关工作人员何时开始执行的日志,以及该工作人员的最后一个日志是否太久以前(长于它应该的时间间隔)有)然后它通知我。

这种方法应该让您了解如何使用 Sidekiq API 来通知,也许是使用松弛通知程序 class,您可以将其放入工作程序中,然后 运行 它在其他一些时间表上,当然,如果由于资源原因而失败,那将是一个复杂的问题。但希望您的队列中有一些优先事项。

class SlackNotifier
  require 'net/http'
  require 'uri'
  require 'openssl'
  attr_reader :params

  def initialize(params)
    @params = params
  end

  def notify
    return if ENV['SLACK_WEBHOOK'].nil?
    channel = "dev"
    uri = URI.parse ENV['SLACK_WEBHOOK']
    http = Net::HTTP.new(uri.host, uri.port)
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless defined?(Rails) && Rails.env.production?
    http.use_ssl = true
    request = Net::HTTP::Post.new(uri.request_uri)
    request.body = "payload={'channel': '#{channel}', 'username': 'webhookbot', 'text': '#{params[:text]}'}"
    http.request(request)
  end
end


long = Sidekiq::Queue.new('long_running')
whats_taking_so_long = long.select{|j| j.enqueued_at < 8.hours.ago }

whats_taking_so_long.each do |long|
  SlackNotifier.new(text: long.item.to_s).notify
end

使用死人飞贼或类似的。 https://deadmanssnitch.com