class Workerholic::StatsAPI

Constants

CATEGORIES
POLLING_INTERVAL

Public Class Methods

active_proccesses() click to toggle source
# File lib/workerholic/statistics_api.rb, line 66
def self.active_proccesses
  namespace = 'workerholic:stats:memory:processes'
  storage.hash_keys(namespace)
end
history_for_period(options={}) click to toggle source
# File lib/workerholic/statistics_api.rb, line 71
def self.history_for_period(options={})
  raise ArgumentError, 'Please provide a category namespace' unless options[:category]

  if options[:klass]
    namespace = "workerholic:stats:historical:#{options[:category]}:#{options[:klass]}"
  else
    namespace = "workerholic:stats:historical:#{options[:category]}"
  end

  period = options[:period] || 30
  date_ranges = get_past_dates(period)

  job_counts = storage.hash_get_multiple_elements(namespace, date_ranges)

  combine_ranges(job_counts: job_counts, date_ranges: date_ranges)
end
job_statistics(options={}) click to toggle source
# File lib/workerholic/statistics_api.rb, line 6
def self.job_statistics(options={})
  raise ArgumentError, "Please specify one of the following categories: 'completed_jobs', 'failed_jobs'" unless CATEGORIES.include? options[:category]

  job_classes = storage.get_keys_for_namespace("workerholic:stats:#{options[:category]}:*")

  if options[:count_only]
    parse_job_classes(job_classes)
  else
    parse_job_classes(job_classes, false)
  end
end
job_statistics_history(category) click to toggle source
# File lib/workerholic/statistics_api.rb, line 18
def self.job_statistics_history(category)
  raise ArgumentError, "Please specify one of the following categories: 'completed_jobs', 'failed_jobs'" unless CATEGORIES.include? category

  current_time = Time.now.to_i
  all_job_stats(category).reduce([]) do |result, job|
    completed_time = job.last.to_i
    index = (current_time - completed_time) / POLLING_INTERVAL

    result[index] = result[index] ? result[index] + 1 : 1

    result
  end
end
jobs_classes(historical) click to toggle source
# File lib/workerholic/statistics_api.rb, line 42
def self.jobs_classes(historical)
  base_namespace = historical ? 'workerholic:stats:historical:' : 'workerholic:stats:'

  completed_classes = storage.get_keys_for_namespace( base_namespace + 'completed_jobs:*')
  failed_classes = storage.get_keys_for_namespace(base_namespace + 'failed_jobs:*')
  combined_classes = completed_classes + failed_classes

  combined_classes.map { |klass| klass.split(':').last }.uniq
end
process_stats() click to toggle source
# File lib/workerholic/statistics_api.rb, line 61
def self.process_stats
  namespace = 'workerholic:stats:memory:processes'
  storage.hash_get_all(namespace)
end
queued_jobs() click to toggle source
# File lib/workerholic/statistics_api.rb, line 52
def self.queued_jobs
  fetched_queues = storage.fetch_queue_names
  parsed_queues = fetched_queues.map do |queue|
    [queue, storage.list_length(queue)]
  end

  parsed_queues
end
scheduled_jobs(options={}) click to toggle source
# File lib/workerholic/statistics_api.rb, line 32
def self.scheduled_jobs(options={})
  namespace = 'workerholic:scheduled_jobs'
  if options[:count_only]
    storage.sorted_set_size(namespace)
  else
    serialized_jobs = storage.sorted_set_all_members(namespace)
    parse_scheduled_jobs(serialized_jobs)
  end
end

Private Class Methods

all_job_stats(category) click to toggle source
# File lib/workerholic/statistics_api.rb, line 151
def self.all_job_stats(category)
  current_time = Time.now.to_i

  jobs_classes(false).map do |klass|
    storage.sorted_set_range_members("workerholic:stats:#{category}:#{klass}", current_time - 100 * POLLING_INTERVAL, current_time)
  end.flatten(1)
end
combine_ranges(options={}) click to toggle source
# File lib/workerholic/statistics_api.rb, line 90
def self.combine_ranges(options={})
  job_counts = options[:job_counts]
  job_counts.map!(&:to_i)

  {
    date_ranges: options[:date_ranges],
    job_counts: job_counts
  }
end
convert_klass_to_string(obj) click to toggle source
# File lib/workerholic/statistics_api.rb, line 137
def self.convert_klass_to_string(obj)
  obj[:klass] = obj[:klass].to_s
  obj[:wrapper] = nil
  obj
end
get_jobs_for_class(job_class) click to toggle source
# File lib/workerholic/statistics_api.rb, line 123
def self.get_jobs_for_class(job_class)
  serialized_jobs = storage.sorted_set_all_members(job_class)
  deserialized_stats = serialized_jobs.map do |serialized_job|
    JobSerializer.deserialize_stats(serialized_job)
  end

  deserialized_stats << deserialized_stats.size
end
get_past_dates(days) click to toggle source
# File lib/workerholic/statistics_api.rb, line 100
def self.get_past_dates(days)
  today = Time.now.utc.to_i - Time.now.utc.to_i % 86400

  (0..days).map { |day| today - day * 86400 }
end
jobs_per_class(job_class) click to toggle source
# File lib/workerholic/statistics_api.rb, line 132
def self.jobs_per_class(job_class)
  clean_class_name = job_class.split(':').last
  [clean_class_name, storage.sorted_set_size(job_class)]
end
logger(message) click to toggle source
# File lib/workerholic/statistics_api.rb, line 147
def self.logger(message)
  @log ||= LogManager.new
end
parse_job_classes(job_classes, count_only = true) click to toggle source
# File lib/workerholic/statistics_api.rb, line 113
def self.parse_job_classes(job_classes, count_only = true)
  job_classes.map do |job_class|
    if count_only
      jobs_per_class(job_class)
    else
      get_jobs_for_class(job_class)
    end
  end
end
parse_scheduled_jobs(jobs) click to toggle source
# File lib/workerholic/statistics_api.rb, line 106
def self.parse_scheduled_jobs(jobs)
  jobs.map do |job|
    deserialized_job = JobSerializer.deserialize_stats(job)
    convert_klass_to_string(deserialized_job)
  end
end
storage() click to toggle source
# File lib/workerholic/statistics_api.rb, line 143
def self.storage
  @storage ||= Storage::RedisWrapper.new
end