From b95d33bcba0d1e8c1eeceed46d38fbe2beaedbbf Mon Sep 17 00:00:00 2001 From: bedrock-adam Date: Sat, 13 Dec 2025 17:22:55 +1100 Subject: [PATCH 1/7] commit changes --- db/migrate/create_outboxer_messages.rb | 4 + lib/outboxer/message.rb | 51 ++++++++--- lib/outboxer/web.rb | 2 +- lib/outboxer/web/views/home.erb | 84 ++++++++++++------- .../message/metrics_by_status_spec.rb | 45 +++++++--- 5 files changed, 133 insertions(+), 53 deletions(-) diff --git a/db/migrate/create_outboxer_messages.rb b/db/migrate/create_outboxer_messages.rb index 178be840..6f2eb6e6 100644 --- a/db/migrate/create_outboxer_messages.rb +++ b/db/migrate/create_outboxer_messages.rb @@ -23,6 +23,10 @@ def up add_index :outboxer_messages, :status, name: "idx_outboxer_status" # messages by status latency + add_index :outboxer_messages, [:status, :queued_at], + name: "idx_outboxer_status_queued_at" + + # messages by status age add_index :outboxer_messages, [:status, :updated_at], name: "idx_outboxer_status_updated_at" diff --git a/lib/outboxer/message.rb b/lib/outboxer/message.rb index 25c87a37..41f27a68 100644 --- a/lib/outboxer/message.rb +++ b/lib/outboxer/message.rb @@ -736,6 +736,8 @@ def count_by_status def metrics_by_status(time: Time) ActiveRecord::Base.connection_pool.with_connection do ActiveRecord::Base.transaction(isolation: :repeatable_read) do + now = time.now.utc + counts = Models::Thread.select( "COALESCE(SUM(queued_message_count), 0) AS queued", "COALESCE(SUM(publishing_message_count), 0) AS publishing", @@ -746,21 +748,48 @@ def metrics_by_status(time: Time) "published_message_count + failed_message_count), 0) AS total" ).take - min_times = Models::Message.group(:status).minimum(:updated_at) - min_total = min_times.values.compact.min + counts_hash = counts.attributes.symbolize_keys.transform_values(&:to_i) - now = time.now.utc - latencies = min_times.transform_values { |t| t ? (now - t).to_i : 0 } - latencies["total"] = min_total ? (now - min_total).to_i : 0 + last_updates = Models::Message.group(:status).maximum(:updated_at) + ages = last_updates.transform_values { |t| t ? (now - t).to_i : 0 } - counts_hash = counts.attributes.symbolize_keys.transform_values(&:to_i) + last_published_at = Models::Thread.maximum(:published_message_count_last_updated_at) + published_age = last_published_at ? (now - last_published_at).to_i : 0 - [:queued, :publishing, :published, :failed, :total].each_with_object({}) do |status, h| - h[status] = { - count: counts_hash[status] || 0, - latency: latencies[status.to_s] || 0 + max_message_updated_at = last_updates.values.compact.max + max_activity_at = [max_message_updated_at, last_published_at].compact.max + total_age = max_activity_at ? (now - max_activity_at).to_i : 0 + + oldest_queued_at = Models::Message.where(status: "queued").minimum(:queued_at) + queued_latency = oldest_queued_at ? (now - oldest_queued_at).to_i : 0 + + { + queued: { + count: counts_hash[:queued], + age: ages["queued"] || 0, + latency: queued_latency + }, + publishing: { + count: counts_hash[:publishing], + age: ages["publishing"] || 0, + latency: nil + }, + published: { + count: counts_hash[:published], + age: published_age, + latency: nil + }, + failed: { + count: counts_hash[:failed], + age: ages["failed"] || 0, + latency: nil + }, + total: { + count: counts_hash[:total], + age: total_age, + latency: nil } - end + } end end end diff --git a/lib/outboxer/web.rb b/lib/outboxer/web.rb index 1b1f672d..28283db2 100755 --- a/lib/outboxer/web.rb +++ b/lib/outboxer/web.rb @@ -76,7 +76,7 @@ def pretty_duration_from_period(start_time:, end def pretty_duration_from_seconds(seconds:) - return "-" if seconds <= 0 + return "—" if seconds.nil? || seconds <= 0 # Units for sub-second durations sub_second_units = [ diff --git a/lib/outboxer/web/views/home.erb b/lib/outboxer/web/views/home.erb index f7ab571a..0e67fe49 100644 --- a/lib/outboxer/web/views/home.erb +++ b/lib/outboxer/web/views/home.erb @@ -100,35 +100,59 @@
-
-
-

