diff --git a/apps/emqx_management/src/emqx_mgmt.erl b/apps/emqx_management/src/emqx_mgmt.erl index bfba34603..ce83b9b71 100644 --- a/apps/emqx_management/src/emqx_mgmt.erl +++ b/apps/emqx_management/src/emqx_mgmt.erl @@ -101,16 +101,6 @@ , delete_banned/1 ]). --ifndef(EMQX_ENTERPRISE). - --export([ enable_telemetry/0 - , disable_telemetry/0 - , get_telemetry_status/0 - , get_telemetry_data/0 - ]). - --endif. - %% Common Table API -export([ item/2 , max_row_limit/0 @@ -498,38 +488,6 @@ create_banned(Banned) -> delete_banned(Who) -> emqx_banned:delete(Who). - - -%%-------------------------------------------------------------------- -%% Telemtry API -%%-------------------------------------------------------------------- - --ifndef(EMQX_ENTERPRISE). - -enable_telemetry() -> - lists:foreach(fun enable_telemetry/1,ekka_mnesia:running_nodes()). - -enable_telemetry(Node) when Node =:= node() -> - emqx_telemetry:enable(); -enable_telemetry(Node) -> - rpc_call(Node, enable_telemetry, [Node]). - -disable_telemetry() -> - lists:foreach(fun disable_telemetry/1,ekka_mnesia:running_nodes()). - -disable_telemetry(Node) when Node =:= node() -> - emqx_telemetry:disable(); -disable_telemetry(Node) -> - rpc_call(Node, disable_telemetry, [Node]). - -get_telemetry_status() -> - [{enabled, emqx_telemetry:is_enabled()}]. - -get_telemetry_data() -> - emqx_telemetry:get_telemetry(). - --endif. - %%-------------------------------------------------------------------- %% Common Table API %%-------------------------------------------------------------------- diff --git a/apps/emqx_telemetry/etc/emqx_telemetry.conf b/apps/emqx_telemetry/etc/emqx_telemetry.conf index 326ef0508..bbe4a2fd4 100644 --- a/apps/emqx_telemetry/etc/emqx_telemetry.conf +++ b/apps/emqx_telemetry/etc/emqx_telemetry.conf @@ -1,28 +1,3 @@ -##-------------------------------------------------------------------- -## Telemetry -##-------------------------------------------------------------------- - -## Enable telemetry -## -## Value: true | false -## -## Default: true -telemetry.enabled = true - -## The destination URL for the telemetry data report -## -## Value: String -## -## Default: "https://telemetry.emqx.io/api/telemetry" -telemetry.url = "https://telemetry.emqx.io/api/telemetry" - -## Interval for reporting telemetry data -## -## Value: Duration -## -d: day -## -h: hour -## -m: minute -## -s: second -## -## Default: 7d -telemetry.report_interval = 7d +emqx_telemetry:{ + enabled: true +} diff --git a/apps/emqx_telemetry/include/emqx_telemetry.hrl b/apps/emqx_telemetry/include/emqx_telemetry.hrl new file mode 100644 index 000000000..334173015 --- /dev/null +++ b/apps/emqx_telemetry/include/emqx_telemetry.hrl @@ -0,0 +1,5 @@ +%% The destination URL for the telemetry data report +-define(TELEMETRY_URL, "https://telemetry.emqx.io/api/telemetry"). + +%% Interval for reporting telemetry data, Default: 7d +-define(REPORT_INTERVAR, 604800). diff --git a/apps/emqx_telemetry/priv/emqx_telemetry.schema b/apps/emqx_telemetry/priv/emqx_telemetry.schema deleted file mode 100644 index 87f502234..000000000 --- a/apps/emqx_telemetry/priv/emqx_telemetry.schema +++ /dev/null @@ -1,17 +0,0 @@ -%%-*- mode: erlang -*- -%% Retainer config mapping - -{mapping, "telemetry.enabled", "emqx_telemetry.enabled", [ - {default, true}, - {datatype, {enum, [true, false]}} -]}. - -{mapping, "telemetry.url", "emqx_telemetry.url", [ - {default, "https://telemetry.emqx.io/api/telemetry"}, - {datatype, string} -]}. - -{mapping, "telemetry.report_interval", "emqx_telemetry.report_interval", [ - {default, "7d"}, - {datatype, {duration, s}} -]}. \ No newline at end of file diff --git a/apps/emqx_telemetry/src/emqx_telemetry.app.src b/apps/emqx_telemetry/src/emqx_telemetry.app.src index e65678c37..0f6bee95c 100644 --- a/apps/emqx_telemetry/src/emqx_telemetry.app.src +++ b/apps/emqx_telemetry/src/emqx_telemetry.app.src @@ -1,6 +1,6 @@ {application, emqx_telemetry, [{description, "EMQ X Telemetry"}, - {vsn, "4.3.1"}, % strict semver, bump manually! + {vsn, "5.0.0"}, % strict semver, bump manually! {modules, []}, {registered, [emqx_telemetry_sup]}, {applications, [kernel,stdlib]}, diff --git a/apps/emqx_telemetry/src/emqx_telemetry.appup.src b/apps/emqx_telemetry/src/emqx_telemetry.appup.src deleted file mode 100644 index 27998f0d5..000000000 --- a/apps/emqx_telemetry/src/emqx_telemetry.appup.src +++ /dev/null @@ -1,15 +0,0 @@ -%% -*- mode: erlang -*- -{VSN, - [ - {"4.3.0", [ - {load_module, emqx_telemetry, brutal_purge, soft_purge, []} - ]}, - {<<".*">>, []} - ], - [ - {"4.3.0", [ - {load_module, emqx_telemetry, brutal_purge, soft_purge, []} - ]}, - {<<".*">>, []} - ] -}. diff --git a/apps/emqx_telemetry/src/emqx_telemetry.erl b/apps/emqx_telemetry/src/emqx_telemetry.erl index 3e8d3ffd3..ea4017dc9 100644 --- a/apps/emqx_telemetry/src/emqx_telemetry.erl +++ b/apps/emqx_telemetry/src/emqx_telemetry.erl @@ -24,7 +24,7 @@ -include_lib("kernel/include/file.hrl"). -include_lib("snabbkaffe/include/snabbkaffe.hrl"). --logger_header("[Telemetry]"). +-include("emqx_telemetry.hrl"). %% Mnesia bootstrap -export([mnesia/1]). @@ -82,7 +82,7 @@ timer = undefined :: undefined | reference() }). -%% The count of 100-nanosecond intervals between the UUID epoch +%% The count of 100-nanosecond intervals between the UUID epoch %% 1582-10-15 00:00:00 and the UNIX epoch 1970-01-01 00:00:00. -define(GREGORIAN_EPOCH_OFFSET, 16#01b21dd213814000). @@ -140,16 +140,11 @@ get_telemetry() -> %% is very small, it should be safe to ignore. -dialyzer([{nowarn_function, [init/1]}]). init([Opts]) -> - State = #state{url = get_value(url, Opts), - report_interval = timer:seconds(get_value(report_interval, Opts))}, + State = #state{url = ?TELEMETRY_URL, + report_interval = timer:seconds(?REPORT_INTERVAR)}, NState = case mnesia:dirty_read(?TELEMETRY, ?UNIQUE_ID) of [] -> - Enabled = case search_telemetry_enabled() of - {error, not_found} -> - get_value(enabled, Opts); - {M, F} -> - erlang:apply(M, F, []) - end, + Enabled = proplists:get_value(enabled, Opts, true), UUID = generate_uuid(), mnesia:dirty_write(?TELEMETRY, #telemetry{id = ?UNIQUE_ID, uuid = UUID, @@ -237,14 +232,6 @@ official_version(Version) -> ensure_report_timer(State = #state{report_interval = ReportInterval}) -> State#state{timer = emqx_misc:start_timer(ReportInterval, time_to_report_telemetry_data)}. -license() -> - case search_telemetry_license() of - {error, not_found} -> - [{edition, <<"community">>}]; - {M, F} -> - erlang:apply(M, F, []) - end. - os_info() -> case erlang:system_info(os_type) of {unix,darwin} -> @@ -348,7 +335,7 @@ generate_uuid() -> get_telemetry(#state{uuid = UUID}) -> OSInfo = os_info(), [{emqx_version, bin(emqx_app:get_release())}, - {license, license()}, + {license, [{edition, <<"community">>}]}, {os_name, bin(get_value(os_name, OSInfo))}, {os_version, bin(get_value(os_version, OSInfo))}, {otp_version, bin(otp_version())}, @@ -375,58 +362,6 @@ report_telemetry(State = #state{url = URL}) -> httpc_request(Method, URL, Headers, Body) -> httpc:request(Method, {URL, Headers, "application/json", Body}, [], []). -ignore_lib_apps(Apps) -> - LibApps = [kernel, stdlib, sasl, appmon, eldap, erts, - syntax_tools, ssl, crypto, mnesia, os_mon, - inets, goldrush, gproc, runtime_tools, - snmp, otp_mibs, public_key, asn1, ssh, hipe, - common_test, observer, webtool, xmerl, tools, - test_server, compiler, debugger, eunit, et, - wx], - [AppName || {AppName, _, _} <- Apps, not lists:member(AppName, LibApps)]. - -search_telemetry_license() -> - search_function(telemetry_license). - -search_telemetry_enabled() -> - search_function(telemetry_enabled). - -search_function(Name) -> - case search_attrs(Name) of - [] -> - {error, not_found}; - Callbacks -> - case lists:filter(fun({M, F}) -> - erlang:function_exported(M, F, 0) - end, Callbacks) of - [] -> {error, not_found}; - [{M, F} | _] -> {M, F} - end - end. - -search_attrs(Name) -> - Apps = ignore_lib_apps(application:loaded_applications()), - search_attrs(Name, Apps). - -search_attrs(Name, Apps) -> - lists:foldl(fun(App, Acc) -> - {ok, Modules} = application:get_key(App, modules), - Attrs = lists:foldl(fun(Module, Acc0) -> - case proplists:get_value(Name, module_attributes(Module), undefined) of - undefined -> Acc0; - Attrs0 -> Acc0 ++ Attrs0 - end - end, [], Modules), - Acc ++ Attrs - end, [], Apps). - -module_attributes(Module) -> - try Module:module_info(attributes) - catch - error:undef -> []; - error:Reason -> error(Reason) - end. - bin(L) when is_list(L) -> list_to_binary(L); bin(B) when is_binary(B) -> diff --git a/apps/emqx_telemetry/src/emqx_telemetry_api.erl b/apps/emqx_telemetry/src/emqx_telemetry_api.erl index a6e4f220a..8bb97086e 100644 --- a/apps/emqx_telemetry/src/emqx_telemetry_api.erl +++ b/apps/emqx_telemetry/src/emqx_telemetry_api.erl @@ -51,15 +51,15 @@ %%-------------------------------------------------------------------- cli(["enable"]) -> - emqx_mgmt:enable_telemetry(), + enable_telemetry(), emqx_ctl:print("Enable telemetry successfully~n"); cli(["disable"]) -> - emqx_mgmt:disable_telemetry(), + disable_telemetry(), emqx_ctl:print("Disable telemetry successfully~n"); cli(["get", "status"]) -> - case emqx_mgmt:get_telemetry_status() of + case get_telemetry_status() of [{enabled, true}] -> emqx_ctl:print("Telemetry is enabled~n"); [{enabled, false}] -> @@ -67,7 +67,7 @@ cli(["get", "status"]) -> end; cli(["get", "data"]) -> - {ok, TelemetryData} = emqx_mgmt:get_telemetry_data(), + {ok, TelemetryData} = get_telemetry_data(), case emqx_json:safe_encode(TelemetryData, [pretty]) of {ok, Bin} -> emqx_ctl:print("~s~n", [Bin]); @@ -97,7 +97,7 @@ enable(_Bindings, Params) -> end. get_status(_Bindings, _Params) -> - return(get_telemetry_status()). + return({ok, get_telemetry_status()}). get_data(_Bindings, _Params) -> return(get_telemetry_data()). @@ -119,7 +119,7 @@ disable_telemetry(Node) -> rpc_call(Node, ?MODULE, disable_telemetry, [Node]). get_telemetry_status() -> - {ok, [{enabled, emqx_telemetry:is_enabled()}]}. + [{enabled, emqx_telemetry:is_enabled()}]. get_telemetry_data() -> emqx_telemetry:get_telemetry(). diff --git a/apps/emqx_telemetry/src/emqx_telemetry_app.erl b/apps/emqx_telemetry/src/emqx_telemetry_app.erl index 5effededa..8a5b34627 100644 --- a/apps/emqx_telemetry/src/emqx_telemetry_app.erl +++ b/apps/emqx_telemetry/src/emqx_telemetry_app.erl @@ -18,16 +18,22 @@ -behaviour(application). --emqx_plugin(?MODULE). +-define(APP, emqx_telemetry). -export([ start/2 , stop/1 ]). start(_Type, _Args) -> - emqx_ctl:register_command(telemetry, {emqx_telemetry_api, cli}), - Env = application:get_all_env(emqx_telemetry), - emqx_telemetry_sup:start_link(Env). + %% TODO + %% After the relevant code for building hocon configuration will be deleted + %% Get the configuration using emqx_config:get + ConfFile = filename:join([emqx:get_env(plugins_etc_dir), ?APP]) ++ ".conf", + {ok, RawConfig} = hocon:load(ConfFile), + Config = hocon_schema:check_plain(emqx_telemetry_schema, RawConfig, #{atom_key => true}), + emqx_config_handler:update_config(emqx_config_handler, Config), + Enabled = emqx_config:get([?APP, enabled], true), + emqx_telemetry_sup:start_link([{enabled, Enabled}]). stop(_State) -> emqx_ctl:unregister_command(telemetry), diff --git a/apps/emqx_telemetry/src/emqx_telemetry_schema.erl b/apps/emqx_telemetry/src/emqx_telemetry_schema.erl new file mode 100644 index 000000000..1a60ac946 --- /dev/null +++ b/apps/emqx_telemetry/src/emqx_telemetry_schema.erl @@ -0,0 +1,13 @@ +-module(emqx_telemetry_schema). + +-include_lib("typerefl/include/types.hrl"). + +-behaviour(hocon_schema). + +-export([ structs/0 + , fields/1]). + +structs() -> ["emqx_telemetry"]. + +fields("emqx_telemetry") -> + [{enabled, emqx_schema:t(boolean(), undefined, false)}]. diff --git a/apps/emqx_telemetry/test/emqx_telemetry_SUITE.erl b/apps/emqx_telemetry/test/emqx_telemetry_SUITE.erl index 9431cd325..39dcbf68c 100644 --- a/apps/emqx_telemetry/test/emqx_telemetry_SUITE.erl +++ b/apps/emqx_telemetry/test/emqx_telemetry_SUITE.erl @@ -29,11 +29,20 @@ all() -> emqx_ct:all(?MODULE). init_per_testcase(_, Config) -> emqx_ct_helpers:boot_modules(all), - emqx_ct_helpers:start_apps([emqx_modules, emqx_telemetry]), + emqx_ct_helpers:start_apps([emqx_telemetry], fun set_special_configs/1), Config. end_per_testcase(_, _Config) -> - emqx_ct_helpers:stop_apps([emqx_telemetry, emqx_modules]). + emqx_ct_helpers:stop_apps([emqx_telemetry]). + +set_special_configs(emqx_telemetry) -> + application:set_env(emqx, plugins_etc_dir, + emqx_ct_helpers:deps_path(emqx_telemetry, "test")), + Conf = #{<<"emqx_telemetry">> => #{<<"enabled">> => true}}, + ok = file:write_file(filename:join(emqx:get_env(plugins_etc_dir), 'emqx_telemetry.conf'), jsx:encode(Conf)), + ok; +set_special_configs(_App) -> + ok. t_uuid(_) -> UUID = emqx_telemetry:generate_uuid(), @@ -41,9 +50,7 @@ t_uuid(_) -> ?assertEqual(5, length(Parts)), {ok, UUID2} = emqx_telemetry:get_uuid(), emqx_telemetry:stop(), - emqx_telemetry:start_link([{enabled, true}, - {url, "https://telemetry.emqx.io/api/telemetry"}, - {report_interval, 7 * 24 * 60 * 60}]), + emqx_telemetry:start_link([{enabled, true}]), {ok, UUID3} = emqx_telemetry:get_uuid(), ?assertEqual(UUID2, UUID3). diff --git a/data/loaded_plugins.tmpl b/data/loaded_plugins.tmpl index d0dac7fe1..5922f6dc5 100644 --- a/data/loaded_plugins.tmpl +++ b/data/loaded_plugins.tmpl @@ -3,6 +3,5 @@ {emqx_modules, {{enable_plugin_emqx_modules}}}. {emqx_recon, {{enable_plugin_emqx_recon}}}. {emqx_retainer, {{enable_plugin_emqx_retainer}}}. -{emqx_telemetry, {{enable_plugin_emqx_telemetry}}}. {emqx_rule_engine, {{enable_plugin_emqx_rule_engine}}}. {emqx_bridge_mqtt, {{enable_plugin_emqx_bridge_mqtt}}}. diff --git a/rebar.config.erl b/rebar.config.erl index 5414ebfd5..56987485e 100644 --- a/rebar.config.erl +++ b/rebar.config.erl @@ -189,7 +189,6 @@ overlay_vars_rel(RelType) -> , {enable_plugin_emqx_modules, false} %% modules is not a plugin in ce , {enable_plugin_emqx_recon, true} , {enable_plugin_emqx_retainer, true} - , {enable_plugin_emqx_telemetry, true} , {vm_args_file, VmArgs} ]. @@ -249,6 +248,7 @@ relx_apps(ReleaseType) -> , emqx_connector , emqx_data_bridge ] + ++ [emqx_telemetry || not is_enterprise()] ++ [emqx_modules || not is_enterprise()] ++ [emqx_license || is_enterprise()] ++ [bcrypt || provide_bcrypt_release(ReleaseType)] @@ -289,7 +289,6 @@ relx_plugin_apps(ReleaseType) -> , emqx_sasl , emqx_statsd ] - ++ [emqx_telemetry || not is_enterprise()] ++ relx_plugin_apps_per_rel(ReleaseType) ++ relx_plugin_apps_enterprise(is_enterprise()) ++ relx_plugin_apps_extra(). @@ -380,6 +379,7 @@ emqx_etc_overlay_common() -> {"{{base_dir}}/lib/emqx/etc/emqx.conf", "etc/emqx.conf"}, {"{{base_dir}}/lib/emqx/etc/ssl_dist.conf", "etc/ssl_dist.conf"}, {"{{base_dir}}/lib/emqx_data_bridge/etc/emqx_data_bridge.conf", "etc/plugins/emqx_data_bridge.conf"}, + {"{{base_dir}}/lib/emqx_telemetry/etc/emqx_telemetry.conf", "etc/plugins/emqx_telemetry.conf"}, {"{{base_dir}}/lib/emqx_authz/etc/emqx_authz.conf", "etc/plugins/authz.conf"}, %% TODO: check why it has to end with .paho %% and why it is put to etc/plugins dir