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
, 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()}).