From 727bc712e6eabc69f6e9960986cc8674615fef68 Mon Sep 17 00:00:00 2001 From: Thales Macedo Garitezi Date: Mon, 25 Apr 2022 11:21:38 -0300 Subject: [PATCH] fix(telemetry): avoid hanging emqx_modules_app init with request --- apps/emqx_modules/src/emqx_telemetry.erl | 13 ++++++++++--- apps/emqx_modules/test/emqx_telemetry_SUITE.erl | 10 +++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/emqx_modules/src/emqx_telemetry.erl b/apps/emqx_modules/src/emqx_telemetry.erl index 8a86819ee..1791e39ad 100644 --- a/apps/emqx_modules/src/emqx_telemetry.erl +++ b/apps/emqx_modules/src/emqx_telemetry.erl @@ -145,9 +145,13 @@ init(_Opts) -> {NodeUUID, ClusterUUID} = ensure_uuids(), {ok, State0#state{node_uuid = NodeUUID, cluster_uuid = ClusterUUID}}. -handle_call(enable, _From, State0) -> - State = report_telemetry(State0), - {reply, ok, ensure_report_timer(State)}; +handle_call(enable, _From, State) -> + %% Wait a few moments before reporting the first telemetry, as the + %% apps might still be starting up. Also, this avoids hanging + %% `emqx_modules_app' initialization in case the POST request + %% takes a lot of time. + FirstReportTimeoutMS = timer:seconds(10), + {reply, ok, ensure_report_timer(FirstReportTimeoutMS, State)}; handle_call(disable, _From, State = #state{timer = Timer}) -> emqx_misc:cancel_timer(Timer), {reply, ok, State#state{timer = undefined}}; @@ -194,6 +198,9 @@ official_version(Version) -> match =:= re:run(Version, Pt, [{capture, none}]). ensure_report_timer(State = #state{report_interval = ReportInterval}) -> + ensure_report_timer(ReportInterval, State). + +ensure_report_timer(ReportInterval, State) -> State#state{timer = emqx_misc:start_timer(ReportInterval, time_to_report_telemetry_data)}. os_info() -> diff --git a/apps/emqx_modules/test/emqx_telemetry_SUITE.erl b/apps/emqx_modules/test/emqx_telemetry_SUITE.erl index d7acc9218..75ced7cfd 100644 --- a/apps/emqx_modules/test/emqx_telemetry_SUITE.erl +++ b/apps/emqx_modules/test/emqx_telemetry_SUITE.erl @@ -367,7 +367,15 @@ t_send_after_enable(_) -> ok = snabbkaffe:start_trace(), try ok = emqx_telemetry:enable(), - ?assertMatch({ok, _}, ?block_until(#{?snk_kind := telemetry_data_reported}, 2000, 100)), + Timeout = 12_000, + ?assertMatch( + {ok, _}, + ?wait_async_action( + ok = emqx_telemetry:enable(), + #{?snk_kind := telemetry_data_reported}, + Timeout + ) + ), receive {request, post, _URL, _Headers, Body} -> {ok, Decoded} = emqx_json:safe_decode(Body, [return_maps]),