class Sidekiq::WorkerStats::Stats

Attributes

args[R]
config[R]
jid[R]
klass[R]
mem[R]
mem_thr[R]
pid[R]
queue[R]
start_t[R]
status[R]
stop_t[R]
walltime[R]

Public Class Methods

new(worker, msg, queue, config) click to toggle source
# File lib/sidekiq/worker_stats/stats.rb, line 22
def initialize(worker, msg, queue, config)
  @config = config
  @queue = queue
  @klass = worker.class
  @pid = ::Process.pid
  @jid = worker.jid
  @args = msg["args"]
  start
end

Public Instance Methods

save() click to toggle source
# File lib/sidekiq/worker_stats/stats.rb, line 47
def save
  worker_key = "#{@klass}:#{@start_t}:#{@jid}"
  data = {
    pid: @pid,
    jid: @jid,
    queue: @queue,
    class: @klass,
    args: @args,
    start: @start_t,
    stop: @stop_t,
    walltime: @walltime,
    status: @status,
    mem: @mem
  }

  Sidekiq.redis do |redis|
    redis.hset ::Sidekiq::WorkerStats::REDIS_HASH, worker_key, JSON.generate(data)
  end

  remove_old_samples
end
start() click to toggle source
# File lib/sidekiq/worker_stats/stats.rb, line 32
def start
  @status = 'started'
  @start_t = ::Time.now.to_f
  memory_measurement
end
stop(status) click to toggle source
# File lib/sidekiq/worker_stats/stats.rb, line 38
def stop(status)
  @stop_t = ::Time.now.to_f
  @walltime = @stop_t - @start_t
  @status = status

  mem_thr.exit if mem_thr != nil
  @mem[::Time.now.to_f] = current_memory
end

Private Instance Methods

current_memory() click to toggle source
# File lib/sidekiq/worker_stats/stats.rb, line 82
def current_memory
  `ps -o rss= -p #{@pid}`.strip.to_i * 1024
end
memory_measurement() click to toggle source
# File lib/sidekiq/worker_stats/stats.rb, line 71
def memory_measurement
  @mem = {}
  mem_sleep = @config.mem_sleep
  @mem_thr = ::Thread.new do
    while true do
      @mem[::Time.now.to_f] = current_memory
      sleep mem_sleep
    end
  end
end
remove_old_samples() click to toggle source

Remove old samples if number of samples > @config.max_samples

# File lib/sidekiq/worker_stats/stats.rb, line 87
def remove_old_samples
  keys = nil
  Sidekiq.redis do |redis|
    keys = redis.hkeys ::Sidekiq::WorkerStats::REDIS_HASH
  end

  return if keys.length <= @config.max_samples

  keys = keys.map { |k| k.split(':') if k.start_with?(@klass.to_s) }.compact

  return if keys.length <= @config.max_samples

  keys.sort! { |x, y| x[1] <=> y[1] }
  keys = keys.map { |k| k.join(':') }

  Sidekiq.redis do |redis|
    keys[0..keys.length - @config.max_samples - 1].each do |k|
      redis.hdel ::Sidekiq::WorkerStats::REDIS_HASH, k
    end
  end
end