Skip to content

Commit 9645c81

Browse files
authored
Merge pull request #12444 from rabbitmq/improve-feature-flags-subsystem-logging
rabbit_feature_flags: Improve logging
2 parents 5bc0bcd + d8ae8af commit 9645c81

File tree

3 files changed

+120
-43
lines changed

3 files changed

+120
-43
lines changed

deps/rabbit/src/rabbit_feature_flags.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ get_stability(FeatureName) when is_atom(FeatureName) ->
744744
undefined -> undefined;
745745
FeatureProps -> get_stability(FeatureProps)
746746
end;
747-
get_stability(FeatureProps) when ?IS_FEATURE_FLAG(FeatureProps) ->
747+
get_stability(FeatureProps) when ?IS_FEATURE_FLAG(FeatureProps) ->
748748
maps:get(stability, FeatureProps, stable);
749749
get_stability(FeatureProps) when ?IS_DEPRECATION(FeatureProps) ->
750750
Phase = rabbit_deprecated_features:get_phase(FeatureProps),

deps/rabbit/src/rabbit_ff_controller.erl

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -440,17 +440,10 @@ check_node_compatibility_task1(NodeA, NodesA, NodeB, NodesB, NodeAAsVirigin)
440440
{ok, InventoryA0} ->
441441
InventoryA = virtually_reset_inventory(
442442
InventoryA0, NodeAAsVirigin),
443-
?LOG_DEBUG(
444-
"Feature flags: inventory of node `~ts`:~n~tp",
445-
[NodeA, InventoryA],
446-
#{domain => ?RMQLOG_DOMAIN_FEAT_FLAGS}),
443+
log_inventory(NodeA, InventoryA),
447444
case collect_inventory_on_nodes(NodesB) of
448445
{ok, InventoryB} ->
449-
?LOG_DEBUG(
450-
"Feature flags: inventory of node "
451-
"`~ts`:~n~tp",
452-
[NodeB, InventoryB],
453-
#{domain => ?RMQLOG_DOMAIN_FEAT_FLAGS}),
446+
log_inventory(NodeB, InventoryB),
454447
case are_compatible(InventoryA, InventoryB) of
455448
true ->
456449
?LOG_NOTICE(
@@ -485,6 +478,59 @@ check_node_compatibility_task1(NodeA, NodesA, NodeB, NodesB, NodeAAsVirigin)
485478
{error, {aborted_feature_flags_compat_check, Error}}
486479
end.
487480

481+
log_inventory(
482+
FromNode,
483+
#{feature_flags := FeatureFlags, states_per_node := StatesPerNode}) ->
484+
?LOG_DEBUG(
485+
begin
486+
AllFeatureNames = lists:sort(maps:keys(FeatureFlags)),
487+
Nodes = lists:sort(maps:keys(StatesPerNode)),
488+
LongestFeatureName = lists:foldl(
489+
fun(FeatureName, MaxLength) ->
490+
Length = length(
491+
atom_to_list(
492+
FeatureName)),
493+
if
494+
Length > MaxLength -> Length;
495+
true -> MaxLength
496+
end
497+
end, 0, AllFeatureNames),
498+
NodeInitialPrefix = lists:duplicate(LongestFeatureName + 1, $\s),
499+
{Header,
500+
HeaderTail} = lists:foldl(
501+
fun(Node, {String, Prefix}) ->
502+
String1 = io_lib:format(
503+
"~ts~ts ,-- ~ts~n",
504+
[String, Prefix, Node]),
505+
NextPrefix = Prefix ++ " |",
506+
{String1, NextPrefix}
507+
end, {"", NodeInitialPrefix}, Nodes),
508+
lists:flatten(
509+
io_lib:format(
510+
"Feature flags: inventory queried from node `~ts`:~n",
511+
[FromNode]) ++
512+
Header ++
513+
HeaderTail ++
514+
[io_lib:format("~n~*ts:", [LongestFeatureName, FeatureName]) ++
515+
[io_lib:format(
516+
" ~s",
517+
[begin
518+
State = maps:get(
519+
FeatureName,
520+
maps:get(Node, StatesPerNode),
521+
false),
522+
case State of
523+
true -> "x";
524+
state_changing -> "~";
525+
false -> " "
526+
end
527+
end])
528+
|| Node <- Nodes]
529+
|| FeatureName <- AllFeatureNames] ++
530+
[])
531+
end,
532+
#{domain_ => ?RMQLOG_DOMAIN_FEAT_FLAGS}).
533+
488534
-spec list_nodes_clustered_with(Node) -> Ret when
489535
Node :: node(),
490536
Ret :: Members | Error,
@@ -842,12 +888,14 @@ enable_many(#{states_per_node := _} = Inventory, FeatureNames) ->
842888
Ret :: ok | {error, Reason},
843889
Reason :: term().
844890

845-
enable_many_locked(#{states_per_node := _} = Inventory, [FeatureName | Rest]) ->
891+
enable_many_locked(
892+
#{states_per_node := _} = Inventory, [FeatureName | Rest]) ->
846893
case enable_if_supported(Inventory, FeatureName) of
847894
{ok, Inventory1} -> enable_many_locked(Inventory1, Rest);
848895
Error -> Error
849896
end;
850-
enable_many_locked(_Inventory, []) ->
897+
enable_many_locked(
898+
_Inventory, []) ->
851899
ok.
852900

853901
-spec enable_if_supported(Inventory, FeatureName) -> Ret when

deps/rabbit/src/rabbit_ff_registry_factory.erl

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -443,37 +443,66 @@ do_initialize_registry(#{feature_flags := AllFeatureFlags,
443443
written_to_disk := WrittenToDisk} = Inventory) ->
444444
%% We log the state of those feature flags.
445445
?LOG_DEBUG(
446-
lists:flatten(
447-
"Feature flags: list of feature flags found:\n" ++
448-
[io_lib:format(
449-
"Feature flags: [~ts] ~ts~n",
450-
[case maps:get(FeatureName, FeatureStates, false) of
451-
true -> "x";
452-
state_changing -> "~";
453-
false -> " "
454-
end,
455-
FeatureName])
456-
|| FeatureName <- lists:sort(maps:keys(AllFeatureFlags)),
457-
?IS_FEATURE_FLAG(maps:get(FeatureName, AllFeatureFlags))] ++
458-
"Feature flags: list of deprecated features found:\n" ++
459-
[io_lib:format(
460-
"Feature flags: [~ts] ~ts~n",
461-
[case maps:get(FeatureName, FeatureStates, false) of
462-
true -> "x";
463-
state_changing -> "~";
464-
false -> " "
465-
end,
466-
FeatureName])
467-
|| FeatureName <- lists:sort(maps:keys(AllFeatureFlags)),
468-
?IS_DEPRECATION(maps:get(FeatureName, AllFeatureFlags))] ++
469-
[io_lib:format(
470-
"Feature flags: scanned applications: ~tp~n"
471-
"Feature flags: feature flag states written to disk: ~ts",
472-
[ScannedApps,
473-
case WrittenToDisk of
474-
true -> "yes";
475-
false -> "no"
476-
end])]),
446+
begin
447+
AllFeatureNames = lists:sort(maps:keys(AllFeatureFlags)),
448+
{FeatureNames,
449+
DeprFeatureNames} = lists:partition(
450+
fun(FeatureName) ->
451+
FeatureProps = maps:get(
452+
FeatureName,
453+
AllFeatureFlags),
454+
?IS_FEATURE_FLAG(FeatureProps)
455+
end, AllFeatureNames),
456+
457+
IsRequired = fun(FeatureName) ->
458+
FeatureProps = maps:get(
459+
FeatureName,
460+
AllFeatureFlags),
461+
required =:=
462+
rabbit_feature_flags:get_stability(
463+
FeatureProps)
464+
end,
465+
{ReqFeatureNames,
466+
NonReqFeatureNames} = lists:partition(IsRequired, FeatureNames),
467+
{ReqDeprFeatureNames,
468+
NonReqDeprFeatureNames} = lists:partition(
469+
IsRequired, DeprFeatureNames),
470+
471+
lists:flatten(
472+
"Feature flags: list of feature flags found:\n" ++
473+
[io_lib:format(
474+
"Feature flags: [~ts] ~ts~n",
475+
[case maps:get(FeatureName, FeatureStates, false) of
476+
true -> "x";
477+
state_changing -> "~";
478+
false -> " "
479+
end,
480+
FeatureName])
481+
|| FeatureName <- NonReqFeatureNames] ++
482+
"Feature flags: list of deprecated features found:\n" ++
483+
[io_lib:format(
484+
"Feature flags: [~ts] ~ts~n",
485+
[case maps:get(FeatureName, FeatureStates, false) of
486+
true -> "x";
487+
state_changing -> "~";
488+
false -> " "
489+
end,
490+
FeatureName])
491+
|| FeatureName <- NonReqDeprFeatureNames] ++
492+
[io_lib:format(
493+
"Feature flags: required feature flags not listed above: ~b~n"
494+
"Feature flags: removed deprecated features not listed "
495+
"above: ~b~n"
496+
"Feature flags: scanned applications: ~0tp~n"
497+
"Feature flags: feature flag states written to disk: ~ts",
498+
[length(ReqFeatureNames),
499+
length(ReqDeprFeatureNames),
500+
ScannedApps,
501+
case WrittenToDisk of
502+
true -> "yes";
503+
false -> "no"
504+
end])])
505+
end,
477506
#{domain => ?RMQLOG_DOMAIN_FEAT_FLAGS}
478507
),
479508

0 commit comments

Comments
 (0)