我正在使用nginx loadbalancer后面有多个rails服务器的生产应用程序。我们用monit监视sidekiq进程,并且它工作得很好 - 当sidekiq进程死时,monit会立即启动它。
但是最近遇到这样一种情况,其中一个进程正在运行并且对monit可见,但由于某些原因,sidekiq不可见。这导致许多失败的工作,并花了我们一些时间注意到我们在sidekiq Web UI中缺少一个进程,因为monit告诉我们一切正常并且所有进程都在运行。简单重启修复了问题。
这让我想到了一个问题:你如何监控你的sidekiq流程?我知道我可以使用滚动条之类的东西在作业失败时通知我,但我想知道是否有办法监控进程数量,最好在发生死亡时发送邮件。有什么建议?
可以ping sidekiq/stats
并验证响应的内容。
答案 0 :(得分:1)
我的方法如下:
如此;每隔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