13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# File 'lib/judoscale/sidekiq/metrics_collector.rb', line 13
def collect
metrics = []
time = Time.now.utc
queues_by_name = ::Sidekiq::Queue.all.each_with_object({}) do |queue, obj|
obj[queue.name] = queue
end
self.queues |= queues_by_name.keys
if track_busy_jobs?
busy_counts = Hash.new { |h, k| h[k] = 0 }
::Sidekiq::Workers.new.each do |pid, tid, work|
payload = work.payload if work.respond_to?(:payload)
payload ||= work["payload"]
payload = JSON.parse(payload) if payload.is_a?(String)
busy_counts[payload["queue"]] += 1
end
end
queues.each do |queue_name|
queue = queues_by_name.fetch(queue_name) { |name| ::Sidekiq::Queue.new(name) }
latency_ms = (queue.latency * 1000).ceil
depth = queue.size
metrics.push Metric.new(:qt, latency_ms, time, queue_name)
metrics.push Metric.new(:qd, depth, time, queue_name)
if track_busy_jobs?
busy_count = busy_counts[queue_name]
metrics.push Metric.new(:busy, busy_count, time, queue_name)
end
end
log_collection(metrics)
metrics
end
|