Как вы отслеживаете процессы sidekiq?
Я работаю над производственным приложением, которое имеет несколько серверов rails за nginx loadbalancer. Мы отслеживаем процессы sidekiq с помощью monit, и он прекрасно работает - когда процесс sidekiq умирает, monit запускает его снова.
Однако недавно столкнулся с ситуацией, когда один из этих процессов работал и был виден для мониторинга, но по какой-то причине не виден для sidekiq. Это привело к множеству неудачных заданий, и нам потребовалось некоторое время, чтобы заметить, что мы пропустили один процесс в веб-интерфейсе sidekiq, так как monit говорил нам, что все в порядке и все процессы запущены. Простой перезапуск решил проблему.
И это подводит меня к моему вопросу: как ты следишь за своими процессами sidekiq? Я знаю, что могу использовать что-то вроде rollbar, чтобы уведомлять меня, когда задания не выполняются, но я хотел бы знать, есть ли способ контролировать число процессов и предпочтительно отправлять почту, когда кто-то умирает. Какие-либо предложения?
Что-то, что пингует sidekiq/stats
и проверьте ответ.
4 ответа
Мое супер простое решение похожей проблемы выглядит так:
# 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
Мы столкнулись с этой проблемой, когда наши процессы sidekiq перестали работать за одну ночь, и мы понятия не имели. Нам потребовалось около 30 минут, чтобы интегрировать http://deadmanssnitch.com/, следуя этим инструкциям.
Это не самый красивый и дешевый вариант, но он выполняет свою работу (прекрасно интегрируется с Pagerduty) и дважды экономит нашу задницу за последние несколько месяцев.
По нашим жалобам в службу сервиса мы можем установить самый короткий льготный интервал, равный 15 минутам, что для нас слишком долго. Поэтому мы оцениваем подобные услуги, такие как Healthchecks и т. Д.
Мой подход заключается в следующем:
- создать фоновую работу, которая делает что-то
- регулярно звонить на работу
- проверьте, что это делается!
так; используя cron скрипт (или что-то вроде whenever
) каждые 5 минут я бегаю:
CheckinJob.perform_later
Теперь дело за Sideqik (или delayed_job, или любой другой активной работой, которую вы используете), чтобы фактически запустить эту работу.
Работа просто должна сделать что-то, что вы можете проверить.
Я использовал, чтобы получить задание обновить запись в моей таблице состояния (по сути, список записей ключ / значение). Тогда я бы /status
страница, которая возвращает :500
код состояния, если запись не обновлялась в течение последних 6 минут.
(очевидно, ваши сроки могут отличаться)
Тогда я использую сервис мониторинга для мониторинга страницы статуса! (что-то вроде StatusCake)
В настоящее время у меня более простой подход; Я просто выполняю фоновую работу, чтобы зарегистрироваться в службе мониторинга cron, например
Служба мониторинга, которая ожидает, что ваша задача проверяется каждые X минут. Если ваша задача не регистрируется - тогда служба мониторинга сообщит вам.
Интеграция очень проста для всех сервисов. Это работает:
IsItWorkingInfo::Checkin.ping(key:"CHECKIN_IDENTIFIER")
полное раскрытие: я написал IsItWorking!
Я использую драгоценный камень бога, чтобы контролировать свои процессы sidekiq. Жемчужина Бога гарантирует, что ваш процесс всегда запущен, а также может уведомлять о состоянии процесса по различным каналам.
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