Skip to content

Commit d1a5dc2

Browse files
Merge pull request #12699 from rabbitmq/mergify/bp/v4.0.x/pr-12659
Make it possible to set some cluster metadata besides the name using tags (backport #12659)
2 parents 3e07594 + 81c897b commit d1a5dc2

File tree

5 files changed

+93
-6
lines changed

5 files changed

+93
-6
lines changed

deps/rabbit/priv/schema/rabbit.schema

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2688,6 +2688,20 @@ fun(Conf) ->
26882688
end
26892689
end}.
26902690

2691+
{mapping, "cluster_tags.$tag", "rabbit.cluster_tags", [
2692+
{datatype, [binary]}
2693+
]}.
2694+
2695+
{translation, "rabbit.cluster_tags",
2696+
fun(Conf) ->
2697+
case cuttlefish:conf_get("cluster_tags", Conf, undefined) of
2698+
none -> [];
2699+
_ ->
2700+
Settings = cuttlefish_variable:filter_by_prefix("cluster_tags", Conf),
2701+
[ {list_to_binary(K), V} || {[_, K], V} <- Settings]
2702+
end
2703+
end}.
2704+
26912705
% ===============================
26922706
% Validators
26932707
% ===============================

deps/rabbit/src/rabbit.erl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
%%---------------------------------------------------------------------------
4040
%% Boot steps.
41-
-export([maybe_insert_default_data/0, boot_delegate/0, recover/0,
41+
-export([update_cluster_tags/0, maybe_insert_default_data/0, boot_delegate/0, recover/0,
4242
pg_local_amqp_session/0,
4343
pg_local_amqp_connection/0]).
4444

@@ -208,6 +208,12 @@
208208
{requires, recovery},
209209
{enables, routing_ready}]}).
210210

211+
212+
-rabbit_boot_step({cluster_tags,
213+
[{description, "Set cluster tags"},
214+
{mfa, {?MODULE, update_cluster_tags, []}},
215+
{requires, core_initialized}]}).
216+
211217
-rabbit_boot_step({routing_ready,
212218
[{description, "message delivery logic ready"},
213219
{requires, [core_initialized, recovery]}]}).
@@ -1138,6 +1144,15 @@ pg_local_amqp_connection() ->
11381144
pg_local_scope(Prefix) ->
11391145
list_to_atom(io_lib:format("~s_~s", [Prefix, node()])).
11401146

