Class: Perfm::Metrics::Sidekiq

Inherits:
Object
  • Object
show all
Defined in:
lib/perfm/metrics/sidekiq.rb

Class Method Summary collapse

Class Method Details

.check_latency_threshold(queue) ⇒ Object



40
41
42
43
44
45
46
# File 'lib/perfm/metrics/sidekiq.rb', line 40

def check_latency_threshold(queue)
  return unless expected_latency = QueueLatency.parse_latency(queue.name)
  
  if queue.latency > expected_latency
    handle_exceeded_latency(queue, expected_latency)
  end
end

.collect_metrics ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/perfm/metrics/sidekiq.rb', line 18

def collect_metrics
  return unless defined?(::Sidekiq)

  ::Sidekiq::Queue.all.each do |queue|
    record_queue_metrics(queue)
    
    if monitor_sidekiq_queues? && valid_queue_name?(queue.name)
      check_latency_threshold(queue)
    end
  end
end

.handle_exceeded_latency(queue, expected_latency) ⇒ Object



48
49
50
51
52
53
54
55
56
57
# File 'lib/perfm/metrics/sidekiq.rb', line 48

def handle_exceeded_latency(queue, expected_latency)
  Thread.new do
    # TODO: Prevent flooding the error monitoring tool if there are a lot of latency exceeded errors
    raise Errors::LatencyExceededError.new(
      queue: queue.name,
      latency: queue.latency,
      expected_latency: expected_latency
    )
  end
end

.monitor_sidekiq_queues? ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/perfm/metrics/sidekiq.rb', line 59

def monitor_sidekiq_queues?
  @monitor_sidekiq_queues ||= Perfm.configuration.monitor_sidekiq_queues?
end

.record_queue_metrics(queue) ⇒ Object



30
31
32
33
34
35
36
37
38
# File 'lib/perfm/metrics/sidekiq.rb', line 30

def record_queue_metrics(queue)
  # TODO: Replace this with sending metrics to NewRelic as perfm-ingester work is not complete
  Perfm.agent.push_metrics({
    type: "sidekiq_queue",
    queue: queue.name,
    latency: queue.latency,
    size: queue.size,
  })
end

.setup ⇒ Object



5
6
7
# File 'lib/perfm/metrics/sidekiq.rb', line 5

def setup
  start_monitoring
end

.start_monitoring ⇒ Object



9
10
11
12
13
14
15
16
# File 'lib/perfm/metrics/sidekiq.rb', line 9

def start_monitoring
  Thread.new do
    while true
      collect_metrics
      sleep 5
    end
  end
end

.valid_queue_name?(queue_name) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/perfm/metrics/sidekiq.rb', line 63

def valid_queue_name?(queue_name)
  QueueLatency.valid_queue_name?(queue_name)
end