你如何监控sidekiq流程?

时间:2016-12-06 10:13:48

标签: ruby ruby-on-rails-4 sidekiq sidekiq-monitor

我正在使用nginx loadbalancer后面有多个rails服务器的生产应用程序。我们用monit监视sidekiq进程,并且它工作得很好 - 当sidekiq进程死时,monit会立即启动它。

但是最近遇到这样一种情况,其中一个进程正在运行并且对monit可见,但由于某些原因,sidekiq不可见。这导致许多失败的工作,并花了我们一些时间注意到我们在sidekiq Web UI中缺少一个进程,因为monit告诉我们一切正常并且所有进程都在运行。简单重启修复了问题。

这让我想到了一个问题:你如何监控你的sidekiq流程?我知道我可以使用滚动条之类的东西在作业失败时通知我,但我想知道是否有办法监控进程数量,最好在发生死亡时发送邮件。有什么建议?

可以ping sidekiq/stats并验证响应的内容。

4 个答案:

答案 0 :(得分:1)

我的方法如下:

  1. 创建执行某项操作的后台作业
  2. 定期致电
  3. 检查事情是否正在完成!
  4. 如此;每隔5分钟使用一个cron脚本(或whenever之类的东西),我运行:

    CheckinJob.perform_later
    

    现在可以使用sidekiq(或者delayed_job,或者你正在使用的任何活动工作)来实际运行这份工作。

    这项工作只需做一些你可以检查的事情。

    我以前的工作是更新状态表中的记录(基本上是键/值记录列表)。然后,我有一个/status页面,如果在过去的6分钟内没有更新记录,则会返回:500状态代码。

    (显然你的时间可能会有所不同)

    然后我使用监控服务来监控状态页面! (类似于StatusCake

    现在我有一个更简单的方法;我只是通过像

    这样的cron监控服务来获取后台工作

    监控服务,期望您的任务每隔X分钟检查一次。如果您的任务没有办理登机手续 - 那么监控服务会通知您。

    所有服务的集成都很简单。对于Is It Working,它将是:

    IsItWorkingInfo::Checkin.ping(key:"CHECKIN_IDENTIFIER")
    

    完全披露:我写了IsItWorking!

答案 1 :(得分:1)

我对类似问题的超级简单解决方案如下:

# sidekiq_check.rb
namespace :sidekiq_check do
  task rerun: :environment do
    if Sidekiq::ProcessSet.new.size == 0
      exec 'bundle exec sidekiq -d -L log/sidekiq.log -C config/sidekiq.yml -e production'
    end
  end
end

然后使用cron / whenever

# schedule.rb
every 5.minutes do 
  rake 'sidekiq_check:rerun'
end

答案 2 :(得分:0)

我们遇到了这个问题,我们的sidekiq进程一夜之间停止了工作,我们不知道。按照这些http://deadmanssnitch.com,我们花了大约30分钟来整合instructions

这不是最漂亮或最便宜的选择,但它可以完成工作(与Pagerduty很好地整合)并在过去几个月中挽救了我们的屁股两次。

我们对服务的投诉是我们设定的最短宽限期是15分钟,这对我们来说太长了。所以我们正在评估像Healthchecks等类似的服务。

答案 3 :(得分:0)

我使用god gem来监视我的sidekiq进程。 God gem可确保您的流程始终在运行,并可以通过各种渠道通知流程状态。

ROOT = File.dirname(File.dirname(__FILE__))
God.pid_file_directory = File.join(ROOT, "tmp/pids")

God.watch do |w|
  w.env = {'RAILS_ENV' => ENV['RAILS_ENV'] || 'development'}
  w.name = 'sidekiq'
  w.start = "bundle exec sidekiq -d -L log/sidekiq.log -C config/sidekiq.yml -e #{ENV['RAILS_ENV']}"
  w.log = "#{ROOT}/log/sidekiq_god.log"
  w.behavior(:clean_pid_file)
  w.dir = ROOT
  w.keepalive

  w.restart_if do |restart|
    restart.condition(:memory_usage) do |c|
      c.interval = 120.seconds
      c.above = 100.megabytes
      c.times = [3, 5] # 3 out of 5 intervals
    end

    restart.condition(:cpu_usage) do |c|
      c.interval = 120.seconds
      c.above = 80.percent
      c.times = 5
    end
  end

  w.lifecycle do |on|
    on.condition(:flapping) do |c|
      c.to_state = [:start, :restart]
      c.times = 5
      c.within = 5.minute
      c.transition = :unmonitored
      c.retry_in = 10.minutes
      c.retry_times = 5
      c.retry_within = 1.hours
    end
  end
end