diff options
| author | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2020-04-24 14:32:50 +0200 |
|---|---|---|
| committer | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2020-04-30 18:19:28 +0200 |
| commit | 151f10300115f5f100a39659486d1d496e9b5028 (patch) | |
| tree | b45402329ac99a17d9d639fa5925ed5ca48a9027 /src/rabbit.erl | |
| parent | 17085c8004e6aa9e4e5a839ecffd7fe42c90a314 (diff) | |
| download | rabbitmq-server-git-151f10300115f5f100a39659486d1d496e9b5028.tar.gz | |
rabbit: Report base and overridden product info separately
Now, `rabbit:product_info/0` will report the base name & version
("RabbitMQ" and its actual version) separately from the final product
name & version (if any).
If the product name & version were not overridden in the configuration or
the environment, they will be missing from the product info return
value.
It allows caller to distinguish situations where the product name &
version were set or not.
An example use case is `rabbitmqctl status`: we want to report the
product name & version only if they were overridden. If they were not,
the "Product name" and "Product version" won't be added to the output.
Only "RabbitMQ version" will be displayed.
To help with the above, the map returned by `rabbit:product_info/0` also
contains a flag, `product_overridden`, set to true if they were.
Finally, the RabbitMQ version is often associated with the Erlang/OTP
release. So include this into the returned map. This will save an
additional RPC call if the remote caller is interested in both.
Diffstat (limited to 'src/rabbit.erl')
| -rw-r--r-- | src/rabbit.erl | 104 |
1 files changed, 65 insertions, 39 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl index e109c10c46..eabd2dff07 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -673,15 +673,11 @@ maybe_print_boot_progress(true, IterationsLeft) -> status() -> Version = base_product_version(), - #{name := ProductName, - version := ProductVersion} = product_info(), S1 = [{pid, list_to_integer(os:getpid())}, %% The timeout value used is twice that of gen_server:call/2. {running_applications, rabbit_misc:which_applications()}, {os, os:type()}, {rabbitmq_version, Version}, - {product_name, ProductName}, - {product_version, ProductVersion}, {erlang_version, erlang:system_info(system_version)}, {memory, rabbit_vm:memory()}, {alarms, alarms()}, @@ -723,7 +719,16 @@ status() -> [] end, S7 = [{totals, Totals}], - S1 ++ S2 ++ S3 ++ S4 ++ S5 ++ S6 ++ S7. + S8 = lists:filter( + fun + ({product_base_name, _}) -> true; + ({product_base_version, _}) -> true; + ({product_name, _}) -> true; + ({product_version, _}) -> true; + (_) -> false + end, + maps:to_list(product_info())), + S1 ++ S2 ++ S3 ++ S4 ++ S5 ++ S6 ++ S7 ++ S8. alarms() -> Alarms = rabbit_misc:with_exit_handler(rabbit_misc:const([]), @@ -1283,17 +1288,25 @@ validate_msg_store_io_batch_size_and_credit_disc_bound(CreditDiscBound, -spec product_name() -> string(). product_name() -> - #{name := ProductName} = product_info(), - ProductName. + case product_info() of + #{product_name := ProductName} -> ProductName; + #{product_base_name := BaseName} -> BaseName + end. -spec product_version() -> string(). product_version() -> - #{version := ProductVersion} = product_info(), - ProductVersion. + case product_info() of + #{product_version := ProductVersion} -> ProductVersion; + #{product_base_version := BaseVersion} -> BaseVersion + end. --spec product_info() -> #{name := string(), - version := string()}. +-spec product_info() -> #{product_base_name := string(), + product_base_version := string(), + product_overridden := boolean(), + product_name => string(), + product_version => string(), + otp_release := string()}. product_info() -> PTKey = {?MODULE, product}, @@ -1303,6 +1316,12 @@ product_info() -> persistent_term:get(PTKey) catch error:badarg -> + BaseName = base_product_name(), + BaseVersion = base_product_version(), + Info0 = #{product_base_name => BaseName, + product_base_version => BaseVersion, + otp_release => rabbit_misc:otp_release()}, + {NameFromEnv, VersionFromEnv} = case rabbit_env:get_context() of #{product_name := NFE, @@ -1310,34 +1329,41 @@ product_info() -> _ -> {undefined, undefined} end, - Info = - if - NameFromEnv =/= undefined andalso - VersionFromEnv =/= undefined -> - #{name => NameFromEnv, - version => VersionFromEnv}; - true -> - Name = case NameFromEnv of - undefined -> - string_from_app_env( - product_name, - base_product_name()); - _ -> - NameFromEnv - end, - Version = case VersionFromEnv of - undefined -> - string_from_app_env( - product_version, - base_product_version()); - _ -> - VersionFromEnv - end, - #{name => Name, - version => Version} - end, - persistent_term:put(PTKey, Info), - Info + Info1 = case NameFromEnv of + undefined -> + NameFromApp = string_from_app_env( + product_name, + undefined), + case NameFromApp of + undefined -> + Info0; + _ -> + Info0#{product_name => NameFromApp, + product_overridden => true} + end; + _ -> + Info0#{product_name => NameFromEnv, + product_overridden => true} + end, + + Info2 = case VersionFromEnv of + undefined -> + VersionFromApp = string_from_app_env( + product_version, + undefined), + case VersionFromApp of + undefined -> + Info1; + _ -> + Info1#{product_version => VersionFromApp, + product_overridden => true} + end; + _ -> + Info1#{product_version => VersionFromEnv, + product_overridden => true} + end, + persistent_term:put(PTKey, Info2), + Info2 end. string_from_app_env(Key, Default) -> |
