module HireFire::Macro::SolidQueue

Constants

LATENCY_METHODS
SIZE_METHODS

Public Instance Methods

job_queue_latency(*queues) click to toggle source

Calculates the maximum job queue latency using SolidQueue. If no queues are specified, it measures latency across all available queues.

This function measures the job queue latency across the Ready, Scheduled, and Blocked queues, based on the enqueue, schedule, and expiration times of their executions. Executions in the Claimed queue, as well as in paused queues, are excluded from the calculation.

@param queues [Array<String, Symbol>] (optional) Names of the queues for latency

measurement. If not provided, latency is measured across all queues.

@return [Float] Maximum job queue latency in seconds. @example Calculate latency across all queues

HireFire::Macro::SolidQueue.job_queue_latency

@example Calculate latency for the “default” queue

HireFire::Macro::SolidQueue.job_queue_latency(:default)

@example Calculate latency across “default” and “mailer” queues

HireFire::Macro::SolidQueue.job_queue_latency(:default, :mailer)

@example Calculate latency across “mailer_*” queues (i.e. mailer_notification, mailer_newsletter)

HireFire::Macro::SolidQueue.job_queue_latency(:"mailer_*")
# File lib/hirefire/macro/solid_queue.rb, line 33
def job_queue_latency(*queues)
  queues, now = determine_queues(queues), Time.now

  LATENCY_METHODS.map do |latency_method|
    method(latency_method).call(queues, now: now)
  end.max
end
job_queue_size(*queues) click to toggle source

Calculates the total job queue size using SolidQueue. If no queues are specified, it measures size across all available queues.

This function measures the job queue latency across the Ready, Scheduled, Blocked, and Claimed queues, based on the schedule and expiration times of their executions. Executions in paused queues are excluded from the calculation.

@param queues [Array<String, Symbol>] (optional) Names of the queues for size measurement.

If not provided, size is measured across all queues.

@return [Integer] Total job queue size. @example Calculate size across all queues

HireFire::Macro::SolidQueue.job_queue_size

@example Calculate size for the “default” queue

HireFire::Macro::SolidQueue.job_queue_size(:default)

@example Calculate size across “default” and “mailer” queues

HireFire::Macro::SolidQueue.job_queue_size(:default, :mailer)

@example Calculate size across “mailer_*” queues (i.e. mailer_notification, mailer_newsletter)

HireFire::Macro::SolidQueue.job_queue_size(:"mailer_*")
# File lib/hirefire/macro/solid_queue.rb, line 66
def job_queue_size(*queues)
  queues = determine_queues(queues)

  SIZE_METHODS.sum do |count_method|
    method(count_method).call(queues)
  end
end

Private Instance Methods

blocked_latency(queues, now:) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 142
def blocked_latency(queues, now:)
  now - (
    ::SolidQueue::BlockedExecution
      .expired
      .where(queue_name: queues)
      .minimum(:expires_at) || now
  )
end
blocked_size(queues) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 151
def blocked_size(queues)
  ::SolidQueue::BlockedExecution
    .expired
    .where(queue_name: queues)
    .count
end
claimed_size(queues) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 158
def claimed_size(queues)
  ::SolidQueue::Job
    .joins(:claimed_execution)
    .where(queue_name: queues)
    .count
end
determine_queues(queues) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 76
def determine_queues(queues)
  queues = normalize_queues(queues, allow_empty: true)

  Set.new(
    if queues.empty?
      registered_queues
    elsif queues.any? { |queue| queue.end_with?("*") }
      expand_wildcards(queues)
    else
      queues
    end
  ) - paused_queues
end
expand_wildcards(queues) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 98
def expand_wildcards(queues)
  cached_registered_queues = registered_queues

  queues.flat_map do |queue|
    if queue.end_with?("*")
      cached_registered_queues.select do |registered_queue|
        registered_queue.start_with?(queue[0..-2])
      end
    else
      queue
    end
  end
end
paused_queues() click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 94
def paused_queues
  ::SolidQueue::Pause.pluck(:queue_name)
end
ready_latency(queues, now:) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 112
def ready_latency(queues, now:)
  now - (
    ::SolidQueue::ReadyExecution
      .where(queue_name: queues)
      .minimum(:created_at) || now
  )
end
ready_size(queues) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 120
def ready_size(queues)
  ::SolidQueue::ReadyExecution
    .where(queue_name: queues)
    .count
end
registered_queues() click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 90
def registered_queues
  ::SolidQueue::Queue.all.map(&:name)
end
scheduled_latency(queues, now:) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 126
def scheduled_latency(queues, now:)
  now - (
    ::SolidQueue::ScheduledExecution
      .due
      .where(queue_name: queues)
      .minimum(:scheduled_at) || now
  )
end
scheduled_size(queues) click to toggle source
# File lib/hirefire/macro/solid_queue.rb, line 135
def scheduled_size(queues)
  ::SolidQueue::ScheduledExecution
    .due
    .where(queue_name: queues)
    .count
end