module QueueClassicPlus::UpdateMetrics

Public Class Methods

jobs_queued() click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 29
def self.jobs_queued
  sql_group_count "SELECT q_name AS group, COUNT(1)
          FROM queue_classic_jobs
          WHERE scheduled_at <= NOW() GROUP BY q_name"
end
jobs_scheduled() click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 35
def self.jobs_scheduled
  sql_group_count "SELECT q_name AS group, COUNT(1)
          FROM queue_classic_jobs
          WHERE scheduled_at > NOW() GROUP BY q_name"
end
late_count() click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 41
def self.late_count
  nb_late = execute("SELECT COUNT(1)
     FROM queue_classic_jobs
     WHERE scheduled_at < NOW() AND #{not_failed}")
  nb_late ? Integer(nb_late['count']) : 0
end
metrics() click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 17
def self.metrics
  {
    jobs_queued: jobs_queued,
    jobs_scheduled: jobs_scheduled,
    max_created_at: max_age("created_at", "created_at = scheduled_at"),
    max_locked_at: max_age("locked_at", "locked_at IS NOT NULL"),
    "max_created_at.unlocked" => max_age("locked_at", "locked_at IS NULL"),
    "jobs_delayed.lag" => max_age("scheduled_at"),
    "jobs_delayed.late_count" => late_count,
  }
end
update() click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 3
def self.update
  metrics.each do |name, values|
    if values.respond_to?(:each)
      values.each do |hash|
        hash.to_a.each do |(source, count)|
          Metrics.measure("qc.#{name}", count, source: source)
        end
      end
    else
      Metrics.measure("qc.#{name}", values)
    end
  end
end

Private Class Methods

execute(q) click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 75
def self.execute(q)
  QC.default_conn_adapter.execute(q)
end
max_age(column, *conditions) click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 60
def self.max_age(column, *conditions)
  conditions.unshift not_failed
  conditions.unshift "scheduled_at <= NOW()"

  q = "SELECT EXTRACT(EPOCH FROM now() - #{column}) AS age_in_seconds
       FROM queue_classic_jobs
       WHERE #{conditions.join(" AND ")}
       ORDER BY age_in_seconds DESC
       LIMIT 1
       "
   age_info = execute(q)

   age_info ? age_info['age_in_seconds'].to_i : 0
end
not_failed() click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 79
def self.not_failed
  "q_name != '#{::QueueClassicPlus::CustomWorker::FailedQueue.name}'"
end
sql_group_count(sql) click to toggle source
# File lib/queue_classic_plus/update_metrics.rb, line 50
def self.sql_group_count(sql)
  results = execute(sql)
  results = [results] if Hash === results
  Array(results).map do |h|
    {
      h.fetch("group") => Integer(h.fetch('count'))
    }
  end
end