|
@@ -22,7 +22,7 @@
|
|
|
|
|
|
|
|
-logger_header("[OS_MON]").
|
|
-logger_header("[OS_MON]").
|
|
|
|
|
|
|
|
--export([start_link/1]).
|
|
|
|
|
|
|
+-export([start_link/0]).
|
|
|
|
|
|
|
|
-export([ get_cpu_check_interval/0
|
|
-export([ get_cpu_check_interval/0
|
|
|
, set_cpu_check_interval/1
|
|
, set_cpu_check_interval/1
|
|
@@ -51,8 +51,8 @@
|
|
|
|
|
|
|
|
-define(OS_MON, ?MODULE).
|
|
-define(OS_MON, ?MODULE).
|
|
|
|
|
|
|
|
-start_link(Opts) ->
|
|
|
|
|
- gen_server:start_link({local, ?OS_MON}, ?MODULE, [Opts], []).
|
|
|
|
|
|
|
+start_link() ->
|
|
|
|
|
+ gen_server:start_link({local, ?OS_MON}, ?MODULE, [], []).
|
|
|
|
|
|
|
|
%%--------------------------------------------------------------------
|
|
%%--------------------------------------------------------------------
|
|
|
%% API
|
|
%% API
|
|
@@ -88,13 +88,13 @@ get_sysmem_high_watermark() ->
|
|
|
memsup:get_sysmem_high_watermark().
|
|
memsup:get_sysmem_high_watermark().
|
|
|
|
|
|
|
|
set_sysmem_high_watermark(Float) ->
|
|
set_sysmem_high_watermark(Float) ->
|
|
|
- memsup:set_sysmem_high_watermark(Float / 100).
|
|
|
|
|
|
|
+ memsup:set_sysmem_high_watermark(Float).
|
|
|
|
|
|
|
|
get_procmem_high_watermark() ->
|
|
get_procmem_high_watermark() ->
|
|
|
memsup:get_procmem_high_watermark().
|
|
memsup:get_procmem_high_watermark().
|
|
|
|
|
|
|
|
set_procmem_high_watermark(Float) ->
|
|
set_procmem_high_watermark(Float) ->
|
|
|
- memsup:set_procmem_high_watermark(Float / 100).
|
|
|
|
|
|
|
+ memsup:set_procmem_high_watermark(Float).
|
|
|
|
|
|
|
|
call(Req) ->
|
|
call(Req) ->
|
|
|
gen_server:call(?OS_MON, Req, infinity).
|
|
gen_server:call(?OS_MON, Req, infinity).
|
|
@@ -103,14 +103,13 @@ call(Req) ->
|
|
|
%% gen_server callbacks
|
|
%% gen_server callbacks
|
|
|
%%--------------------------------------------------------------------
|
|
%%--------------------------------------------------------------------
|
|
|
|
|
|
|
|
-init([Opts]) ->
|
|
|
|
|
- set_mem_check_interval(proplists:get_value(mem_check_interval, Opts)),
|
|
|
|
|
- set_sysmem_high_watermark(proplists:get_value(sysmem_high_watermark, Opts)),
|
|
|
|
|
- set_procmem_high_watermark(proplists:get_value(procmem_high_watermark, Opts)),
|
|
|
|
|
- {ok, ensure_check_timer(#{cpu_high_watermark => proplists:get_value(cpu_high_watermark, Opts),
|
|
|
|
|
- cpu_low_watermark => proplists:get_value(cpu_low_watermark, Opts),
|
|
|
|
|
- cpu_check_interval => proplists:get_value(cpu_check_interval, Opts),
|
|
|
|
|
- timer => undefined})}.
|
|
|
|
|
|
|
+init([]) ->
|
|
|
|
|
+ Opts = emqx_config:get([sysmon, os]),
|
|
|
|
|
+ set_mem_check_interval(maps:get(mem_check_interval, Opts)),
|
|
|
|
|
+ set_sysmem_high_watermark(maps:get(sysmem_high_watermark, Opts)),
|
|
|
|
|
+ set_procmem_high_watermark(maps:get(procmem_high_watermark, Opts)),
|
|
|
|
|
+ start_check_timer(),
|
|
|
|
|
+ {ok, #{}}.
|
|
|
|
|
|
|
|
handle_call(get_cpu_check_interval, _From, State) ->
|
|
handle_call(get_cpu_check_interval, _From, State) ->
|
|
|
{reply, maps:get(cpu_check_interval, State, undefined), State};
|
|
{reply, maps:get(cpu_check_interval, State, undefined), State};
|
|
@@ -138,32 +137,30 @@ handle_cast(Msg, State) ->
|
|
|
?LOG(error, "Unexpected cast: ~p", [Msg]),
|
|
?LOG(error, "Unexpected cast: ~p", [Msg]),
|
|
|
{noreply, State}.
|
|
{noreply, State}.
|
|
|
|
|
|
|
|
-handle_info({timeout, Timer, check}, State = #{timer := Timer,
|
|
|
|
|
- cpu_high_watermark := CPUHighWatermark,
|
|
|
|
|
- cpu_low_watermark := CPULowWatermark}) ->
|
|
|
|
|
- NState =
|
|
|
|
|
|
|
+handle_info({timeout, _Timer, check}, State) ->
|
|
|
|
|
+ CPUHighWatermark = emqx_config:get([sysmon, os, cpu_high_watermark]) * 100,
|
|
|
|
|
+ CPULowWatermark = emqx_config:get([sysmon, os, cpu_low_watermark]) * 100,
|
|
|
case emqx_vm:cpu_util() of %% TODO: should be improved?
|
|
case emqx_vm:cpu_util() of %% TODO: should be improved?
|
|
|
- 0 ->
|
|
|
|
|
- State#{timer := undefined};
|
|
|
|
|
|
|
+ 0 -> ok;
|
|
|
Busy when Busy >= CPUHighWatermark ->
|
|
Busy when Busy >= CPUHighWatermark ->
|
|
|
emqx_alarm:activate(high_cpu_usage, #{usage => Busy,
|
|
emqx_alarm:activate(high_cpu_usage, #{usage => Busy,
|
|
|
high_watermark => CPUHighWatermark,
|
|
high_watermark => CPUHighWatermark,
|
|
|
low_watermark => CPULowWatermark}),
|
|
low_watermark => CPULowWatermark}),
|
|
|
- ensure_check_timer(State);
|
|
|
|
|
|
|
+ start_check_timer();
|
|
|
Busy when Busy =< CPULowWatermark ->
|
|
Busy when Busy =< CPULowWatermark ->
|
|
|
emqx_alarm:deactivate(high_cpu_usage),
|
|
emqx_alarm:deactivate(high_cpu_usage),
|
|
|
- ensure_check_timer(State);
|
|
|
|
|
|
|
+ start_check_timer();
|
|
|
_Busy ->
|
|
_Busy ->
|
|
|
- ensure_check_timer(State)
|
|
|
|
|
|
|
+ start_check_timer()
|
|
|
end,
|
|
end,
|
|
|
- {noreply, NState};
|
|
|
|
|
|
|
+ {noreply, State};
|
|
|
|
|
|
|
|
handle_info(Info, State) ->
|
|
handle_info(Info, State) ->
|
|
|
?LOG(error, "unexpected info: ~p", [Info]),
|
|
?LOG(error, "unexpected info: ~p", [Info]),
|
|
|
{noreply, State}.
|
|
{noreply, State}.
|
|
|
|
|
|
|
|
-terminate(_Reason, #{timer := Timer}) ->
|
|
|
|
|
- emqx_misc:cancel_timer(Timer).
|
|
|
|
|
|
|
+terminate(_Reason, _State) ->
|
|
|
|
|
+ ok.
|
|
|
|
|
|
|
|
code_change(_OldVsn, State, _Extra) ->
|
|
code_change(_OldVsn, State, _Extra) ->
|
|
|
{ok, State}.
|
|
{ok, State}.
|
|
@@ -172,8 +169,9 @@ code_change(_OldVsn, State, _Extra) ->
|
|
|
%% Internal functions
|
|
%% Internal functions
|
|
|
%%--------------------------------------------------------------------
|
|
%%--------------------------------------------------------------------
|
|
|
|
|
|
|
|
-ensure_check_timer(State = #{cpu_check_interval := Interval}) ->
|
|
|
|
|
|
|
+start_check_timer() ->
|
|
|
|
|
+ Interval = emqx_config:get([sysmon, os, cpu_check_interval]),
|
|
|
case erlang:system_info(system_architecture) of
|
|
case erlang:system_info(system_architecture) of
|
|
|
- "x86_64-pc-linux-musl" -> State;
|
|
|
|
|
- _ -> State#{timer := emqx_misc:start_timer(timer:seconds(Interval), check)}
|
|
|
|
|
|
|
+ "x86_64-pc-linux-musl" -> ok;
|
|
|
|
|
+ _ -> emqx_misc:start_timer(timer:seconds(Interval), check)
|
|
|
end.
|
|
end.
|