Przeglądaj źródła

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

* Using fixed topic for system message of alarm
tigercl 6 lat temu
rodzic
commit
0c7c4ee417
2 zmienionych plików z 17 dodań i 10 usunięć
  1. 15 8
      src/emqx_alarm_handler.erl
  2. 2 2
      test/emqx_alarm_handler_SUITE.erl

+ 15 - 8
src/emqx_alarm_handler.erl

@@ -98,7 +98,7 @@ handle_event({set_alarm, Alarm = {AlarmId, AlarmDesc}}, State) ->
     ?LOG(warning, "~p set", [Alarm]),
     case encode_alarm(Alarm) of
         {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} ->
             ?LOG(error, "Failed to encode alarm: ~p", [Reason])
     end,
@@ -106,7 +106,12 @@ handle_event({set_alarm, Alarm = {AlarmId, AlarmDesc}}, State) ->
     {ok, State};
 handle_event({clear_alarm, AlarmId}, State) ->
     ?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),
     {ok, State};
 handle_event(_, State) ->
@@ -142,19 +147,21 @@ encode_alarm({AlarmId, #alarm{severity  = Severity,
                                    {title, iolist_to_binary(Title)},
                                    {summary, iolist_to_binary(Summary)},
                                    {ts, emqx_time:now_secs(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)}, 
-                           {desc, maybe_to_binary(AlarmDesc)}]).
+    emqx_json:safe_encode([{id, maybe_to_binary(AlarmId)},
+                           {description, maybe_to_binary(AlarmDesc)}]).
 
 alarm_msg(Topic, Payload) ->
     Msg = emqx_message:make(?MODULE, Topic, Payload),
     emqx_message:set_headers(#{'Content-Type' => <<"application/json">>},
                              emqx_message:set_flag(sys, Msg)).
 
-topic(alert, AlarmId) ->
-    emqx_topic:systop(<<"alarms/", AlarmId/binary, "/alert">>);
-topic(clear, AlarmId) ->
-    emqx_topic:systop(<<"alarms/", AlarmId/binary, "/clear">>).
+topic(alert) ->
+    emqx_topic:systop(<<"alarms/alert">>);
+topic(clear) ->
+    emqx_topic:systop(<<"alarms/clear">>).
 
 maybe_to_binary(Data) when is_binary(Data) ->
     Data;

+ 2 - 2
test/emqx_alarm_handler_SUITE.erl

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