Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 7 additions & 38 deletions lib/outboxer/message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -712,48 +712,17 @@ def rollup_counts(time: Time)
def count_by_status
ActiveRecord::Base.connection_pool.with_connection do
result = Models::Message::Count.select(
"COALESCE(SUM(queued), 0) AS queued",
"COALESCE(SUM(publishing), 0) AS publishing",
"COALESCE(SUM(published), 0) AS published",
"COALESCE(SUM(failed), 0) AS failed"
"COALESCE(SUM(queued), 0) AS queued",
"COALESCE(SUM(publishing), 0) AS publishing",
"COALESCE(SUM(published), 0) AS published",
"COALESCE(SUM(failed), 0) AS failed",
"COALESCE(SUM(queued + publishing + published + failed), 0) AS total"
).take

result.attributes.symbolize_keys.slice(
:queued, :publishing, :published, :failed
)
end
end

# Retrieves and calculates metrics related to message statuses,
# using the unified Counter.total for all counts.
# Latency and throughput are placeholders (0) until time-series metrics are implemented.
#
# @return [Hash] detailed metrics across various message statuses.
def metrics
totals = count_by_status

metrics = {
all: {
count: {
total: totals.values.sum
}
}
}

{
queued: :queued,
publishing: :publishing,
published: :published,
failed: :failed
}.each do |status, field|
metrics[status] = {
count: { total: totals[field].to_i },
latency: 0,
throughput: 0
}
:queued, :publishing, :published, :failed, :total
).transform_values(&:to_i)
end

metrics
end
end
end
24 changes: 12 additions & 12 deletions lib/outboxer/web.rb
Original file line number Diff line number Diff line change
Expand Up @@ -215,12 +215,12 @@ def time_ago_in_words(time)
per_page: denormalised_query_params[:per_page],
time_zone: denormalised_query_params[:time_zone])

messages_metrics = Message.metrics
message_count_by_status = Message.count_by_status

publishers = Publisher.all

erb :home, locals: {
messages_metrics: messages_metrics,
message_count_by_status: message_count_by_status,
denormalised_query_params: denormalised_query_params,
normalised_query_params: normalised_query_params,
normalised_query_string: normalised_query_string,
Expand Down Expand Up @@ -253,12 +253,12 @@ def time_ago_in_words(time)
per_page: denormalised_query_params[:per_page],
time_zone: denormalised_query_params[:time_zone])

messages_metrics = Message.metrics
message_count_by_status = Message.count_by_status

publishers = Publisher.all

erb :home, locals: {
messages_metrics: messages_metrics,
message_count_by_status: message_count_by_status,
denormalised_query_params: denormalised_query_params,
normalised_query_params: normalised_query_params,
normalised_query_string: normalised_query_string,
Expand Down Expand Up @@ -311,7 +311,7 @@ def time_ago_in_words(time)
per_page: denormalised_query_params[:per_page],
time_zone: denormalised_query_params[:time_zone])

messages_metrics = Message.metrics
message_count_by_status = Message.count_by_status

paginated_messages = Message.list(
status: denormalised_query_params[:status],
Expand All @@ -327,7 +327,7 @@ def time_ago_in_words(time)
denormalised_query_params: denormalised_query_params)

