Module: TalkToYourApp::Plugins::Jobs::Adapters::SolidQueue

Defined in:
lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb

Overview

Solid Queue adapter. Reads Solid Queue’s ActiveRecord models, which live in the host application’s database. By default the queries run on the primary connection (whatever Solid Queue itself is configured to use); operators wanting isolation point Solid Queue at a separate database in their own config. Read-only and returns the common shape.

Constant Summary collapse

REQUIRED_GEM =
{ const: "SolidQueue", gem_name: "solid_queue" }.freeze

Class Method Summary collapse

Class Method Details

.failed_jobs(limit:) ⇒ Object



29
30
31
32
33
# File 'lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb', line 29

def failed_jobs(limit:)
  ::SolidQueue::FailedExecution.includes(:job).order(created_at: :desc).limit(limit).map do |failure|
    job_hash(failure.job).merge(error_message: failure.message)
  end
end

.healthObject

Worker/queue health. Lists the registered Solid Queue processes (supervisor/workers/dispatcher/scheduler) with their last heartbeat, plus pending/claimed/scheduled/failed counts.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb', line 38

def health
  processes = ::SolidQueue::Process.all.map do |process|
    {
      kind: process.kind,
      hostname: process.hostname,
      pid: process.pid,
      name: process.name,
      last_heartbeat_at: process.last_heartbeat_at&.utc&.iso8601,
    }
  end
  {
    adapter: "solid_queue",
    processes: processes,
    process_count: processes.size,
    workers: processes.count { |p| p[:kind].to_s.include?("Worker") },
    pending: ::SolidQueue::ReadyExecution.count,
    claimed: ::SolidQueue::ClaimedExecution.count,
    scheduled: ::SolidQueue::ScheduledExecution.count,
    failed: ::SolidQueue::FailedExecution.count,
  }
end

.job_hash(job) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb', line 70

def job_hash(job)
  # Keep every key present even for an orphaned failure (nil job), so
  # the shape matches the Sidekiq adapter.
  return { jid: nil, class: nil, queue: nil, args: nil, enqueued_at: nil, error_message: nil } unless job

  {
    jid: job.active_job_id || job.id,
    class: job.class_name,
    queue: job.queue_name,
    args: job.arguments,
    enqueued_at: job.created_at&.utc&.iso8601,
    error_message: nil, # failed_jobs overrides this; present for shape stability
  }
end

.queue_sizesObject



21
22
23
# File 'lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb', line 21

def queue_sizes
  ::SolidQueue::ReadyExecution.group(:queue_name).count
end

.rate_metrics(window:) ⇒ Object



60
61
62
63
64
65
66
67
68
# File 'lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb', line 60

def rate_metrics(window:)
  since = Time.now - window.to_i # plain Ruby; no ActiveSupport core-ext dependency
  {
    window_seconds: window,
    enqueued: ::SolidQueue::Job.where(created_at: since..).count,
    processed: ::SolidQueue::Job.where.not(finished_at: nil).where(finished_at: since..).count,
    failed: ::SolidQueue::FailedExecution.where(created_at: since..).count,
  }
end

.recent_jobs(limit:) ⇒ Object



25
26
27
# File 'lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb', line 25

def recent_jobs(limit:)
  ::SolidQueue::Job.order(created_at: :desc).limit(limit).map { |job| job_hash(job) }
end

.required_gemObject



17
18
19
# File 'lib/talk_to_your_app/plugins/jobs/adapters/solid_queue.rb', line 17

def required_gem
  REQUIRED_GEM
end