From 8cc892d286ce88e107f3c2b5ffab985a8aa1dc8d Mon Sep 17 00:00:00 2001 From: Anderson Macedo Date: Sun, 17 Nov 2024 12:02:51 -0300 Subject: [PATCH 1/3] Add helper method to query the latency on the Queue object --- app/models/solid_queue/queue.rb | 13 +++++++++++++ test/unit/queue_test.rb | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/app/models/solid_queue/queue.rb b/app/models/solid_queue/queue.rb index 4cf05bfb..e5308784 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 = SolidQueue::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..16782abb 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,23 @@ 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 + + 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 "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 From 242fd15c761b235e41838545d120fdfcf3176d1b Mon Sep 17 00:00:00 2001 From: Anderson Macedo Date: Sun, 1 Dec 2024 11:50:48 -0300 Subject: [PATCH 2/3] Update app/models/solid_queue/queue.rb Co-authored-by: Rosa Gutierrez --- app/models/solid_queue/queue.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/solid_queue/queue.rb b/app/models/solid_queue/queue.rb index e5308784..b68c910a 100644 --- a/app/models/solid_queue/queue.rb +++ b/app/models/solid_queue/queue.rb @@ -43,7 +43,7 @@ def size def latency @latency = begin now = Time.current - oldest_enqueued_at = SolidQueue::ReadyExecution.queued_as(name).minimum(:created_at) || now + oldest_enqueued_at = ReadyExecution.queued_as(name).minimum(:created_at) || now (now - oldest_enqueued_at).to_i end From 50003ac5fe776afffa6bf827572c4b1828e1179d Mon Sep 17 00:00:00 2001 From: Anderson Macedo Date: Sun, 1 Dec 2024 13:16:01 -0300 Subject: [PATCH 3/3] Fix unmemoized method --- app/models/solid_queue/queue.rb | 2 +- test/unit/queue_test.rb | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/models/solid_queue/queue.rb b/app/models/solid_queue/queue.rb index b68c910a..7968d395 100644 --- a/app/models/solid_queue/queue.rb +++ b/app/models/solid_queue/queue.rb @@ -41,7 +41,7 @@ def size end def latency - @latency = begin + @latency ||= begin now = Time.current oldest_enqueued_at = ReadyExecution.queued_as(name).minimum(:created_at) || now diff --git a/test/unit/queue_test.rb b/test/unit/queue_test.rb index 16782abb..c89c932c 100644 --- a/test/unit/queue_test.rb +++ b/test/unit/queue_test.rb @@ -48,16 +48,28 @@ class QueueTest < ActiveSupport::TestCase 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 + assert_match (/5 minutes/), @background_queue.human_latency + assert_match (/0 seconds/), @default_queue.human_latency end end