diff --git a/app/models/solid_queue/queue.rb b/app/models/solid_queue/queue.rb index 4cf05bfb..7968d395 100644 --- a/app/models/solid_queue/queue.rb +++ b/app/models/solid_queue/queue.rb @@ -40,6 +40,19 @@ def size @size ||= ReadyExecution.queued_as(name).count end + def latency + @latency ||= begin + now = Time.current + oldest_enqueued_at = ReadyExecution.queued_as(name).minimum(:created_at) || now + + (now - oldest_enqueued_at).to_i + end + end + + def human_latency + ActiveSupport::Duration.build(latency).inspect + end + def ==(queue) name == queue.name end diff --git a/test/unit/queue_test.rb b/test/unit/queue_test.rb index f546c8d6..c89c932c 100644 --- a/test/unit/queue_test.rb +++ b/test/unit/queue_test.rb @@ -2,6 +2,8 @@ class QueueTest < ActiveSupport::TestCase setup do + freeze_time + 5.times do AddToBufferJob.perform_later "hey!" end @@ -39,4 +41,35 @@ class QueueTest < ActiveSupport::TestCase @default_queue.resume end end + + test "return latency in seconds on each queue" do + travel_to 5.minutes.from_now + + assert_in_delta 5.minutes.to_i, @background_queue.latency, 1.second.to_i + assert_equal 0, @default_queue.latency + + @background_queue = SolidQueue::Queue.find_by_name("background") + @default_queue = SolidQueue::Queue.find_by_name("default") + travel_to 10.minutes.from_now + + assert_in_delta 15.minutes.to_i, @background_queue.latency, 1.second.to_i + assert_equal 0, @default_queue.latency + end + + test "returns memoized latency after the first call" do + travel_to 5.minutes.from_now + + assert_in_delta 5.minutes.to_i, @background_queue.latency, 1.second.to_i + + travel_to 10.minutes.from_now + + assert_in_delta 5.minutes.to_i, @background_queue.latency, 1.second.to_i + end + + test "return human latency on each queue" do + travel_to 5.minutes.from_now + + assert_match (/5 minutes/), @background_queue.human_latency + assert_match (/0 seconds/), @default_queue.human_latency + end end