1147+
1148+
-spec update_cluster_tags() -> 'ok'.
1149+
1150+
update_cluster_tags() ->
1151+
Tags = application:get_env(rabbit, cluster_tags, []),
1152+
?LOG_DEBUG("Seeding cluster tags from application environment key...",
1153+
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
1154+
rabbit_runtime_parameters:set_global(cluster_tags, Tags, <<"internal_user">>).
1155+
11411156
-spec maybe_insert_default_data() -> 'ok'.
11421157

11431158
maybe_insert_default_data() ->

deps/rabbitmq_cli/lib/rabbitmq/cli/ctl/commands/cluster_status_command.ex

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
3333
use RabbitMQ.CLI.Core.RequiresRabbitAppRunning
3434

3535
def run([], %{node: node_name, timeout: timeout} = opts) do
36-
status =
36+
status0 =
3737
case :rabbit_misc.rpc_call(node_name, :rabbit_db_cluster, :cli_cluster_status, []) do
3838
{:badrpc, {:EXIT, {:undef, _}}} ->
3939
:rabbit_misc.rpc_call(node_name, :rabbit_mnesia, :status, [])
@@ -45,11 +45,13 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
4545
status
4646
end
4747

48-
case status do
48+
case status0 do
4949
{:badrpc, _} = err ->
5050
err
5151

52-
status ->
52+
status0 ->
53+
tags = cluster_tags(node_name, timeout)
54+
status = status0 ++ [{:cluster_tags, tags}]
5355
case :rabbit_misc.rpc_call(node_name, :rabbit_nodes, :list_running, []) do
5456
{:badrpc, _} = err ->
5557
err
@@ -122,7 +124,6 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
122124

123125
def output(result, %{node: node_name}) when is_list(result) do
124126
m = result_map(result)
125-
126127
total_cores = Enum.reduce(m[:cpu_cores], 0, fn {_, val}, acc -> acc + val end)
127128

128129
cluster_name_section = [
@@ -131,6 +132,15 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
131132
"Total CPU cores available cluster-wide: #{total_cores}"
132133
]
133134

135+
cluster_tag_section =
136+
[
137+
"\n#{bright("Cluster Tags")}\n"
138+
] ++
139+
case m[:cluster_tags] do
140+
[] -> ["(none)"]
141+
tags -> cluster_tag_lines(tags)
142+
end
143+
134144
disk_nodes_section =
135145
[
136146
"\n#{bright("Disk Nodes")}\n"
@@ -210,6 +220,7 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
210220

211221
lines =
212222
cluster_name_section ++
223+
cluster_tag_section ++
213224
disk_nodes_section ++
214225
ram_nodes_section ++
215226
running_nodes_section ++
@@ -260,6 +271,7 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
260271
# {rabbit@warp10,[{resource_limit,memory,rabbit@warp10}]}]}]
261272
%{
262273
cluster_name: Keyword.get(result, :cluster_name),
274+
cluster_tags: result |> Keyword.get(:cluster_tags, []),
263275
disk_nodes: result |> Keyword.get(:nodes, []) |> Keyword.get(:disc, []),
264276
ram_nodes: result |> Keyword.get(:nodes, []) |> Keyword.get(:ram, []),
265277
running_nodes: result |> Keyword.get(:running_nodes, []) |> Enum.map(&to_string/1),
@@ -383,6 +395,18 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
383395
{node, result}
384396
end
385397

398+
defp cluster_tags(node, timeout) do
399+
case :rabbit_misc.rpc_call(
400+
node,
401+
:rabbit_runtime_parameters,
402+
:value_global,
403+
[:cluster_tags],
404+
timeout) do
405+
:not_found -> []
406+
tags -> tags
407+
end
408+
end
409+
386410
defp node_lines(nodes) do
387411
Enum.map(nodes, &to_string/1) |> Enum.sort()
388412
end
@@ -413,4 +437,10 @@ defmodule RabbitMQ.CLI.Ctl.Commands.ClusterStatusCommand do
413437
defp maintenance_lines(mapping) do
414438
Enum.map(mapping, fn {node, status} -> "Node: #{node}, status: #{status}" end)
415439
end
440+
441+
defp cluster_tag_lines(mapping) do
442+
Enum.map(mapping, fn {key, value} ->
443+
"#{key}: #{value}"
444+
end)
445+
end
416446
end

deps/rabbitmq_management/src/rabbit_mgmt_wm_overview.erl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ to_json(ReqData, Context = #context{user = User = #user{tags = Tags}}) ->
4747
{product_name, list_to_binary(rabbit:product_name())},
4848
{rabbitmq_version, list_to_binary(rabbit:base_product_version())},
4949
{cluster_name, rabbit_nodes:cluster_name()},
50+
{cluster_tags, cluster_tags()},
5051
{erlang_version, erlang_version()},
5152
{erlang_full_version, erlang_full_version()},
5253
{release_series_support_status, rabbit_release_series:readable_support_status()},
@@ -182,3 +183,10 @@ transform_retention_intervals([{MaxAgeInSeconds, _}|Rest], Acc) ->
182183
0
183184
end,
184185
transform_retention_intervals(Rest, [AccVal|Acc]).
186+
187+
cluster_tags() ->
188+
case rabbit_runtime_parameters:value_global(cluster_tags) of
189+
not_found ->
190+
[];
191+
Tags -> Tags
192+
end.

deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ all_tests() -> [
201201
disabled_qq_replica_opers_test,
202202
qq_status_test,
203203
list_deprecated_features_test,
204-
list_used_deprecated_features_test
204+
list_used_deprecated_features_test,
205+
cluster_tags_test
205206
].
206207

207208
%% -------------------------------------------------------------------
@@ -282,6 +283,12 @@ init_per_testcase(Testcase = disabled_qq_replica_opers_test, Config) ->
282283
rabbit_ct_broker_helpers:rpc_all(Config,
283284
application, set_env, [rabbitmq_management, restrictions, Restrictions]),
284285
rabbit_ct_helpers:testcase_started(Config, Testcase);
286+
init_per_testcase(Testcase = cluster_tags_test, Config) ->
287+
Tags = [{<<"az">>, <<"us-east-3">>}, {<<"region">>,<<"us-east">>}, {<<"environment">>,<<"production">>}],
288+
rpc(
289+
Config, rabbit_runtime_parameters, set_global,
290+
[cluster_tags, Tags, none]),
291+
rabbit_ct_helpers:testcase_started(Config, Testcase);
285292
init_per_testcase(queues_detailed_test, Config) ->
286293
IsEnabled = rabbit_ct_broker_helpers:is_feature_flag_enabled(
287294
Config, detailed_queues_endpoint),
@@ -348,6 +355,11 @@ end_per_testcase0(disabled_operator_policy_test, Config) ->
348355
end_per_testcase0(disabled_qq_replica_opers_test, Config) ->
349356
rpc(Config, application, unset_env, [rabbitmq_management, restrictions]),
350357
Config;
358+
end_per_testcase0(cluster_tags_test, Config) ->
359+
rpc(
360+
Config, rabbit_runtime_parameters, clear_global,
361+
[cluster_tags, none]),
362+
Config;
351363
end_per_testcase0(Testcase, Config)
352364
when Testcase == list_deprecated_features_test;
353365
Testcase == list_used_deprecated_features_test ->
@@ -3936,6 +3948,14 @@ list_used_deprecated_features_test(Config) ->
39363948
?assertEqual(list_to_binary(Desc), maps:get(desc, Feature)),
39373949
?assertEqual(list_to_binary(DocUrl), maps:get(doc_url, Feature)).
39383950

3951+
cluster_tags_test(Config) ->
3952+
Overview = http_get(Config, "/overview"),
3953+
Tags = maps:get(cluster_tags, Overview),
3954+
ExpectedTags = #{az => <<"us-east-3">>,environment => <<"production">>,
3955+
region => <<"us-east">>},
3956+
?assertEqual(ExpectedTags, Tags),
3957+
passed.
3958+
39393959
%% -------------------------------------------------------------------
39403960
%% Helpers.
39413961
%% -------------------------------------------------------------------

0 commit comments

Comments
 (0)