Class: Judoscale::DelayedJob::MetricsCollector

Inherits:
JobMetricsCollector
  • Object
show all
Includes:
ActiveRecordHelper
Defined in:
lib/judoscale/delayed_job/metrics_collector.rb

Constant Summary collapse

METRICS_SQL =
ActiveRecordHelper.cleanse_sql(<<~SQL)
  SELECT COALESCE(queue, 'default'), min(run_at)
  FROM delayed_jobs
  WHERE locked_at IS NULL
  AND failed_at IS NULL
  GROUP BY queue
SQL
BUSY_METRICS_SQL =
ActiveRecordHelper.cleanse_sql(<<~SQL)
  SELECT COALESCE(queue, 'default'), count(*)
  FROM delayed_jobs
  WHERE locked_at IS NOT NULL
  AND locked_by IS NOT NULL
  AND failed_at IS NULL
  GROUP BY 1
SQL

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.adapter_configObject



29
30
31
# File 'lib/judoscale/delayed_job/metrics_collector.rb', line 29

def self.adapter_config
  Judoscale::Config.instance.delayed_job
end

.collect?(config) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
# File 'lib/judoscale/delayed_job/metrics_collector.rb', line 33

def self.collect?(config)
  super && ActiveRecordHelper.table_exists?("delayed_jobs")
end

Instance Method Details

#collectObject



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/judoscale/delayed_job/metrics_collector.rb', line 37

def collect
  metrics = []
  t = Time.now.utc

  run_at_by_queue = select_rows_silently(METRICS_SQL).to_h
  self.queues |= run_at_by_queue.keys

  if track_busy_jobs?
    busy_count_by_queue = select_rows_silently(BUSY_METRICS_SQL).to_h
    self.queues |= busy_count_by_queue.keys
  end

  queues.each do |queue|
    run_at = run_at_by_queue[queue]
    # DateTime.parse assumes a UTC string
    run_at = DateTime.parse(run_at) if run_at.is_a?(String)
    latency_ms = run_at ? ((t - run_at) * 1000).ceil : 0
    latency_ms = 0 if latency_ms < 0

    metrics.push Metric.new(:qt, latency_ms, t, queue)

    if track_busy_jobs?
      busy_count = busy_count_by_queue[queue] || 0
      metrics.push Metric.new(:busy, busy_count, Time.now, queue)
    end
  end

  log_collection(metrics)
  metrics
end