module HireFire::Macro::Que

Constants

VERSION_1_0_0

Public Instance Methods

job_queue_latency(*queues) click to toggle source

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

@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::Que.job_queue_latency

@example Calculate latency for the “default” queue

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

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

HireFire::Macro::Que.job_queue_latency(:default, :mailer)
# File lib/hirefire/macro/que.rb, line 26
def job_queue_latency(*queues)
  if version < VERSION_1_0_0
    job_queue_latency_v0(*queues)
  else
    job_queue_latency_v1_v2(*queues)
  end
end
job_queue_size(*queues) click to toggle source

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

@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::Que.job_queue_size

@example Calculate size for the “default” queue

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

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

HireFire::Macro::Que.job_queue_size(:default, :mailer)
# File lib/hirefire/macro/que.rb, line 46
def job_queue_size(*queues)
  if version < VERSION_1_0_0
    job_queue_size_v0(*queues)
  else
    job_queue_size_v1_v2(*queues)
  end
end

Private Instance Methods

filter_by_queues_if_any(queues) click to toggle source
# File lib/hirefire/macro/que.rb, line 117
def filter_by_queues_if_any(queues)
  queues = normalize_queues(queues, allow_empty: true)
  queues = queues.map(&method(:sanitize_sql)).join(", ")
  queues.empty? ? "" : "AND queue IN (#{queues})"
end
job_queue_latency_v0(*queues) click to toggle source
# File lib/hirefire/macro/que.rb, line 56
      def job_queue_latency_v0(*queues)
        query = <<~SQL
          SELECT run_at
          FROM que_jobs
          WHERE run_at <= NOW()
          #{filter_by_queues_if_any(queues)}
          ORDER BY run_at ASC
          LIMIT 1
        SQL

        query_job_queue_latency(query)
      end
job_queue_latency_v1_v2(*queues) click to toggle source
# File lib/hirefire/macro/que.rb, line 69
      def job_queue_latency_v1_v2(*queues)
        query = <<~SQL
          SELECT run_at
          FROM que_jobs
          WHERE run_at <= NOW()
          AND finished_at IS NULL
          AND expired_at IS NULL
          #{filter_by_queues_if_any(queues)}
          ORDER BY run_at ASC
          LIMIT 1
        SQL

        query_job_queue_latency(query)
      end
job_queue_size_v0(*queues) click to toggle source
# File lib/hirefire/macro/que.rb, line 84
      def job_queue_size_v0(*queues)
        query = <<~SQL
          SELECT COUNT(*) AS job_queue_size
          FROM que_jobs
          WHERE run_at <= NOW()
          #{filter_by_queues_if_any(queues)}
        SQL

        query_job_queue_size(query)
      end
job_queue_size_v1_v2(*queues) click to toggle source
# File lib/hirefire/macro/que.rb, line 95
      def job_queue_size_v1_v2(*queues)
        query = <<~SQL
          SELECT COUNT(*) AS job_queue_size
          FROM que_jobs
          WHERE run_at <= NOW()
          AND finished_at IS NULL
          AND expired_at IS NULL
          #{filter_by_queues_if_any(queues)}
        SQL

        query_job_queue_size(query)
      end
query_job_queue_latency(query) click to toggle source
# File lib/hirefire/macro/que.rb, line 108
def query_job_queue_latency(query)
  result = ::Que.execute(query).first
  result ? (Time.now - result[:run_at].to_time) : 0.0
end
query_job_queue_size(query) click to toggle source
# File lib/hirefire/macro/que.rb, line 113
def query_job_queue_size(query)
  ::Que.execute(query).first.fetch(:job_queue_size).to_i
end
sanitize_sql(value) click to toggle source
# File lib/hirefire/macro/que.rb, line 123
def sanitize_sql(value)
  "'" + value.to_s.gsub(/['"\\]/, '\\\\\\&') + "'"
end
version() click to toggle source
# File lib/hirefire/macro/que.rb, line 127
def version
  Gem::Version.new(defined?(::Que::Version) ? ::Que::Version : ::Que::VERSION)
end