class Roundhouse::Stats

Public Class Methods

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

Public Instance Methods

avg_queue_len() click to toggle source
# File lib/roundhouse/api.rb, line 14
def avg_queue_len;         stat :avg_queue_len         end
dead_size() click to toggle source
# File lib/roundhouse/api.rb, line 32
def dead_size
  stat :dead_size
end
default_queue_latency() click to toggle source
# File lib/roundhouse/api.rb, line 48
def default_queue_latency
  stat :default_queue_latency
end
enqueued() click to toggle source
# File lib/roundhouse/api.rb, line 36
def enqueued
  stat :enqueued
end
failed() click to toggle source
# File lib/roundhouse/api.rb, line 20
def failed
  stat :failed
end
fetch_stats!() click to toggle source
# File lib/roundhouse/api.rb, line 56
def fetch_stats!
  pipe1_res = Roundhouse.redis do |conn|
    conn.pipelined do
      conn.get('stat:processed'.freeze)
      conn.get('stat:failed'.freeze)
      conn.zcard('schedule'.freeze)
      conn.zcard('retry'.freeze)
      conn.zcard('dead'.freeze)
      conn.scard('processes'.freeze)
      conn.llen(Roundhouse::Monitor::TURNTABLE.freeze)
      conn.smembers('processes'.freeze)
      conn.smembers(Roundhouse::Monitor::BUCKETS)
    end
  end

  queues_res = Roundhouse.redis do |conn|
    conn.pipelined do
      pipe1_res[8].each { |bucket| conn.hgetall("#{Roundhouse::Monitor::STATUS}:#{bucket}") }
    end
  end

  all_queue_ids = queues_res.map(&:keys).flatten

  pipe2_res = Roundhouse.redis do |conn|
    conn.pipelined do
      pipe1_res[7].each  {|key| conn.hget(key, 'busy'.freeze) }
      all_queue_ids.each {|queue| conn.llen("queue:#{queue}") }
    end
  end

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

  # Calculate queue status
  all_queue_count = all_queue_ids.size
  empty_queues = 0
  suspended_queues = 0
  queues_res.each do |h|
    h.each do |_,v|
      case v.to_i
      when Roundhouse::Monitor::EMPTY     then empty_queues += 1
      when Roundhouse::Monitor::SUSPENDED then suspended_queues +=1
      end
    end
  end

  avg_queue_len = (all_queue_count == 0 ? nil : enqueued / all_queue_count)

  #default_queue_latency = if (entry = pipe1_res[6].first)
  #                          Time.now.to_f - Roundhouse.load_json(entry)['enqueued_at'.freeze]
  #                        else
  #                          0
  #                        end

  @stats = {
    in_rotation:           pipe1_res[6].to_i,
    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,
    num_queues:            all_queue_count,
    num_empty_queues:      empty_queues,
    num_suspended_queues:  suspended_queues,
    avg_queue_len:         avg_queue_len
  }
end
in_rotation() click to toggle source
# File lib/roundhouse/api.rb, line 10
def in_rotation;           stat :in_rotation           end
num_empty_queues() click to toggle source
# File lib/roundhouse/api.rb, line 12
def num_empty_queues;      stat :num_empty_queues      end
num_queues() click to toggle source
# File lib/roundhouse/api.rb, line 11
def num_queues;            stat :num_queues            end
num_suspended_queues() click to toggle source
# File lib/roundhouse/api.rb, line 13
def num_suspended_queues;  stat :num_suspended_queues  end
processed() click to toggle source
# File lib/roundhouse/api.rb, line 16
def processed
  stat :processed
end
processes_size() click to toggle source
# File lib/roundhouse/api.rb, line 40
def processes_size
  stat :processes_size
end
queues() click to toggle source
# File lib/roundhouse/api.rb, line 52
def queues
  Roundhouse::Stats::Queues.new.lengths
end
reset(*stats) click to toggle source
# File lib/roundhouse/api.rb, line 130
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
  Roundhouse.redis do |conn|
    conn.mset(*mset_args)
  end
end
retry_size() click to toggle source
# File lib/roundhouse/api.rb, line 28
def retry_size
  stat :retry_size
end
scheduled_size() click to toggle source
# File lib/roundhouse/api.rb, line 24
def scheduled_size
  stat :scheduled_size
end
workers_size() click to toggle source
# File lib/roundhouse/api.rb, line 44
def workers_size
  stat :workers_size
end

Private Instance Methods

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