Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/cloud66/metrics/manager.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
require "cloud66/metrics/sidekiq"
require "cloud66/metrics/resque"
require "cloud66/metrics/delayed_job_active_record"
require "cloud66/metrics/solid_queue"

module Cloud66
module Metrics
Expand All @@ -9,6 +10,7 @@ class Manager
::Cloud66::Metrics::Sidekiq,
::Cloud66::Metrics::Resque,
::Cloud66::Metrics::DelayedJobActiveRecord,
::Cloud66::Metrics::SolidQueue,
].freeze

def self.metrics_array
Expand Down
53 changes: 53 additions & 0 deletions lib/cloud66/metrics/solid_queue.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
require "cloud66/metrics/framework_base"

module Cloud66
module Metrics
class SolidQueue < FrameworkBase
class << self
protected

def detected_concrete
::Gem.loaded_specs.key?("solid_queue") &&
::Object.const_defined?(:SolidQueue) &&
::SolidQueue.const_defined?(:Job) &&
::SolidQueue.const_defined?(:ReadyExecution) &&
::SolidQueue.const_defined?(:ClaimedExecution) &&
::SolidQueue.const_defined?(:ScheduledExecution)
end

def name_concrete
"solid_queue"
end

def queue_array_concrete
# Get pending jobs per queue from ready executions
solid_queue_pending = ::SolidQueue::ReadyExecution.group(:queue_name).count

# Get due scheduled jobs per queue (scheduled_at <= now, not yet dispatched)
# These should count as "waiting" for autoscaling purposes
solid_queue_due_scheduled = ::SolidQueue::ScheduledExecution.due.group(:queue_name).count

# Combine ready + due scheduled as total waiting
solid_queue_waiting = solid_queue_pending.merge(solid_queue_due_scheduled) { |_key, ready, scheduled| ready + scheduled }

# Get processing jobs per queue from claimed executions
# Using Job.joins approach since queue_name is directly on Job
solid_queue_working = ::SolidQueue::Job.joins(:claimed_execution).group(:queue_name).count

result = []
solid_queue_queue_names = solid_queue_waiting.keys | solid_queue_working.keys
solid_queue_queue_names.each do |queue_name|
result << {
"backend" => name,
"queue" => queue_name,
"waiting" => solid_queue_waiting[queue_name] || 0,
"processing" => solid_queue_working[queue_name] || 0,
}
end

result
end
end
end
end
end