diff --git a/apps/emqx_management/src/emqx_mgmt_cli.erl b/apps/emqx_management/src/emqx_mgmt_cli.erl index 50f4b21af..0f60317fa 100644 --- a/apps/emqx_management/src/emqx_mgmt_cli.erl +++ b/apps/emqx_management/src/emqx_mgmt_cli.erl @@ -135,14 +135,35 @@ cluster(["force-leave", SNode]) -> end; cluster(["status"]) -> emqx_ctl:print("Cluster status: ~p~n", [ekka_cluster:info()]); +cluster(["status", "--json"]) -> + Info = sort_map_list_fields(ekka_cluster:info()), + emqx_ctl:print("~ts~n", [emqx_logger_jsonfmt:best_effort_json(Info)]); cluster(_) -> emqx_ctl:usage([ {"cluster join ", "Join the cluster"}, {"cluster leave", "Leave the cluster"}, {"cluster force-leave ", "Force the node leave from cluster"}, - {"cluster status", "Cluster status"} + {"cluster status [--json]", "Cluster status"} ]). +%% sort lists for deterministic output +sort_map_list_fields(Map) when is_map(Map) -> + lists:foldl( + fun(Field, Acc) -> + sort_map_list_field(Field, Acc) + end, + Map, + maps:keys(Map) + ); +sort_map_list_fields(NotMap) -> + NotMap. + +sort_map_list_field(Field, Map) -> + case maps:get(Field, Map) of + [_ | _] = L -> Map#{Field := lists:sort(L)}; + _ -> Map + end. + %%-------------------------------------------------------------------- %% @doc Query clients