Class: SolidQueueGuard::Checks::Runtime::QueueLagCheck

Inherits:
Base
  • Object
show all
Defined in:
lib/solid_queue_guard/checks/runtime/queue_lag_check.rb

Instance Method Summary collapse

Instance Method Details

#callObject



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/solid_queue_guard/checks/runtime/queue_lag_check.rb', line 7

def call
  with_queue_database do
    lags = SolidQueue::ReadyExecution.group(:queue_name).minimum(:created_at)
    return pass(check_id, 'No jobs waiting in ready queues') if lags.empty?

    worst = lags.map do |queue_name, oldest|
      lag = Time.current - oldest
      { queue: queue_name, lag: lag, threshold: lag_threshold_for(queue_name) }
    end.max_by { |entry| entry[:lag] }

    if worst[:lag] > worst[:threshold]
      failure(
        check_id,
        "#{worst[:queue]} queue lag is #{worst[:lag].to_i} seconds",
        suggestion: "Investigate worker coverage and throughput for the #{worst[:queue]} queue",
        metadata: { queue_lag_seconds: worst[:lag].to_i, queue_name: worst[:queue] }
      )
    elsif worst[:lag] > worst[:threshold] / 2
      warn(
        check_id,
        "#{worst[:queue]} queue lag is #{worst[:lag].to_i} seconds",
        metadata: { queue_lag_seconds: worst[:lag].to_i, queue_name: worst[:queue] }
      )
    else
      pass(check_id, "Queue lag within thresholds (worst: #{worst[:queue]} at #{worst[:lag].to_i}s)")
    end
  end
end