erb :messages, locals: {
messages_metrics: messages_metrics,
message_count_by_status: message_count_by_status,
messages: paginated_messages[:messages],
denormalised_query_params: denormalised_query_params,
normalised_query_params: normalised_query_params,
Expand Down Expand Up @@ -627,7 +627,7 @@ def normalise_query_string(status: Message::LIST_STATUS_DEFAULT,
per_page: denormalised_query_params[:per_page],
time_zone: denormalised_query_params[:time_zone])

messages_metrics = Message.metrics
message_count_by_status = Message.count_by_status

message = Message.find_by_id(id: params[:id])

Expand All @@ -638,7 +638,7 @@ def normalise_query_string(status: Message::LIST_STATUS_DEFAULT,
denormalised_query_params: denormalised_query_params,
normalised_query_params: normalised_query_params,
normalised_query_string: normalised_query_string,
messages_metrics: messages_metrics,
message_count_by_status: message_count_by_status,
message: message,
messageable: messageable
}
Expand All @@ -654,15 +654,15 @@ def normalise_query_string(status: Message::LIST_STATUS_DEFAULT,
time_zone: params[:time_zone])

message = Message.find_by_id(id: params[:id])
messages_metrics = Message.metrics
message_count_by_status = Message.count_by_status

messageable_class = message[:messageable_type]&.safe_constantize
messageable = messageable_class&.find_by_id(id: message[:messageable_id])

erb :messageable, locals: {
message: message,
messageable: messageable,
messages_metrics: messages_metrics,
message_count_by_status: message_count_by_status,
denormalised_query_params: denormalised_query_params
}
end
Expand Down Expand Up @@ -740,10 +740,10 @@ def normalise_query_string(status: Message::LIST_STATUS_DEFAULT,

publisher = Publisher.find_by_id(id: params[:id])

messages_metrics = Message.metrics
message_count_by_status = Message.count_by_status

erb :publisher, locals: {
messages_metrics: messages_metrics,
message_count_by_status: message_count_by_status,
denormalised_query_params: denormalised_query_params,
normalised_query_params: normalised_query_params,
normalised_query_string: normalised_query_string,
Expand Down
6 changes: 3 additions & 3 deletions lib/outboxer/web/views/home.erb
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@
<%= status %>
</a>
</td>
<td><%= Outboxer::Web.pretty_number(number: messages_metrics[status.to_sym][:count][:total]) %></td>
<td><%= Outboxer::Web.pretty_throughput(per_second: messages_metrics[status.to_sym][:throughput]) %></td>
<td><%= Outboxer::Web.pretty_duration_from_seconds(seconds: messages_metrics[status.to_sym][:latency]) %></td>
<td><%= Outboxer::Web.pretty_number(number: message_count_by_status[status.to_sym]) %></td>
<td><%= Outboxer::Web.pretty_throughput(per_second: 0) %></td>
<td><%= Outboxer::Web.pretty_duration_from_seconds(seconds: 0) %></td>
</tr>
<% end %>
</tbody>
Expand Down
6 changes: 3 additions & 3 deletions lib/outboxer/web/views/layout.erb
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
<div class="container-fluid">
<a class="navbar-brand" href="<%= outboxer_path('') %>">
<i class="bi bi-envelope-open-fill"></i> Outboxer
<span class="badge bg-secondary"><%= Outboxer::Web.pretty_number(number: messages_metrics[:published][:count][:total]) %></span>
<span class="badge bg-secondary"><%= Outboxer::Web.pretty_number(number: message_count_by_status[:published]) %></span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
Expand All @@ -71,15 +71,15 @@
<li class="nav-item">
<a class="nav-link <%= 'active' if denormalised_query_params[:status] == nil %>"
href="<%= outboxer_path("/messages#{normalise_query_string(status: nil, time_zone: denormalised_query_params[:time_zone])}") %>">
All (<%= Outboxer::Web.pretty_number(number: messages_metrics[:all][:count][:total]) %>)
All (<%= Outboxer::Web.pretty_number(number: message_count_by_status[:total]) %>)
</a>
</li>

<% statuses.each do |status| %>
<li class="nav-item">
<a class="nav-link <%= 'active' if denormalised_query_params[:status] == status[:key] %>"
href="<%= outboxer_path("/messages#{normalise_query_string(status: status[:key], time_zone: params[:time_zone])}") %>">
<%= status[:name] %> (<%= Outboxer::Web.pretty_number(number: messages_metrics[status[:key].to_sym][:count][:total]) %>)
<%= status[:name] %> (<%= Outboxer::Web.pretty_number(number: message_count_by_status[status[:key].to_sym]) %>)
</a>
</li>
<% end %>
Expand Down
4 changes: 2 additions & 2 deletions quickstart_e2e_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,13 @@ attempt = 1
max_attempts = 10
delay = 1

published_count = Outboxer::Message.count_by_status["published"]
published_count = Outboxer::Message.count_by_status[:published]

while (attempt <= max_attempts) && published_count.zero?
warn "Outboxer not published yet (#{attempt}/#{max_attempts})..."
sleep delay
attempt += 1
published_count = Outboxer::Message.count_by_status["published"]
published_count = Outboxer::Message.count_by_status[:published]
end

Process.kill("TERM", publisher_pid)
Expand Down
2 changes: 1 addition & 1 deletion spec/lib/outboxer/message/count_by_status_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ module Outboxer

it "returns total counts by status" do
expect(Message.count_by_status).to eq(
queued: 15, publishing: 26, published: 37, failed: 48)
queued: 15, publishing: 26, published: 37, failed: 48, total: 126)
end
end
end
Expand Down
123 changes: 0 additions & 123 deletions spec/lib/outboxer/message/metrics_spec.rb

This file was deleted.