Skip to content
This repository was archived by the owner on Nov 17, 2020. It is now read-only.

Commit b1067ea

Browse files
author
Diana Corbacho
committed
Add relative memory endpoint
1 parent 4ffdb3f commit b1067ea

File tree

3 files changed

+47
-10
lines changed

3 files changed

+47
-10
lines changed

src/rabbit_mgmt_dispatcher.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ dispatcher() ->
4141
{["cluster-name"], rabbit_mgmt_wm_cluster_name, []},
4242
{["nodes"], rabbit_mgmt_wm_nodes, []},
4343
{["nodes", node], rabbit_mgmt_wm_node, []},
44-
{["nodes", node, "memory"], rabbit_mgmt_wm_node_memory, []},
44+
{["nodes", node, "memory"], rabbit_mgmt_wm_node_memory, [absolute]},
45+
{["nodes", node, "memory", "relative"], rabbit_mgmt_wm_node_memory, [relative]},
4546
{["extensions"], rabbit_mgmt_wm_extensions, []},
4647
{["all-configuration"], rabbit_mgmt_wm_definitions, []}, %% This was the old name, let's not break things gratuitously.
4748
{["definitions"], rabbit_mgmt_wm_definitions, []},

src/rabbit_mgmt_wm_node_memory.erl

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727

2828
%%--------------------------------------------------------------------
2929

30-
init(_Config) -> {ok, #context{}}.
30+
init([Mode]) -> {ok, {Mode, #context{}}}.
3131

32-
finish_request(ReqData, Context) ->
33-
{ok, rabbit_mgmt_cors:set_headers(ReqData, Context), Context}.
32+
finish_request(ReqData, {Mode, Context}) ->
33+
{ok, rabbit_mgmt_cors:set_headers(ReqData, Context), {Mode, Context}}.
3434

3535
allowed_methods(ReqData, Context) ->
3636
{['HEAD', 'GET', 'OPTIONS'], ReqData, Context}.
@@ -45,11 +45,12 @@ encodings_provided(ReqData, Context) ->
4545
resource_exists(ReqData, Context) ->
4646
{node_exists(ReqData, get_node(ReqData)), ReqData, Context}.
4747

48-
to_json(ReqData, Context) ->
49-
rabbit_mgmt_util:reply(augment(ReqData), ReqData, Context).
48+
to_json(ReqData, {Mode, Context}) ->
49+
rabbit_mgmt_util:reply(augment(Mode, ReqData), ReqData, {Mode, Context}).
5050

51-
is_authorized(ReqData, Context) ->
52-
rabbit_mgmt_util:is_authorized_monitor(ReqData, Context).
51+
is_authorized(ReqData, {Mode, Context}) ->
52+
{Res, RD, C} = rabbit_mgmt_util:is_authorized_monitor(ReqData, Context),
53+
{Res, RD, {Mode, C}}.
5354

5455
%%--------------------------------------------------------------------
5556
get_node(ReqData) ->
@@ -62,14 +63,30 @@ node_exists(ReqData, Node) ->
6263
[_] -> true
6364
end.
6465

65-
augment(ReqData) ->
66+
augment(Mode, ReqData) ->
6667
Node = get_node(ReqData),
6768
case node_exists(ReqData, Node) of
6869
false ->
6970
not_found;
7071
true ->
7172
case rpc:call(Node, rabbit_vm, memory, [], infinity) of
7273
{badrpc, _} -> [{memory, not_available}];
73-
Result -> [{memory, Result}]
74+
Result -> [{memory, format(Mode, Result)}]
7475
end
7576
end.
77+
78+
format(absolute, Result) ->
79+
Result;
80+
format(relative, Result) ->
81+
{[{total, Total}], Rest} = lists:splitwith(fun({Key, _}) ->
82+
Key == total
83+
end, Result),
84+
[{total, Total} | [{K, percentage(V, Total)} || {K, V} <- Rest]].
85+
86+
percentage(Part, Total) ->
87+
case round((Part/Total) * 100) of
88+
0 when Part =/= 0 ->
89+
1;
90+
Int ->
91+
Int
92+
end.

test/src/rabbit_mgmt_test_http.erl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,27 @@ memory_test() ->
116116
atom, other_system],
117117
assert_keys(Keys, pget(memory, Result)),
118118
http_get("/nodes/nonode/memory", ?NOT_FOUND),
119+
%% Relative memory as a percentage of the total
120+
Result1 = http_get(Path ++ "/relative", ?OK),
121+
assert_keys([memory], Result1),
122+
Breakdown = pget(memory, Result1),
123+
assert_keys(Keys, Breakdown),
124+
assert_percentage(Breakdown),
125+
http_get("/nodes/nonode/memory/relative", ?NOT_FOUND),
119126
ok.
120127

128+
assert_percentage(Breakdown) ->
129+
Total = lists:sum([P || {K, P} <- Breakdown, K =/= total]),
130+
Count = length(Breakdown) - 1,
131+
%% Rounding up and down can lose some digits. Never more than the number
132+
%% of items in the breakdown.
133+
case ((Total =< 100 + Count) andalso (Total >= 100 - Count)) of
134+
false ->
135+
throw({bad_percentage, Total, Breakdown});
136+
true ->
137+
ok
138+
end.
139+
121140
auth_test() ->
122141
http_put("/users/user", [{password, <<"user">>},
123142
{tags, <<"">>}], [?CREATED, ?NO_CONTENT]),

0 commit comments

Comments
 (0)