diff --git a/apps/emqx/src/emqx_alarm_handler.erl b/apps/emqx/src/emqx_alarm_handler.erl index 1897556ab..2ba280f44 100644 --- a/apps/emqx/src/emqx_alarm_handler.erl +++ b/apps/emqx/src/emqx_alarm_handler.erl @@ -61,7 +61,10 @@ handle_event({set_alarm, {system_memory_high_watermark, []}}, State) -> Message = to_bin("System memory usage is higher than ~p%", [HighWatermark]), emqx_alarm:activate( high_system_memory_usage, - #{high_watermark => HighWatermark}, + #{ + high_watermark => HighWatermark, + percent => emqx_os_mon:current_sysmem_percent() + }, Message ), {ok, State}; diff --git a/apps/emqx/src/emqx_app.erl b/apps/emqx/src/emqx_app.erl index 25a6195be..ce09cf460 100644 --- a/apps/emqx/src/emqx_app.erl +++ b/apps/emqx/src/emqx_app.erl @@ -45,9 +45,9 @@ start(_Type, _Args) -> ok = maybe_start_quicer(), ok = emqx_bpapi:start(), wait_boot_shards(), + ok = emqx_alarm_handler:load(), {ok, Sup} = emqx_sup:start_link(), ok = maybe_start_listeners(), - ok = emqx_alarm_handler:load(), emqx_config:add_handlers(), register(emqx, self()), {ok, Sup}. diff --git a/apps/emqx/src/emqx_os_mon.erl b/apps/emqx/src/emqx_os_mon.erl index ad303d3e8..eafc8f1fd 100644 --- a/apps/emqx/src/emqx_os_mon.erl +++ b/apps/emqx/src/emqx_os_mon.erl @@ -31,6 +31,10 @@ set_procmem_high_watermark/1 ]). +-export([ + current_sysmem_percent/0 +]). + %% gen_server callbacks -export([ init/1, @@ -72,6 +76,20 @@ get_procmem_high_watermark() -> set_procmem_high_watermark(Float) -> memsup:set_procmem_high_watermark(Float). +current_sysmem_percent() -> + case erlang:whereis(memsup) of + undefined -> + undefined; + _Pid -> + {Total, Allocated, _Worst} = memsup:get_memory_data(), + case Total =/= 0 of + true -> + erlang:floor((Allocated / Total) * 10000) / 100; + false -> + undefined + end + end. + %%-------------------------------------------------------------------- %% gen_server callbacks %%-------------------------------------------------------------------- @@ -163,14 +181,12 @@ start_check_timer() -> %% and there is no exported function to remove the alerted flag, %% so it can only be checked again at startup. -ensure_system_memory_alarm(HW) -> - case erlang:whereis(memsup) of - undefined -> - ok; - _Pid -> - {Total, Allocated, _Worst} = memsup:get_memory_data(), - case Total =/= 0 andalso Allocated / Total > HW of - true -> emqx_alarm:activate(high_system_memory_usage, #{high_watermark => HW}); - false -> ok - end +ensure_system_memory_alarm(HW) when HW =< 1.0 andalso HW >= 0 -> + case current_sysmem_percent() of + Usage when Usage > (HW * 100) -> + gen_event:notify( + alarm_handler, {set_alarm, {system_memory_high_watermark, []}} + ); + _ -> + ok end.