From 6e819b5ecb64fedcbc28010b39874b93bbb49d2f Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Wed, 20 Apr 2022 06:39:07 -0300 Subject: [PATCH] feat(telemetry): enable/disable even in non-official versions - Makes telemetry enabled by default on official versions. - Allow enabling/disabling telemetry even on non-official versions. --- apps/emqx_modules/src/emqx_modules_conf.erl | 3 +- apps/emqx_modules/src/emqx_telemetry.erl | 51 +++++++++---------- apps/emqx_modules/src/emqx_telemetry_api.erl | 2 +- .../test/emqx_telemetry_SUITE.erl | 13 ++++- .../test/emqx_telemetry_api_SUITE.erl | 9 ++-- 5 files changed, 44 insertions(+), 34 deletions(-) diff --git a/apps/emqx_modules/src/emqx_modules_conf.erl b/apps/emqx_modules/src/emqx_modules_conf.erl index b3afae82b..dbb1c8f39 100644 --- a/apps/emqx_modules/src/emqx_modules_conf.erl +++ b/apps/emqx_modules/src/emqx_modules_conf.erl @@ -84,7 +84,8 @@ remove_topic_metrics(Topic) -> -spec is_telemetry_enabled() -> boolean(). is_telemetry_enabled() -> - emqx:get_config([telemetry, enable], true). + IsOfficial = emqx_telemetry:official_version(emqx_release:version()), + emqx:get_config([telemetry, enable], IsOfficial). -spec set_telemetry_status(boolean()) -> ok | {error, term()}. set_telemetry_status(Status) -> diff --git a/apps/emqx_modules/src/emqx_telemetry.erl b/apps/emqx_modules/src/emqx_telemetry.erl index 45ca1a7b0..8a86819ee 100644 --- a/apps/emqx_modules/src/emqx_telemetry.erl +++ b/apps/emqx_modules/src/emqx_telemetry.erl @@ -116,7 +116,7 @@ stop() -> gen_server:stop(?MODULE). enable() -> - gen_server:call(?MODULE, enable). + gen_server:call(?MODULE, enable, 15_000). disable() -> gen_server:call(?MODULE, disable). @@ -146,21 +146,11 @@ init(_Opts) -> {ok, State0#state{node_uuid = NodeUUID, cluster_uuid = ClusterUUID}}. handle_call(enable, _From, State0) -> - case ?MODULE:official_version(emqx_app:get_release()) of - true -> - State = report_telemetry(State0), - {reply, ok, ensure_report_timer(State)}; - false -> - {reply, {error, not_official_version}, State0} - end; + State = report_telemetry(State0), + {reply, ok, ensure_report_timer(State)}; handle_call(disable, _From, State = #state{timer = Timer}) -> - case ?MODULE:official_version(emqx_app:get_release()) of - true -> - emqx_misc:cancel_timer(Timer), - {reply, ok, State#state{timer = undefined}}; - false -> - {reply, {error, not_official_version}, State} - end; + emqx_misc:cancel_timer(Timer), + {reply, ok, State#state{timer = undefined}}; handle_call(get_node_uuid, _From, State = #state{node_uuid = UUID}) -> {reply, {ok, UUID}, State}; handle_call(get_cluster_uuid, _From, State = #state{cluster_uuid = UUID}) -> @@ -200,7 +190,7 @@ code_change(_OldVsn, State, _Extra) -> %%------------------------------------------------------------------------------ official_version(Version) -> - Pt = "^\\d+\\.\\d+(?:(-(?:alpha|beta|rc)\\.[1-9][0-9]*)|\\.\\d+)$", + Pt = "^\\d+\\.\\d+(?:\\.\\d+)?(?:(-(?:alpha|beta|rc)\\.[1-9][0-9]*))?$", match =:= re:run(Version, Pt, [{capture, none}]). ensure_report_timer(State = #state{report_interval = ReportInterval}) -> @@ -454,16 +444,25 @@ advanced_mqtt_features() -> maps:map(fun(_K, V) -> bool2int(V) end, AdvancedFeatures). get_authn_authz_info() -> - #{ - authenticators := AuthnTypes, - overridden_listeners := OverriddenListeners - } = emqx_authn:get_enabled_authns(), - AuthzTypes = emqx_authz:get_enabled_authzs(), - #{ - authn => AuthnTypes, - authn_listener => OverriddenListeners, - authz => AuthzTypes - }. + try + #{ + authenticators := AuthnTypes, + overridden_listeners := OverriddenListeners + } = emqx_authn:get_enabled_authns(), + AuthzTypes = emqx_authz:get_enabled_authzs(), + #{ + authn => AuthnTypes, + authn_listener => OverriddenListeners, + authz => AuthzTypes + } + catch + _:_ -> + #{ + authn => [], + authn_listener => [], + authz => [] + } + end. get_gateway_info() -> try diff --git a/apps/emqx_modules/src/emqx_telemetry_api.erl b/apps/emqx_modules/src/emqx_telemetry_api.erl index 7b39d63e7..7d65cbd7e 100644 --- a/apps/emqx_modules/src/emqx_telemetry_api.erl +++ b/apps/emqx_modules/src/emqx_telemetry_api.erl @@ -215,7 +215,7 @@ status(put, #{body := Body}) -> Reason = case Enable of true -> <<"Telemetry status is already enabled">>; - false -> <<"Telemetry status is already disable">> + false -> <<"Telemetry status is already disabled">> end, {400, #{code => 'BAD_REQUEST', message => Reason}}; false -> diff --git a/apps/emqx_modules/test/emqx_telemetry_SUITE.erl b/apps/emqx_modules/test/emqx_telemetry_SUITE.erl index db4ffcd22..d7acc9218 100644 --- a/apps/emqx_modules/test/emqx_telemetry_SUITE.erl +++ b/apps/emqx_modules/test/emqx_telemetry_SUITE.erl @@ -242,7 +242,18 @@ t_official_version(_) -> false = emqx_telemetry:official_version("1.1-alpha.0"), true = emqx_telemetry:official_version("1.1-beta.1"), true = emqx_telemetry:official_version("1.1-rc.1"), - false = emqx_telemetry:official_version("1.1-alpha.a"). + false = emqx_telemetry:official_version("1.1-alpha.a"), + true = emqx_telemetry:official_version("5.0.0"), + true = emqx_telemetry:official_version("5.0.0-alpha.1"), + true = emqx_telemetry:official_version("5.0.0-beta.4"), + true = emqx_telemetry:official_version("5.0-rc.1"), + true = emqx_telemetry:official_version("5.0.0-rc.1"), + false = emqx_telemetry:official_version("5.0.0-alpha.a"), + false = emqx_telemetry:official_version("5.0.0-beta.a"), + false = emqx_telemetry:official_version("5.0.0-rc.a"), + false = emqx_telemetry:official_version("5.0.0-foo"), + false = emqx_telemetry:official_version("5.0.0-rc.1-ccdf7920"), + ok. t_get_telemetry(_Config) -> {ok, TelemetryData} = emqx_telemetry:get_telemetry(), diff --git a/apps/emqx_modules/test/emqx_telemetry_api_SUITE.erl b/apps/emqx_modules/test/emqx_telemetry_api_SUITE.erl index 6ad1da219..4ebd155d2 100644 --- a/apps/emqx_modules/test/emqx_telemetry_api_SUITE.erl +++ b/apps/emqx_modules/test/emqx_telemetry_api_SUITE.erl @@ -52,19 +52,18 @@ end_per_suite(_Config) -> ]), ok. -init_per_testcase(t_status_fail, Config) -> +init_per_testcase(t_status_non_official, Config) -> meck:new(emqx_telemetry, [non_strict, passthrough]), meck:expect(emqx_telemetry, official_version, 1, false), Config; init_per_testcase(t_status, Config) -> meck:new(emqx_telemetry, [non_strict, passthrough]), - meck:expect(emqx_telemetry, official_version, 1, true), meck:expect(emqx_telemetry, enable, fun() -> ok end), Config; init_per_testcase(_TestCase, Config) -> Config. -end_per_testcase(t_status_fail, _Config) -> +end_per_testcase(t_status_non_official, _Config) -> meck:unload(emqx_telemetry); end_per_testcase(t_status, _Config) -> meck:unload(emqx_telemetry); @@ -138,9 +137,9 @@ t_status(_) -> ) ). -t_status_fail(_) -> +t_status_non_official(_) -> ?assertMatch( - {ok, 400, _}, + {ok, 200, _}, request( put, uri(["telemetry", "status"]),