Просмотр исходного кода

feat(message_validation): add `none` log level

Thales Macedo Garitezi 2 лет назад
Родитель
Сommit
8753e3583f

+ 44 - 59
apps/emqx_message_validation/src/emqx_message_validation.erl

@@ -3,6 +3,7 @@
 %%--------------------------------------------------------------------
 -module(emqx_message_validation).
 
+-include_lib("snabbkaffe/include/trace.hrl").
 -include_lib("emqx_utils/include/emqx_message.hrl").
 -include_lib("emqx/include/emqx_hooks.hrl").
 -include_lib("emqx/include/logger.hrl").
@@ -214,10 +215,7 @@ evaluate_sql_check(Check, Validation, Message) ->
         fields := Fields,
         conditions := Conditions
     } = Check,
-    #{
-        name := Name,
-        log_failure := #{level := FailureLogLevel}
-    } = Validation,
+    #{name := Name} = Validation,
     {Data, _} = emqx_rule_events:eventmsg_publish(Message),
     try emqx_rule_runtime:evaluate_select(Fields, Data, Conditions) of
         {ok, _} ->
@@ -226,37 +224,24 @@ evaluate_sql_check(Check, Validation, Message) ->
             false
     catch
         throw:Reason ->
-            ?TRACE(
-                FailureLogLevel,
-                ?TRACE_TAG,
-                "validation_sql_check_throw",
-                #{
-                    validation => Name,
-                    reason => Reason
-                }
-            ),
+            trace_failure(Validation, "validation_sql_check_throw", #{
+                validation => Name,
+                reason => Reason
+            }),
             false;
         Class:Error:Stacktrace ->
-            ?TRACE(
-                FailureLogLevel,
-                ?TRACE_TAG,
-                "validation_sql_check_failure",
-                #{
-                    validation => Name,
-                    kind => Class,
-                    reason => Error,
-                    stacktrace => Stacktrace
-                }
-            ),
+            trace_failure(Validation, "validation_sql_check_failure", #{
+                validation => Name,
+                kind => Class,
+                reason => Error,
+                stacktrace => Stacktrace
+            }),
             false
     end.
 
 evaluate_schema_check(Check, Validation, #message{payload = Data}) ->
     #{schema := SerdeName} = Check,
-    #{
-        name := Name,
-        log_failure := #{level := FailureLogLevel}
-    } = Validation,
+    #{name := Name} = Validation,
     ExtraArgs =
         case Check of
             #{type := protobuf, message_name := MessageName} ->
@@ -268,29 +253,19 @@ evaluate_schema_check(Check, Validation, #message{payload = Data}) ->
         emqx_schema_registry_serde:schema_check(SerdeName, Data, ExtraArgs)
     catch
         error:{serde_not_found, _} ->
-            ?TRACE(
-                FailureLogLevel,
-                ?TRACE_TAG,
-                "validation_schema_check_schema_not_found",
-                #{
-                    validation => Name,
-                    schema_name => SerdeName
-                }
-            ),
+            trace_failure(Validation, "validation_schema_check_schema_not_found", #{
+                validation => Name,
+                schema_name => SerdeName
+            }),
             false;
         Class:Error:Stacktrace ->
-            ?TRACE(
-                FailureLogLevel,
-                ?TRACE_TAG,
-                "validation_schema_check_failure",
-                #{
-                    validation => Name,
-                    schema_name => SerdeName,
-                    kind => Class,
-                    reason => Error,
-                    stacktrace => Stacktrace
-                }
-            ),
+            trace_failure(Validation, "validation_schema_check_failure", #{
+                validation => Name,
+                schema_name => SerdeName,
+                kind => Class,
+                reason => Error,
+                stacktrace => Stacktrace
+            }),
             false
     end.
 
@@ -404,20 +379,15 @@ run_validations(Validations, Message) ->
     try
         emqx_rule_runtime:clear_rule_payload(),
         Fun = fun(Validation, Acc) ->
-            #{
-                name := Name,
-                log_failure := #{level := FailureLogLevel}
-            } = Validation,
+            #{name := Name} = Validation,
             case run_validation(Validation, Message) of
                 ok ->
                     {cont, Acc};
                 FailureAction ->
-                    ?TRACE(
-                        FailureLogLevel,
-                        ?TRACE_TAG,
-                        "validation_failed",
-                        #{validation => Name, action => FailureAction}
-                    ),
+                    trace_failure(Validation, "validation_failed", #{
+                        validation => Name,
+                        action => FailureAction
+                    }),
                     {halt, FailureAction}
             end
         end,
@@ -454,3 +424,18 @@ run_check(#{type := sql} = Check, Validation, Message) ->
     evaluate_sql_check(Check, Validation, Message);
 run_check(Check, Validation, Message) ->
     evaluate_schema_check(Check, Validation, Message).
+
+trace_failure(#{log_failure := #{level := none}} = Validation, _Msg, _Meta) ->
+    #{
+        name := _Name,
+        failure_action := _Action
+    } = Validation,
+    ?tp(message_validation_failure, #{log_level => none, name => _Name, action => _Action}),
+    ok;
+trace_failure(#{log_failure := #{level := Level}} = Validation, Msg, Meta) ->
+    #{
+        name := _Name,
+        failure_action := _Action
+    } = Validation,
+    ?tp(message_validation_failure, #{log_level => Level, name => _Name, action => _Action}),
+    ?TRACE(Level, ?TRACE_TAG, Msg, Meta).

+ 1 - 1
apps/emqx_message_validation/src/emqx_message_validation_schema.erl

@@ -104,7 +104,7 @@ fields(log_failure) ->
     [
         {level,
             mk(
-                hoconsc:enum([error, warning, notice, info, debug]),
+                hoconsc:enum([error, warning, notice, info, debug, none]),
                 #{desc => ?DESC("log_failure_at"), default => info}
             )}
     ];

+ 34 - 0
apps/emqx_message_validation/test/emqx_message_validation_http_api_SUITE.erl

@@ -50,6 +50,7 @@ init_per_testcase(_TestCase, Config) ->
 
 end_per_testcase(_TestCase, _Config) ->
     clear_all_validations(),
+    snabbkaffe:stop(),
     emqx_common_test_helpers:call_janitor(),
     ok.
 
@@ -542,6 +543,39 @@ t_enable_disable_via_update(_Config) ->
     {204, _} = delete(Name1),
     ?assertIndexOrder([], Topic),
 
+    ok.
+
+t_log_failure_none(_Config) ->
+    ?check_trace(
+        begin
+            Name1 = <<"foo">>,
+            AlwaysFailCheck = sql_check(<<"select * where false">>),
+            Validation1 = validation(
+                Name1,
+                [AlwaysFailCheck],
+                #{<<"log_failure">> => #{<<"level">> => <<"none">>}}
+            ),
+
+            {201, _} = insert(Validation1),
+
+            C = connect(<<"c1">>),
+            {ok, _, [_]} = emqtt:subscribe(C, <<"t/#">>),
+
+            ok = publish(C, <<"t/1">>, #{}),
+            ?assertNotReceive({publish, _}),
+
+            ok
+        end,
+        fun(Trace) ->
+            ?assertMatch([#{log_level := none}], ?of_kind(message_validation_failure, Trace)),
+            ok
+        end
+    ),
+    ok.
+
+
+
+
     ok.
 
 %% Check the `all_pass' strategy