Messages

-
-
-
- - - - - - - - - - <% Outboxer::Message::STATUSES.each do |status| %> - - - - - - <% end %> - -
StatusCountLatency
- "> - <%= status %> - - <%= Outboxer::Web.pretty_number(number: message_metrics_by_status[status.to_sym][:count]) %><%= Outboxer::Web.pretty_duration_from_seconds(seconds: message_metrics_by_status[status.to_sym][:latency]) %>
-
-
+
+
+

Messages

+
+ +
+
+ + + + + + + + + + + + <% Outboxer::Message::STATUSES.each do |status| %> + <% metrics = message_metrics_by_status[status.to_sym] %> + + + + + + + + + + + <% end %> + +
StatusCountAgeLatency
+ "> + <%= status %> + + + <%= Outboxer::Web.pretty_number(number: metrics[:count]) %> + + <%= Outboxer::Web.pretty_duration_from_seconds( + seconds: metrics[:age] + ) %> + + <% if metrics[:latency] %> + <%= Outboxer::Web.pretty_duration_from_seconds( + seconds: metrics[:latency] + ) %> + <% else %> + — + <% end %> +
+
+
diff --git a/spec/lib/outboxer/message/metrics_by_status_spec.rb b/spec/lib/outboxer/message/metrics_by_status_spec.rb index f7202475..e98403a6 100644 --- a/spec/lib/outboxer/message/metrics_by_status_spec.rb +++ b/spec/lib/outboxer/message/metrics_by_status_spec.rb @@ -5,7 +5,10 @@ module Outboxer describe ".metrics_by_status" do let(:current_utc_time) { Time.utc(2025, 1, 1, 0, 0, 0) } - before { Models::Thread.delete_all } + before do + Models::Thread.delete_all + Models::Message.delete_all + end before do create( @@ -15,8 +18,7 @@ module Outboxer publishing_message_count: 20, published_message_count: 30, failed_message_count: 40, - created_at: current_utc_time, - updated_at: current_utc_time + published_message_count_last_updated_at: current_utc_time ) create( @@ -28,18 +30,39 @@ module Outboxer publishing_message_count: 6, published_message_count: 7, failed_message_count: 8, - created_at: current_utc_time, - updated_at: current_utc_time + published_message_count_last_updated_at: current_utc_time ) end it "returns metrics by status" do - expect(Message.metrics_by_status).to eq( - queued: { count: 15, latency: 0 }, - publishing: { count: 26, latency: 0 }, - published: { count: 37, latency: 0 }, - failed: { count: 48, latency: 0 }, - total: { count: 126, latency: 0 } + expect( + Message.metrics_by_status(time: double(now: current_utc_time)) + ).to eq( + queued: { + count: 15, + age: 0, + latency: 0 + }, + publishing: { + count: 26, + age: 0, + latency: nil + }, + published: { + count: 37, + age: 0, + latency: nil + }, + failed: { + count: 48, + age: 0, + latency: nil + }, + total: { + count: 126, + age: 0, + latency: nil + } ) end end From 4f15da6f8fe74385860c6c52293f91071a8dcdbe Mon Sep 17 00:00:00 2001 From: bedrock-adam Date: Sat, 13 Dec 2025 17:31:46 +1100 Subject: [PATCH 2/7] update --- lib/outboxer/message.rb | 47 ++++++++----------- lib/outboxer/web/views/home.erb | 14 ++---- .../message/metrics_by_status_spec.rb | 44 ++++++----------- 3 files changed, 36 insertions(+), 69 deletions(-) diff --git a/lib/outboxer/message.rb b/lib/outboxer/message.rb index 41f27a68..4950838b 100644 --- a/lib/outboxer/message.rb +++ b/lib/outboxer/message.rb @@ -751,44 +751,35 @@ def metrics_by_status(time: Time) counts_hash = counts.attributes.symbolize_keys.transform_values(&:to_i) last_updates = Models::Message.group(:status).maximum(:updated_at) - ages = last_updates.transform_values { |t| t ? (now - t).to_i : 0 } + queued_age = last_updates["queued"] ? (now - last_updates["queued"]).to_i : 0 + + last_publishing_at = Models::Thread.maximum(:publishing_message_count_last_updated_at) + publishing_age = last_publishing_at ? (now - last_publishing_at).to_i : 0 + + last_failed_at = Models::Thread.maximum(:failed_message_count_last_updated_at) + failed_age = last_failed_at ? (now - last_failed_at).to_i : 0 last_published_at = Models::Thread.maximum(:published_message_count_last_updated_at) published_age = last_published_at ? (now - last_published_at).to_i : 0 - max_message_updated_at = last_updates.values.compact.max - max_activity_at = [max_message_updated_at, last_published_at].compact.max + max_activity_at = [ + last_updates["queued"], + last_publishing_at, + last_failed_at, + last_published_at + ].compact.max + total_age = max_activity_at ? (now - max_activity_at).to_i : 0 oldest_queued_at = Models::Message.where(status: "queued").minimum(:queued_at) queued_latency = oldest_queued_at ? (now - oldest_queued_at).to_i : 0 { - queued: { - count: counts_hash[:queued], - age: ages["queued"] || 0, - latency: queued_latency - }, - publishing: { - count: counts_hash[:publishing], - age: ages["publishing"] || 0, - latency: nil - }, - published: { - count: counts_hash[:published], - age: published_age, - latency: nil - }, - failed: { - count: counts_hash[:failed], - age: ages["failed"] || 0, - latency: nil - }, - total: { - count: counts_hash[:total], - age: total_age, - latency: nil - } + queued: { count: counts_hash[:queued], age: queued_age, latency: queued_latency }, + publishing: { count: counts_hash[:publishing], age: publishing_age, latency: nil }, + published: { count: counts_hash[:published], age: published_age, latency: nil }, + failed: { count: counts_hash[:failed], age: failed_age, latency: nil }, + total: { count: counts_hash[:total], age: total_age, latency: nil } } end end diff --git a/lib/outboxer/web/views/home.erb b/lib/outboxer/web/views/home.erb index 0e67fe49..43f02d3f 100644 --- a/lib/outboxer/web/views/home.erb +++ b/lib/outboxer/web/views/home.erb @@ -129,21 +129,13 @@ - - <%= Outboxer::Web.pretty_number(number: metrics[:count]) %> - + <%= Outboxer::Web.pretty_number(number: metrics[:count]) %> - - <%= Outboxer::Web.pretty_duration_from_seconds( - seconds: metrics[:age] - ) %> - + <%= Outboxer::Web.pretty_duration_from_seconds(seconds: metrics[:age]) %> <% if metrics[:latency] %> - <%= Outboxer::Web.pretty_duration_from_seconds( - seconds: metrics[:latency] - ) %> + <%= Outboxer::Web.pretty_duration_from_seconds(seconds: metrics[:latency]) %> <% else %> — <% end %> diff --git a/spec/lib/outboxer/message/metrics_by_status_spec.rb b/spec/lib/outboxer/message/metrics_by_status_spec.rb index e98403a6..7338fd58 100644 --- a/spec/lib/outboxer/message/metrics_by_status_spec.rb +++ b/spec/lib/outboxer/message/metrics_by_status_spec.rb @@ -18,7 +18,9 @@ module Outboxer publishing_message_count: 20, published_message_count: 30, failed_message_count: 40, - published_message_count_last_updated_at: current_utc_time + publishing_message_count_last_updated_at: current_utc_time, + published_message_count_last_updated_at: current_utc_time, + failed_message_count_last_updated_at: current_utc_time ) create( @@ -30,39 +32,21 @@ module Outboxer publishing_message_count: 6, published_message_count: 7, failed_message_count: 8, - published_message_count_last_updated_at: current_utc_time + publishing_message_count_last_updated_at: current_utc_time, + published_message_count_last_updated_at: current_utc_time, + failed_message_count_last_updated_at: current_utc_time ) end it "returns metrics by status" do - expect( - Message.metrics_by_status(time: double(now: current_utc_time)) - ).to eq( - queued: { - count: 15, - age: 0, - latency: 0 - }, - publishing: { - count: 26, - age: 0, - latency: nil - }, - published: { - count: 37, - age: 0, - latency: nil - }, - failed: { - count: 48, - age: 0, - latency: nil - }, - total: { - count: 126, - age: 0, - latency: nil - } + result = Message.metrics_by_status(time: double(now: current_utc_time)) + + expect(result).to eq( + queued: { count: 15, age: 0, latency: 0 }, + publishing: { count: 26, age: 0, latency: nil }, + published: { count: 37, age: 0, latency: nil }, + failed: { count: 48, age: 0, latency: nil }, + total: { count: 126, age: 0, latency: nil } ) end end From 450b9a9bbf39cfbc8eb2a1294a781b604b075d63 Mon Sep 17 00:00:00 2001 From: bedrock-adam Date: Sat, 13 Dec 2025 18:31:26 +1100 Subject: [PATCH 3/7] comment age --- lib/outboxer/web/views/home.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/outboxer/web/views/home.erb b/lib/outboxer/web/views/home.erb index 43f02d3f..3743d99f 100644 --- a/lib/outboxer/web/views/home.erb +++ b/lib/outboxer/web/views/home.erb @@ -112,7 +112,7 @@ Status Count - Age + Latency @@ -131,8 +131,8 @@ <%= Outboxer::Web.pretty_number(number: metrics[:count]) %> - <%= Outboxer::Web.pretty_duration_from_seconds(seconds: metrics[:age]) %> - + <% if metrics[:latency] %> <%= Outboxer::Web.pretty_duration_from_seconds(seconds: metrics[:latency]) %> From dc4bf6a36ff4c52ea5fde418a8d0d8b379a07002 Mon Sep 17 00:00:00 2001 From: bedrock-adam Date: Sat, 13 Dec 2025 18:33:10 +1100 Subject: [PATCH 4/7] remove unnecessary code --- spec/lib/outboxer/message/metrics_by_status_spec.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/spec/lib/outboxer/message/metrics_by_status_spec.rb b/spec/lib/outboxer/message/metrics_by_status_spec.rb index 7338fd58..147e42b3 100644 --- a/spec/lib/outboxer/message/metrics_by_status_spec.rb +++ b/spec/lib/outboxer/message/metrics_by_status_spec.rb @@ -5,11 +5,6 @@ module Outboxer describe ".metrics_by_status" do let(:current_utc_time) { Time.utc(2025, 1, 1, 0, 0, 0) } - before do - Models::Thread.delete_all - Models::Message.delete_all - end - before do create( :outboxer_thread, From d74964e442266dadb71c4ccb030d83b3039393e3 Mon Sep 17 00:00:00 2001 From: bedrock-adam Date: Sat, 13 Dec 2025 21:52:34 +1100 Subject: [PATCH 5/7] commit changes --- lib/outboxer/message.rb | 39 ++++++++--------- lib/outboxer/publisher.rb | 8 ++-- lib/outboxer/web.rb | 42 +++++++++++++------ lib/outboxer/web/views/home.erb | 21 ++++++---- lib/outboxer/web/views/message.erb | 4 +- lib/outboxer/web/views/messages.erb | 4 +- lib/outboxer/web/views/publisher.erb | 4 +- .../message/metrics_by_status_spec.rb | 12 +++--- 8 files changed, 78 insertions(+), 56 deletions(-) diff --git a/lib/outboxer/message.rb b/lib/outboxer/message.rb index 4950838b..136ba44c 100644 --- a/lib/outboxer/message.rb +++ b/lib/outboxer/message.rb @@ -750,36 +750,37 @@ def metrics_by_status(time: Time) counts_hash = counts.attributes.symbolize_keys.transform_values(&:to_i) - last_updates = Models::Message.group(:status).maximum(:updated_at) - queued_age = last_updates["queued"] ? (now - last_updates["queued"]).to_i : 0 + last_queued_at = Models::Thread.maximum(:queued_message_count_last_updated_at) + # queued_age = last_queued_at ? (now - last_queued_at).to_i : 0 last_publishing_at = Models::Thread.maximum(:publishing_message_count_last_updated_at) - publishing_age = last_publishing_at ? (now - last_publishing_at).to_i : 0 + # publishing_age = last_publishing_at ? (now - last_publishing_at).to_i : 0 last_failed_at = Models::Thread.maximum(:failed_message_count_last_updated_at) - failed_age = last_failed_at ? (now - last_failed_at).to_i : 0 + # failed_age = last_failed_at ? (now - last_failed_at).to_i : 0 last_published_at = Models::Thread.maximum(:published_message_count_last_updated_at) - published_age = last_published_at ? (now - last_published_at).to_i : 0 - - max_activity_at = [ - last_updates["queued"], - last_publishing_at, - last_failed_at, - last_published_at - ].compact.max - - total_age = max_activity_at ? (now - max_activity_at).to_i : 0 + # published_age = last_published_at ? (now - last_published_at).to_i : 0 oldest_queued_at = Models::Message.where(status: "queued").minimum(:queued_at) queued_latency = oldest_queued_at ? (now - oldest_queued_at).to_i : 0 { - queued: { count: counts_hash[:queued], age: queued_age, latency: queued_latency }, - publishing: { count: counts_hash[:publishing], age: publishing_age, latency: nil }, - published: { count: counts_hash[:published], age: published_age, latency: nil }, - failed: { count: counts_hash[:failed], age: failed_age, latency: nil }, - total: { count: counts_hash[:total], age: total_age, latency: nil } + queued: { + count: counts_hash[:queued], last_update: last_queued_at, latency: queued_latency + }, + publishing: { + count: counts_hash[:publishing], last_update: last_publishing_at, latency: nil + }, + published: { + count: counts_hash[:published], last_update: last_published_at, latency: nil + }, + failed: { + count: counts_hash[:failed], last_update: last_failed_at, latency: nil + }, + total: { + count: counts_hash[:total], last_update: nil, latency: nil + } } end end diff --git a/lib/outboxer/publisher.rb b/lib/outboxer/publisher.rb index bd24a3c6..4f7a836c 100644 --- a/lib/outboxer/publisher.rb +++ b/lib/outboxer/publisher.rb @@ -562,13 +562,13 @@ def create_publisher_thread(id:, index:, process_id: process_id, thread_id: Thread.current.object_id, queued_message_count: 0, - queued_message_count_last_updated_at: current_utc_time, + queued_message_count_last_updated_at: nil, publishing_message_count: 0, - publishing_message_count_last_updated_at: current_utc_time, + publishing_message_count_last_updated_at: nil, published_message_count: 0, - published_message_count_last_updated_at: current_utc_time, + published_message_count_last_updated_at: nil, failed_message_count: 0, - failed_message_count_last_updated_at: current_utc_time, + failed_message_count_last_updated_at: nil, created_at: current_utc_time, updated_at: current_utc_time) end diff --git a/lib/outboxer/web.rb b/lib/outboxer/web.rb index 28283db2..6f909b72 100755 --- a/lib/outboxer/web.rb +++ b/lib/outboxer/web.rb @@ -76,7 +76,7 @@ def pretty_duration_from_period(start_time:, end def pretty_duration_from_seconds(seconds:) - return "—" if seconds.nil? || seconds <= 0 + return "-" if seconds.nil? || seconds <= 0 # Units for sub-second durations sub_second_units = [ @@ -147,6 +147,12 @@ def pretty_duration_from_seconds_to_milliseconds(seconds:) result.join(" ") end + def pretty_time_ago_from_seconds(seconds:, time: ::Time) + return "-" if seconds.nil? || seconds <= 0 + + "#{time_ago_in_words(time.now - seconds)} ago" + end + def human_readable_size(kilobytes:) units = ["KB", "MB", "GB", "TB"] size = kilobytes.to_f @@ -161,23 +167,33 @@ def human_readable_size(kilobytes:) end def time_ago_in_words(time) + return "-" if time.nil? + seconds = (::Time.now - time).to_i + future = seconds.negative? + seconds = seconds.abs - if seconds < 60 - "#{seconds} #{seconds == 1 ? "second" : "seconds"}" - else - prefix = seconds.negative? ? "from now" : "" - seconds = seconds.abs + # return "-" if seconds == 0 + quantity, unit = case seconds - when 0..59 then "#{seconds} seconds #{prefix}" - when 60..3599 then "#{seconds / 60} minutes #{prefix}" - when 3600..86_399 then "#{seconds / 3600} hours #{prefix}" - when 86_400..2_591_999 then "#{seconds / 86_400} days #{prefix}" - when 2_592_000..31_103_999 then "#{seconds / 2_592_000} months #{prefix}" - else "#{seconds / 31_104_000} years #{prefix}" + when 0..59 + [seconds, "second"] + when 60..3_599 + [seconds / 60, "minute"] + when 3_600..86_399 + [seconds / 3_600, "hour"] + when 86_400..2_591_999 + [seconds / 86_400, "day"] + when 2_592_000..31_103_999 + [seconds / 2_592_000, "month"] + else + [seconds / 31_104_000, "year"] end - end + + unit += "s" unless quantity == 1 + + future ? "#{quantity} #{unit} from now" : "#{quantity} #{unit} ago" end end diff --git a/lib/outboxer/web/views/home.erb b/lib/outboxer/web/views/home.erb index 3743d99f..3fdeb04f 100644 --- a/lib/outboxer/web/views/home.erb +++ b/lib/outboxer/web/views/home.erb @@ -35,8 +35,8 @@ <%= publisher[:name] %> - <%= Outboxer::Web.time_ago_in_words(publisher[:created_at]) %> ago - <%= Outboxer::Web.time_ago_in_words(publisher[:updated_at]) %> ago + <%= Outboxer::Web.time_ago_in_words(publisher[:created_at]) %> + <%= Outboxer::Web.time_ago_in_words(publisher[:updated_at]) %> <%= publisher[:status] %> <%= Outboxer::Web.pretty_throughput(per_second: publisher[:metrics]['published']['throughput']) %> <%= Outboxer::Web.pretty_duration_from_seconds(seconds: publisher[:metrics]['latency']) %> @@ -112,7 +112,7 @@ Status Count - + Last Update Latency @@ -123,21 +123,24 @@ - "> + <% if status != Outboxer::Message::Status::PUBLISHED %> + "> + <%= status %> + + <% else %> <%= status %> - + <% end %> <%= Outboxer::Web.pretty_number(number: metrics[:count]) %> + <%= Outboxer::Web.time_ago_in_words(metrics[:last_update]) %> - <% if metrics[:latency] %> <%= Outboxer::Web.pretty_duration_from_seconds(seconds: metrics[:latency]) %> <% else %> - — + - <% end %> diff --git a/lib/outboxer/web/views/message.erb b/lib/outboxer/web/views/message.erb index 119bf69a..afa412ca 100644 --- a/lib/outboxer/web/views/message.erb +++ b/lib/outboxer/web/views/message.erb @@ -56,13 +56,13 @@ Queued - <%= Outboxer::Web.time_ago_in_words(message[:queued_at]) %> ago + <%= Outboxer::Web.time_ago_in_words(message[:queued_at]) %> Updated - <%= Outboxer::Web.time_ago_in_words(message[:updated_at]) %> ago + <%= Outboxer::Web.time_ago_in_words(message[:updated_at]) %> diff --git a/lib/outboxer/web/views/messages.erb b/lib/outboxer/web/views/messages.erb index 32581d73..4bfb09f7 100644 --- a/lib/outboxer/web/views/messages.erb +++ b/lib/outboxer/web/views/messages.erb @@ -150,10 +150,10 @@ - <%= Outboxer::Web.time_ago_in_words(message[:queued_at]) %> ago + <%= Outboxer::Web.time_ago_in_words(message[:queued_at]) %> - <%= Outboxer::Web.time_ago_in_words(message[:updated_at]) %> ago + <%= Outboxer::Web.time_ago_in_words(message[:updated_at]) %> <% if message[:publisher_exists] %> diff --git a/lib/outboxer/web/views/publisher.erb b/lib/outboxer/web/views/publisher.erb index 6ca3d4c4..2f2c5f38 100644 --- a/lib/outboxer/web/views/publisher.erb +++ b/lib/outboxer/web/views/publisher.erb @@ -63,13 +63,13 @@ Created - <%= Outboxer::Web.time_ago_in_words(publisher[:created_at]) %> ago + <%= Outboxer::Web.time_ago_in_words(publisher[:created_at]) %> Updated - <%= Outboxer::Web.time_ago_in_words(publisher[:updated_at]) %> ago + <%= Outboxer::Web.time_ago_in_words(publisher[:updated_at]) %> diff --git a/spec/lib/outboxer/message/metrics_by_status_spec.rb b/spec/lib/outboxer/message/metrics_by_status_spec.rb index 147e42b3..ae6c78de 100644 --- a/spec/lib/outboxer/message/metrics_by_status_spec.rb +++ b/spec/lib/outboxer/message/metrics_by_status_spec.rb @@ -13,6 +13,7 @@ module Outboxer publishing_message_count: 20, published_message_count: 30, failed_message_count: 40, + queued_message_count_last_updated_at: current_utc_time, publishing_message_count_last_updated_at: current_utc_time, published_message_count_last_updated_at: current_utc_time, failed_message_count_last_updated_at: current_utc_time @@ -27,6 +28,7 @@ module Outboxer publishing_message_count: 6, published_message_count: 7, failed_message_count: 8, + queued_message_count_last_updated_at: current_utc_time, publishing_message_count_last_updated_at: current_utc_time, published_message_count_last_updated_at: current_utc_time, failed_message_count_last_updated_at: current_utc_time @@ -37,11 +39,11 @@ module Outboxer result = Message.metrics_by_status(time: double(now: current_utc_time)) expect(result).to eq( - queued: { count: 15, age: 0, latency: 0 }, - publishing: { count: 26, age: 0, latency: nil }, - published: { count: 37, age: 0, latency: nil }, - failed: { count: 48, age: 0, latency: nil }, - total: { count: 126, age: 0, latency: nil } + queued: { count: 15, last_update: current_utc_time, latency: 0 }, + publishing: { count: 26, last_update: current_utc_time, latency: nil }, + published: { count: 37, last_update: current_utc_time, latency: nil }, + failed: { count: 48, last_update: current_utc_time, latency: nil }, + total: { count: 126, last_update: nil, latency: nil } ) end end From d50667162557d8298f38a455f67b19b99b0237d6 Mon Sep 17 00:00:00 2001 From: bedrock-adam Date: Sat, 13 Dec 2025 21:56:19 +1100 Subject: [PATCH 6/7] remove comments --- lib/outboxer/message.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/outboxer/message.rb b/lib/outboxer/message.rb index 136ba44c..65bf669e 100644 --- a/lib/outboxer/message.rb +++ b/lib/outboxer/message.rb @@ -751,17 +751,9 @@ def metrics_by_status(time: Time) counts_hash = counts.attributes.symbolize_keys.transform_values(&:to_i) last_queued_at = Models::Thread.maximum(:queued_message_count_last_updated_at) - # queued_age = last_queued_at ? (now - last_queued_at).to_i : 0 - last_publishing_at = Models::Thread.maximum(:publishing_message_count_last_updated_at) - # publishing_age = last_publishing_at ? (now - last_publishing_at).to_i : 0 - last_failed_at = Models::Thread.maximum(:failed_message_count_last_updated_at) - # failed_age = last_failed_at ? (now - last_failed_at).to_i : 0 - last_published_at = Models::Thread.maximum(:published_message_count_last_updated_at) - # published_age = last_published_at ? (now - last_published_at).to_i : 0 - oldest_queued_at = Models::Message.where(status: "queued").minimum(:queued_at) queued_latency = oldest_queued_at ? (now - oldest_queued_at).to_i : 0 From a6b6d053c31d9c9f6e526967021e7c814df233f3 Mon Sep 17 00:00:00 2001 From: bedrock-adam Date: Sat, 13 Dec 2025 21:57:00 +1100 Subject: [PATCH 7/7] remove unused method --- lib/outboxer/web.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/outboxer/web.rb b/lib/outboxer/web.rb index 6f909b72..fef3f003 100755 --- a/lib/outboxer/web.rb +++ b/lib/outboxer/web.rb @@ -147,12 +147,6 @@ def pretty_duration_from_seconds_to_milliseconds(seconds:) result.join(" ") end - def pretty_time_ago_from_seconds(seconds:, time: ::Time) - return "-" if seconds.nil? || seconds <= 0 - - "#{time_ago_in_words(time.now - seconds)} ago" - end - def human_readable_size(kilobytes:) units = ["KB", "MB", "GB", "TB"] size = kilobytes.to_f