|
@@ -280,12 +280,22 @@ run_transformations(Transformations, Message = #message{headers = Headers}) ->
|
|
|
end.
|
|
end.
|
|
|
|
|
|
|
|
do_run_transformations(Transformations, Message) ->
|
|
do_run_transformations(Transformations, Message) ->
|
|
|
|
|
+ LastTransformation = #{name := LastTransformationName} = lists:last(Transformations),
|
|
|
Fun = fun(Transformation, MessageAcc) ->
|
|
Fun = fun(Transformation, MessageAcc) ->
|
|
|
#{name := Name} = Transformation,
|
|
#{name := Name} = Transformation,
|
|
|
emqx_message_transformation_registry:inc_matched(Name),
|
|
emqx_message_transformation_registry:inc_matched(Name),
|
|
|
case run_transformation(Transformation, MessageAcc) of
|
|
case run_transformation(Transformation, MessageAcc) of
|
|
|
{ok, #message{} = NewAcc} ->
|
|
{ok, #message{} = NewAcc} ->
|
|
|
- emqx_message_transformation_registry:inc_succeeded(Name),
|
|
|
|
|
|
|
+ %% If this is the last transformation, we can't bump its success counter
|
|
|
|
|
+ %% yet. We perform a check to see if the final payload is encoded as a
|
|
|
|
|
+ %% binary after all transformations have run, and it's the last
|
|
|
|
|
+ %% transformation's responsibility to properly encode it.
|
|
|
|
|
+ case Name =:= LastTransformationName of
|
|
|
|
|
+ true ->
|
|
|
|
|
+ ok;
|
|
|
|
|
+ false ->
|
|
|
|
|
+ emqx_message_transformation_registry:inc_succeeded(Name)
|
|
|
|
|
+ end,
|
|
|
{cont, NewAcc};
|
|
{cont, NewAcc};
|
|
|
{ignore, TraceFailureContext} ->
|
|
{ignore, TraceFailureContext} ->
|
|
|
trace_failure_from_context(TraceFailureContext),
|
|
trace_failure_from_context(TraceFailureContext),
|
|
@@ -307,11 +317,12 @@ do_run_transformations(Transformations, Message) ->
|
|
|
#message{} = FinalMessage ->
|
|
#message{} = FinalMessage ->
|
|
|
case is_payload_properly_encoded(FinalMessage) of
|
|
case is_payload_properly_encoded(FinalMessage) of
|
|
|
true ->
|
|
true ->
|
|
|
|
|
+ emqx_message_transformation_registry:inc_succeeded(LastTransformationName),
|
|
|
FinalMessage;
|
|
FinalMessage;
|
|
|
false ->
|
|
false ->
|
|
|
%% Take the last validation's failure action, as it's the one
|
|
%% Take the last validation's failure action, as it's the one
|
|
|
%% responsible for getting the right encoding.
|
|
%% responsible for getting the right encoding.
|
|
|
- LastTransformation = lists:last(Transformations),
|
|
|
|
|
|
|
+ emqx_message_transformation_registry:inc_failed(LastTransformationName),
|
|
|
#{failure_action := FailureAction} = LastTransformation,
|
|
#{failure_action := FailureAction} = LastTransformation,
|
|
|
trace_failure(LastTransformation, "transformation_bad_encoding", #{
|
|
trace_failure(LastTransformation, "transformation_bad_encoding", #{
|
|
|
action => FailureAction,
|
|
action => FailureAction,
|