Как вы отслеживаете процессы 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 и т. Д.

Мой подход заключается в следующем:

  1. создать фоновую работу, которая делает что-то
  2. регулярно звонить на работу
  3. проверьте, что это делается!

так; используя 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
Другие вопросы по тегам