class Sidekiq::Stats

Public Class Methods

new() click to toggle source
# File lib/sidekiq/api.rb, line 21
def initialize
  fetch_stats!
end

Public Instance Methods

dead_size() click to toggle source
# File lib/sidekiq/api.rb, line 41
def dead_size
  stat :dead_size
end
default_queue_latency() click to toggle source
# File lib/sidekiq/api.rb, line 57
def default_queue_latency
  stat :default_queue_latency
end
enqueued() click to toggle source
# File lib/sidekiq/api.rb, line 45
def enqueued
  stat :enqueued
end
failed() click to toggle source
# File lib/sidekiq/api.rb, line 29
def failed
  stat :failed
end
fetch_stats!() click to toggle source
# File lib/sidekiq/api.rb, line 65
def fetch_stats!
  pipe1_res = Sidekiq.redis do |conn|
    conn.pipelined do
      conn.get('stat:processed')
      conn.get('stat:failed')
      conn.zcard('schedule')
      conn.zcard('retry')
      conn.zcard('dead')
      conn.scard('processes')
      conn.lrange('queue:default', -1, -1)
    end
  end

  processes = Sidekiq.redis do |conn|
    sscan(conn, 'processes')
  end

  queues = Sidekiq.redis do |conn|
    sscan(conn, 'queues')
  end

  pipe2_res = Sidekiq.redis do |conn|
    conn.pipelined do
      processes.each {|key| conn.hget(key, 'busy') }
      queues.each {|queue| conn.llen("queue:#{queue}") }
    end
  end

  s = processes.size
  workers_size = pipe2_res[0...s].map(&:to_i).inject(0, &:+)
  enqueued     = pipe2_res[s..-1].map(&:to_i).inject(0, &:+)

  default_queue_latency = if (entry = pipe1_res[6].first)
                            job = Sidekiq.load_json(entry) rescue {}
                            now = Time.now.to_f
                            thence = job['enqueued_at'] || now
                            now - thence
                          else
                            0
                          end
  @stats = {
    processed:             pipe1_res[0].to_i,
    failed:                pipe1_res[1].to_i,
    scheduled_size:        pipe1_res[2],
    retry_size:            pipe1_res[3],
    dead_size:             pipe1_res[4],
    processes_size:        pipe1_res[5],

    default_queue_latency: default_queue_latency,
    workers_size:          workers_size,
    enqueued:              enqueued
  }
end
processed() click to toggle source
# File lib/sidekiq/api.rb, line 25
def processed
  stat :processed
end
processes_size() click to toggle source
# File lib/sidekiq/api.rb, line 49
def processes_size
  stat :processes_size
end
queues() click to toggle source
# File lib/sidekiq/api.rb, line 61
def queues
  Sidekiq::Stats::Queues.new.lengths
end
reset(*stats) click to toggle source
# File lib/sidekiq/api.rb, line 119
def reset(*stats)
  all   = %w(failed processed)
  stats = stats.empty? ? all : all & stats.flatten.compact.map(&:to_s)

  mset_args = []
  stats.each do |stat|
    mset_args << "stat:#{stat}"
    mset_args << 0
  end
  Sidekiq.redis do |conn|
    conn.mset(*mset_args)
  end
end
retry_size() click to toggle source
# File lib/sidekiq/api.rb, line 37
def retry_size
  stat :retry_size
end
scheduled_size() click to toggle source
# File lib/sidekiq/api.rb, line 33
def scheduled_size
  stat :scheduled_size
end
workers_size() click to toggle source
# File lib/sidekiq/api.rb, line 53
def workers_size
  stat :workers_size
end

Private Instance Methods

stat(s) click to toggle source
# File lib/sidekiq/api.rb, line 135
def stat(s)
  @stats[s]
end