Using fixed topic for system message of alarm (#2647)

* Using fixed topic for system message of alarm
This commit is contained in:
tigercl 2019-06-21 19:51:58 +08:00 committed by turtleDeng
parent 37eef7b72a
commit 0c7c4ee417
2 changed files with 17 additions and 10 deletions

View File

@ -98,7 +98,7 @@ handle_event({set_alarm, Alarm = {AlarmId, AlarmDesc}}, State) ->
?LOG(warning, "~p set", [Alarm]), ?LOG(warning, "~p set", [Alarm]),
case encode_alarm(Alarm) of case encode_alarm(Alarm) of
{ok, Json} -> {ok, Json} ->
emqx_broker:safe_publish(alarm_msg(topic(alert, maybe_to_binary(AlarmId)), Json)); emqx_broker:safe_publish(alarm_msg(topic(alert), Json));
{error, Reason} -> {error, Reason} ->
?LOG(error, "Failed to encode alarm: ~p", [Reason]) ?LOG(error, "Failed to encode alarm: ~p", [Reason])
end, end,
@ -106,7 +106,12 @@ handle_event({set_alarm, Alarm = {AlarmId, AlarmDesc}}, State) ->
{ok, State}; {ok, State};
handle_event({clear_alarm, AlarmId}, State) -> handle_event({clear_alarm, AlarmId}, State) ->
?LOG(notice, "~p clear", [AlarmId]), ?LOG(notice, "~p clear", [AlarmId]),
emqx_broker:safe_publish(alarm_msg(topic(clear, maybe_to_binary(AlarmId)), <<"">>)), case encode_alarm({AlarmId, undefined}) of
{ok, Json} ->
emqx_broker:safe_publish(alarm_msg(topic(clear), Json));
{error, Reason} ->
?LOG(error, "Failed to encode alarm: ~p", [Reason])
end,
clear_alarm_(AlarmId), clear_alarm_(AlarmId),
{ok, State}; {ok, State};
handle_event(_, State) -> handle_event(_, State) ->
@ -142,19 +147,21 @@ encode_alarm({AlarmId, #alarm{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)}]}]); {ts, emqx_time:now_secs(Ts)}]}]);
encode_alarm({AlarmId, undefined}) ->
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)},
{desc, maybe_to_binary(AlarmDesc)}]). {description, 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),
emqx_message:set_headers(#{'Content-Type' => <<"application/json">>}, emqx_message:set_headers(#{'Content-Type' => <<"application/json">>},
emqx_message:set_flag(sys, Msg)). emqx_message:set_flag(sys, Msg)).
topic(alert, AlarmId) -> topic(alert) ->
emqx_topic:systop(<<"alarms/", AlarmId/binary, "/alert">>); emqx_topic:systop(<<"alarms/alert">>);
topic(clear, AlarmId) -> topic(clear) ->
emqx_topic:systop(<<"alarms/", AlarmId/binary, "/clear">>). emqx_topic:systop(<<"alarms/clear">>).
maybe_to_binary(Data) when is_binary(Data) -> maybe_to_binary(Data) when is_binary(Data) ->
Data; Data;

View File

@ -62,8 +62,8 @@ t_alarm_handler(_) ->
{ok, Data} = gen_tcp:recv(Sock, 0), {ok, Data} = gen_tcp:recv(Sock, 0),
{ok, ?CONNACK_PACKET(?RC_SUCCESS), <<>>, _} = raw_recv_parse(Data, ?MQTT_PROTO_V5), {ok, ?CONNACK_PACKET(?RC_SUCCESS), <<>>, _} = raw_recv_parse(Data, ?MQTT_PROTO_V5),
Topic1 = emqx_topic:systop(<<"alarms/alarm_for_test/alert">>), Topic1 = emqx_topic:systop(<<"alarms/alert">>),
Topic2 = emqx_topic:systop(<<"alarms/alarm_for_test/clear">>), Topic2 = emqx_topic:systop(<<"alarms/clear">>),
SubOpts = #{rh => 1, qos => ?QOS_2, rap => 0, nl => 0, rc => 0}, SubOpts = #{rh => 1, qos => ?QOS_2, rap => 0, nl => 0, rc => 0},
emqx_client_sock:send(Sock, emqx_client_sock:send(Sock,
raw_send_serialize( raw_send_serialize(