module Yabeda::DelayedJob

Constants

LONG_RUNNING_JOB_RUNTIME_BUCKETS
VERSION

Attributes

jobs_started_at[RW]

Hash of hashes containing all currently running jobs' start timestamps to calculate maximum durations of currently running not yet completed jobs { { queue: “default”, worker: “SomeJob” } => { “jid1” => 100500, “jid2” => 424242 } }

Public Class Methods

active_record_adapter?() click to toggle source
# File lib/yabeda/delayed_job.rb, line 74
def active_record_adapter?
  defined?(Delayed::Backend::ActiveRecord::Job) &&
    Delayed::Worker.backend.name == Delayed::Backend::ActiveRecord::Job.name
end
elapsed(start) click to toggle source
# File lib/yabeda/delayed_job.rb, line 93
def elapsed(start)
  (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start).round(3)
end
job_scope() click to toggle source
# File lib/yabeda/delayed_job.rb, line 65
def job_scope
  db_time_now = ::Delayed::Worker.backend.db_time_now
  ::Delayed::Worker.backend.where(
    '(run_at <= ? AND (locked_at IS NULL OR locked_at < ?)) AND failed_at IS NULL',
    db_time_now,
    db_time_now - ::Delayed::Worker.max_run_time
  ).group(:queue)
end
labelize(job) click to toggle source
# File lib/yabeda/delayed_job.rb, line 50
def labelize(job)
  result = { queue: job.queue, worker: job.name }
  result.merge!(error: job.error.class.name) if job.error
  result
end
server?() click to toggle source
# File lib/yabeda/delayed_job.rb, line 45
def server?
  require 'delayed/command'
  @server ||= ObjectSpace.each_object(Delayed::Command).any?
end
track_database_metrics() click to toggle source
# File lib/yabeda/delayed_job.rb, line 56
def track_database_metrics
  job_scope.select(:queue).count.each do |queue, count|
    Yabeda.delayed_job.jobs_waiting_count.set({ queue: queue }, count)
  end
  job_scope.select('queue, max(NOW() - run_at) latency').each do |job|
    Yabeda.delayed_job.queue_latency.set({ queue: job.queue }, job.latency)
  end
end
track_max_job_runtime() click to toggle source
# File lib/yabeda/delayed_job.rb, line 84
def track_max_job_runtime
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  ::Yabeda::DelayedJob.jobs_started_at.each do |labels, jobs|
    oldest_job_started_at = jobs.values.min
    oldest_job_duration = oldest_job_started_at ? (now - oldest_job_started_at).round(3) : 0
    Yabeda.delayed_job.running_job_runtime.set(labels, oldest_job_duration)
  end
end