module SidekiqUtils::RedisMonitorStorage

Public Class Methods

active_job?(job) click to toggle source
# File lib/sidekiq_utils/redis_monitor_storage.rb, line 76
def active_job?(job)
  job['class'] == "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper"
end
add_first_argument_to_job_key(*klasses) click to toggle source
# File lib/sidekiq_utils/redis_monitor_storage.rb, line 4
def add_first_argument_to_job_key(*klasses)
  @first_argument_to_job_key_for ||= []
  @first_argument_to_job_key_for |= klasses
end
arguments(job) click to toggle source
# File lib/sidekiq_utils/redis_monitor_storage.rb, line 68
def arguments(job)
  if active_job?(job)
    job['args'].first['arguments']
  else
    job['args']
  end
end
full_prefix(job, prefix = nil, last_prefix = nil) click to toggle source
# File lib/sidekiq_utils/redis_monitor_storage.rb, line 39
def full_prefix(job, prefix = nil, last_prefix = nil)
  job_prefix = job_prefix(job)
  full_prefix = [job_prefix, prefix, Date.today.to_s(:medium), last_prefix]
  full_prefix.compact.join('||')
end
job_prefix(job, unwrap_arguments: false) click to toggle source
# File lib/sidekiq_utils/redis_monitor_storage.rb, line 45
def job_prefix(job, unwrap_arguments: false)
  arguments = arguments(job)
  if unwrap_arguments
    arguments = arguments.
      map {|arg| SidekiqUtils::AdditionalSerialization.unwrap_argument(arg) }
  end

  if active_job?(job)
    job_prefix = job['wrapped']
  else
    job_prefix = job['class']
  end

  case job_prefix
  when 'ActionMailer::DeliveryJob'
    job_prefix += "[#{arguments[0..1].join('#')}]"
  when *(@first_argument_to_job_key_for.to_a)
    job_prefix += "[#{arguments[0]}]"
  end

  job_prefix
end
retrieve(top_level_key, prefix) click to toggle source
# File lib/sidekiq_utils/redis_monitor_storage.rb, line 18
def retrieve(top_level_key, prefix)
  data = {}
  Sidekiq.redis {|r| r.hgetall(top_level_key) }.each do |key, value|
    (job, prefix_type, date, value_type) = key.split('||')
    next unless prefix_type == prefix

    if Date.parse(date) < 1.week.ago
      # expired data, get rid of it
      Sidekiq.redis {|r| r.hdel(top_level_key, key) }
    else
      data[job] ||= { 'sum' => 0, 'count' => 0 }
      data[job][value_type] += value.to_i
    end
  end

  data.each do |job, values|
    values['average'] = (values['sum'].to_f / values['count'].to_i).round
  end
  data
end
store(key, prefix, job, value) click to toggle source
# File lib/sidekiq_utils/redis_monitor_storage.rb, line 9
def store(key, prefix, job, value)
  Sidekiq.redis do |redis|
    redis.multi do
      redis.hincrby(key, full_prefix(job, prefix, 'sum'), value)
      redis.hincrby(key, full_prefix(job, prefix, 'count'), 1)
    end
  end
end