From 635d0a871ccce5ae42cd2f026b2d5e3b7354f4fa Mon Sep 17 00:00:00 2001 From: Aaron Seo Date: Sun, 24 Mar 2024 04:52:29 +0000 Subject: [PATCH] Support enable_queue_totals when queue name is specified For `/api/queues`, users can specify `disable_stats=true` and `enable_queue_totals=true` parameters to return a concise set of fields. However, the `enable_queue_totals` is not currently supported for `/api/queues//`, probably just a small oversight that slipped through the cracks. This commit adds that support and updates the respective unit test, focusing on not breaking existing public functions and on simplicity, at the cost of a slight bit of duplication. (cherry picked from commit 09d1ec12213433abc712b1143d2c1d70333594e0) --- .../src/rabbit_mgmt_wm_queue.erl | 27 ++++++++++++++++--- .../test/rabbit_mgmt_only_http_SUITE.erl | 8 +++--- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue.erl b/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue.erl index f3c8c5e66969..b40df0de4abf 100644 --- a/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue.erl +++ b/deps/rabbitmq_management/src/rabbit_mgmt_wm_queue.erl @@ -50,8 +50,13 @@ to_json(ReqData, Context) -> rabbit_mgmt_format:strip_pids(Q)), rabbit_mgmt_util:reply(ensure_defaults(Payload), ReqData, Context); true -> - rabbit_mgmt_util:reply(rabbit_mgmt_format:strip_pids(queue(ReqData)), - ReqData, Context) + Q = case rabbit_mgmt_util:enable_queue_totals(ReqData) of + false -> queue(ReqData); + true -> queue_with_totals(ReqData) + end, + rabbit_mgmt_util:reply( + rabbit_mgmt_format:strip_pids(Q), + ReqData, Context) end catch {error, invalid_range_parameters, Reason} -> @@ -110,10 +115,26 @@ queue(ReqData) -> VHost -> queue(VHost, rabbit_mgmt_util:id(queue, ReqData)) end. - queue(VHost, QName) -> Name = rabbit_misc:r(VHost, queue, QName), case rabbit_amqqueue:lookup(Name) of {ok, Q} -> rabbit_mgmt_format:queue(Q); {error, not_found} -> not_found end. + +queue_with_totals(ReqData) -> + case rabbit_mgmt_util:vhost(ReqData) of + not_found -> not_found; + VHost -> queue_with_totals(VHost, rabbit_mgmt_util:id(queue, ReqData)) + end. + +queue_with_totals(VHost, QName) -> + Name = rabbit_misc:r(VHost, queue, QName), + case rabbit_amqqueue:lookup(Name) of + {ok, Q} -> QueueInfo = rabbit_amqqueue:info(Q, + [name, durable, auto_delete, exclusive, + owner_pid, arguments, type, state, + policy, totals, online, type_specific]), + rabbit_mgmt_format:queue_info(QueueInfo); + {error, not_found} -> not_found + end. diff --git a/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl b/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl index 261b39a61503..8d4477a00256 100644 --- a/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl +++ b/deps/rabbitmq_management/test/rabbit_mgmt_only_http_SUITE.erl @@ -516,14 +516,14 @@ queues_enable_totals_test(Config) -> vhost => <<"/">>, durable => true, auto_delete => false, - exclusive => false, + exclusive => null, arguments => #{'x-queue-type' => <<"quorum">>}, leader => NodeBin, + messages => 2, + messages_ready => 2, + messages_unacknowledged => 0, members => [NodeBin]}, Queue), - ?assert(not maps:is_key(messages, Queue)), - ?assert(not maps:is_key(messages_ready, Queue)), - ?assert(not maps:is_key(messages_unacknowledged, Queue)), ?assert(not maps:is_key(message_stats, Queue)), ?assert(not maps:is_key(messages_details, Queue)), ?assert(not maps:is_key(reductions_details, Queue)),