class Sidekiq::HeartbeatMonitor::Scheduler

Constants

TIME_BETWEEN_HEARTBEATS

Public Instance Methods

check_queue_size!(q, queue_config) click to toggle source
# File lib/sidekiq/heartbeat_monitor/scheduler.rb, line 45
def check_queue_size!(q, queue_config)
  max_queue_size = queue_config.max_queue_size

  if q.size > max_queue_size
   queue_config.send_backed_up_alert!("⚠️ _#{q.name}_ queue has more than #{max_queue_size} jobs waiting to be processed. Current size is #{q.size}", q)
  end
end
perform() click to toggle source

Checks to see if queues are backed up by 1000 or more jobs and also schedules the heartbeat job.

# File lib/sidekiq/heartbeat_monitor/scheduler.rb, line 12
def perform
  Sidekiq.redis do |redis|
    Sidekiq::Queue.all.each do |q|
      queue_config = Sidekiq::HeartbeatMonitor.config(q)
      next if queue_config.nil?
      
      check_queue_size!(q, queue_config)

      key = "Sidekiq:HeartbeatMonitor:Worker-#{q.name}.enqueued_at"

      last_enqueued_at = redis.get(key).to_i

      if last_enqueued_at > 577997505 # Enqueued after Jan 2, 2020 when this code was written
        time_since_enqueued = Time.now.to_i - last_enqueued_at
        if (time_since_enqueued - TIME_BETWEEN_HEARTBEATS) > queue_config.max_heartbeat_delay
          queue_config.send_slowed_down_alert!("⚠️ _#{q.name}_ queue is taking longer than #{format_time_str(time_since_enqueued)} to reach jobs.", q)
        else
          next
        end
      end

      redis.set(key, Time.now.to_i, ex: 1.week)

      Sidekiq::HeartbeatMonitor::Worker.client_push(
        'class' => Sidekiq::HeartbeatMonitor::Worker, 
        'args'  => [q.name], 
        'queue' => q.name
      )
    end

  end
end