diff --git a/src/emqx_alarm_handler.erl b/src/emqx_alarm_handler.erl index 77cc09c60..e84665488 100644 --- a/src/emqx_alarm_handler.erl +++ b/src/emqx_alarm_handler.erl @@ -38,10 +38,11 @@ -export([ load/0 , unload/0 , get_alarms/0 + , get_alarms/1 ]). -record(common_alarm, {id, desc}). --record(alarm_history, {id, clear_at}). +-record(alarm_history, {id, desc, clear_at}). -define(ALARM_TAB, emqx_alarm). -define(ALARM_HISTORY_TAB, emqx_alarm_history). @@ -79,7 +80,14 @@ unload() -> gen_event:swap_handler(alarm_handler, {?MODULE, swap}, {alarm_handler, []}). get_alarms() -> - gen_event:call(alarm_handler, ?MODULE, get_alarms). + get_alarms(present). + +get_alarms(present) -> + Alarms = ets:tab2list(?ALARM_TAB), + [{Id, Desc} || #common_alarm{id = Id, desc = Desc} <- Alarms]; +get_alarms(history) -> + Alarms = ets:tab2list(?ALARM_HISTORY_TAB), + [{Id, Desc, ClearAt} || #alarm_history{id = Id, desc = Desc, clear_at = ClearAt} <- Alarms]. %%---------------------------------------------------------------------- %% gen_event callbacks @@ -117,14 +125,14 @@ handle_event({clear_alarm, AlarmId}, State) -> handle_event(_, State) -> {ok, State}. -handle_info(_, State) -> {ok, State}. +handle_info(_, State) -> + {ok, State}. -handle_call(get_alarms, State) -> - {ok, get_alarms_(), State}; -handle_call(_Query, State) -> {ok, {error, bad_query}, State}. +handle_call(_Query, State) -> + {ok, {error, bad_query}, State}. terminate(swap, _State) -> - {emqx_alarm_handler, get_alarms_()}; + {emqx_alarm_handler, get_alarms()}; terminate(_, _) -> ok. @@ -134,8 +142,8 @@ terminate(_, _) -> init_tables(ExistingAlarms) -> mnesia:clear_table(?ALARM_TAB), - lists:foreach(fun({Id, _Desc}) -> - set_alarm_history(Id) + lists:foreach(fun({Id, Desc}) -> + set_alarm_history(Id, Desc) end, ExistingAlarms). encode_alarm({AlarmId, #alarm{severity = Severity, @@ -146,12 +154,12 @@ encode_alarm({AlarmId, #alarm{severity = Severity, {desc, [{severity, Severity}, {title, iolist_to_binary(Title)}, {summary, iolist_to_binary(Summary)}, - {ts, emqx_time:now_secs(Ts)}]}]); + {timestamp, emqx_time:now_ms(Ts)}]}]); encode_alarm({AlarmId, undefined}) -> emqx_json:safe_encode([{id, maybe_to_binary(AlarmId)}]); encode_alarm({AlarmId, AlarmDesc}) -> emqx_json:safe_encode([{id, maybe_to_binary(AlarmId)}, - {description, maybe_to_binary(AlarmDesc)}]). + {desc, maybe_to_binary(AlarmDesc)}]). alarm_msg(Topic, Payload) -> Msg = emqx_message:make(?MODULE, Topic, Payload), @@ -172,14 +180,15 @@ set_alarm_(Id, Desc) -> mnesia:dirty_write(?ALARM_TAB, #common_alarm{id = Id, desc = Desc}). clear_alarm_(Id) -> - mnesia:dirty_delete(?ALARM_TAB, Id), - set_alarm_history(Id). + case mnesia:dirty_read(?ALARM_TAB, Id) of + [#common_alarm{desc = Desc}] -> + set_alarm_history(Id, Desc), + mnesia:dirty_delete(?ALARM_TAB, Id); + [] -> ok + end. -get_alarms_() -> - Alarms = ets:tab2list(?ALARM_TAB), - [{Id, Desc} || #common_alarm{id = Id, desc = Desc} <- Alarms]. - -set_alarm_history(Id) -> +set_alarm_history(Id, Desc) -> mnesia:dirty_write(?ALARM_HISTORY_TAB, #alarm_history{id = Id, - clear_at = undefined}). + desc = Desc, + clear_at = os:timestamp()}).