3

我正在开发一个在 nginx 负载均衡器后面有多个 rails 服务器的生产应用程序。我们正在使用monit监控sidekiq进程,它工作得很好——当sidekiq进程死亡时,monit会立即启动它。

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

这让我想到了我的问题:你如何监控你的 sidekiq 流程?我知道当工作失败时我可以使用类似 rollbar 的东西来通知我,但我想知道是否有一种方法可以监控进程计数,并且最好在一个死时发送邮件。有什么建议么?

可以pingsidekiq/stats并验证响应的东西。

4

4 回答 4

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/

# schedule.rb
every 5.minutes do 
  rake 'sidekiq_check:rerun'
end
于 2018-05-20T18:51:41.513 回答
1

我的方法如下:

  1. 创建一个做某事的后台作业
  2. 定期打电话给工作
  3. 检查事情是否正在完成!

所以; whenever每 5 分钟使用一个 cron 脚本(或类似的东西),我运行:

CheckinJob.perform_later

现在由sidekiq(或delayed_job,或您正在使用的任何活动作业)来实际运行该作业。

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

我曾经获得更新状态表中的记录(本质上是键/值记录列表)的工作。如果记录在过去 6 分钟内没有更新,那么我会有一个/status返回状态代码的页面。:500

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

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

现在我有一个更简单的方法;我只是得到后台工作来检查一个 cron 监控服务,比如

期望您的任务每 X 分钟检查一次的监控服务。如果您的任务未签入 - 那么监控服务会通知您。

所有服务的集成都非常简单。对于它是否有效,它将是:

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

全面披露:我写了 IsItWorking !

于 2017-03-30T16:59:00.940 回答
0

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

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

在我们对该服务的抱怨中,我们可以设置的最短宽限期为 15 分钟,这对我们来说太长了。因此,我们正在评估类似的服务,例如 Healthchecks 等。

于 2017-03-11T19:46:59.173 回答
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
于 2018-07-30T17:50:44.473 回答