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