Module: Speedshop::Cloudwatch::Observations::Sidekiq

Defined in:
lib/speedshop/cloudwatch/observations/sidekiq.rb

Class Method Summary collapse

Class Method Details

.avg_utilization(processes) ⇒ Object



58
59
60
61
# File 'lib/speedshop/cloudwatch/observations/sidekiq.rb', line 58

def avg_utilization(processes)
  utils = processes.map { |process| process["busy"] / process["concurrency"].to_f }.reject(&:nan?)
  utils.sum / utils.size.to_f
end

.collect(sidekiq_queues: Config.instance.sidekiq_queues) ⇒ Object



11
12
13
14
15
16
# File 'lib/speedshop/cloudwatch/observations/sidekiq.rb', line 11

def collect(sidekiq_queues: Config.instance.sidekiq_queues)
  stats = ::Sidekiq::Stats.new
  processes = ::Sidekiq::ProcessSet.new.to_a

  stat_observations(stats) + utilization_observations(processes) + queue_observations(sidekiq_queues)
end

.queue_observations(sidekiq_queues) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/speedshop/cloudwatch/observations/sidekiq.rb', line 42

def queue_observations(sidekiq_queues)
  queues_to_monitor(sidekiq_queues).flat_map do |queue|
    [
      {metric: :QueueLatency, value: queue.latency, dimensions: {QueueName: queue.name}},
      {metric: :QueueSize, value: queue.size, dimensions: {QueueName: queue.name}}
    ]
  end
end

.queues_to_monitor(sidekiq_queues) ⇒ Object



51
52
53
54
55
56
# File 'lib/speedshop/cloudwatch/observations/sidekiq.rb', line 51

def queues_to_monitor(sidekiq_queues)
  all_queues = ::Sidekiq::Queue.all
  return all_queues if sidekiq_queues.nil? || sidekiq_queues.empty?

  all_queues.select { |queue| sidekiq_queues.include?(queue.name) }
end

.stat_observations(stats) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/speedshop/cloudwatch/observations/sidekiq.rb', line 18

def stat_observations(stats)
  {
    EnqueuedJobs: stats.enqueued,
    ProcessedJobs: stats.processed,
    FailedJobs: stats.failed,
    ScheduledJobs: stats.scheduled_size,
    RetryJobs: stats.retry_size,
    DeadJobs: stats.dead_size,
    Workers: stats.workers_size,
    Processes: stats.processes_size,
    DefaultQueueLatency: stats.default_queue_latency
  }.map do |metric, value|
    {metric: metric, value: value}
  end
end

.utilization_observations(processes) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/speedshop/cloudwatch/observations/sidekiq.rb', line 34

def utilization_observations(processes)
  observations = [{metric: :Capacity, value: processes.sum { |process| process["concurrency"] }}]

  utilization = avg_utilization(processes) * 100.0
  observations << {metric: :Utilization, value: utilization} unless utilization.nan?
  observations
end