Support getting the history of alarms

This commit is contained in:
周子博 2019-06-28 14:10:51 +08:00 committed by Shawn
parent 96fff39535
commit 3ad5700442
1 changed files with 28 additions and 19 deletions

View File

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