fix(rule trace): restore logger metadata to its previous value

This commit is contained in:
Kjell Winblad 2024-05-20 10:57:15 +02:00
parent 5ce095f30e
commit 3c87bcde46
3 changed files with 34 additions and 61 deletions

View File

@ -1174,12 +1174,13 @@ call_query(QM, Id, Index, Ref, Query, QueryOpts) ->
{ok, _Group, #{status := ?status_connecting, error := unhealthy_target}} -> {ok, _Group, #{status := ?status_connecting, error := unhealthy_target}} ->
{error, {unrecoverable_error, unhealthy_target}}; {error, {unrecoverable_error, unhealthy_target}};
{ok, _Group, Resource} -> {ok, _Group, Resource} ->
PrevLoggerProcessMetadata = logger:get_process_metadata(),
QueryResult = QueryResult =
try try
set_rule_id_trace_meta_data(Query), set_rule_id_trace_meta_data(Query),
do_call_query(QM, Id, Index, Ref, Query, QueryOpts, Resource) do_call_query(QM, Id, Index, Ref, Query, QueryOpts, Resource)
after after
unset_rule_id_trace_meta_data() reset_logger_process_metadata(PrevLoggerProcessMetadata)
end, end,
QueryResult; QueryResult;
{error, not_found} -> {error, not_found} ->
@ -1216,6 +1217,11 @@ set_rule_id_trace_meta_data(Request) ->
set_rule_id_trace_meta_data([Request]), set_rule_id_trace_meta_data([Request]),
ok. ok.
reset_logger_process_metadata(undefined = _PrevProcessMetadata) ->
logger:unset_process_metadata();
reset_logger_process_metadata(PrevProcessMetadata) ->
logger:set_process_metadata(PrevProcessMetadata).
collect_rule_id(?QUERY(_, _, _, _, #{rule_id := RuleId}), Acc) -> collect_rule_id(?QUERY(_, _, _, _, #{rule_id := RuleId}), Acc) ->
Acc#{RuleId => true}; Acc#{RuleId => true};
collect_rule_id(?QUERY(_, _, _, _, _), Acc) -> collect_rule_id(?QUERY(_, _, _, _, _), Acc) ->
@ -1231,25 +1237,6 @@ collect_rule_trigger_times(?QUERY(_, _, _, _, #{rule_trigger_ts := Time}), Acc)
collect_rule_trigger_times(?QUERY(_, _, _, _, _), Acc) -> collect_rule_trigger_times(?QUERY(_, _, _, _, _), Acc) ->
Acc. Acc.
unset_rule_id_trace_meta_data() ->
case logger:get_process_metadata() of
undefined ->
ok;
OldLoggerProcessMetadata ->
NewLoggerProcessMetadata =
maps:without(
[
rule_ids,
client_ids,
stop_action_after_render,
rule_trigger_ts
],
OldLoggerProcessMetadata
),
logger:set_process_metadata(NewLoggerProcessMetadata),
ok
end.
%% action:kafka_producer:myproducer1:connector:kafka_producer:mykakfaclient1 %% action:kafka_producer:myproducer1:connector:kafka_producer:mykakfaclient1
extract_connector_id(Id) when is_binary(Id) -> extract_connector_id(Id) when is_binary(Id) ->
case binary:split(Id, <<":">>, [global]) of case binary:split(Id, <<":">>, [global]) of

View File

@ -70,6 +70,7 @@ apply_rule_discard_result(Rule, Columns, Envs) ->
ok. ok.
apply_rule(Rule = #{id := RuleID}, Columns, Envs) -> apply_rule(Rule = #{id := RuleID}, Columns, Envs) ->
PrevProcessMetadata = logger:get_process_metadata(),
set_process_trace_metadata(RuleID, Columns), set_process_trace_metadata(RuleID, Columns),
trace_rule_sql( trace_rule_sql(
"rule_activated", "rule_activated",
@ -137,7 +138,7 @@ apply_rule(Rule = #{id := RuleID}, Columns, Envs) ->
), ),
{error, {Error, StkTrace}} {error, {Error, StkTrace}}
after after
reset_process_trace_metadata(Columns) reset_logger_process_metadata(PrevProcessMetadata)
end. end.
set_process_trace_metadata(RuleID, #{clientid := ClientID} = Columns) -> set_process_trace_metadata(RuleID, #{clientid := ClientID} = Columns) ->
@ -152,6 +153,11 @@ set_process_trace_metadata(RuleID, Columns) ->
rule_trigger_ts => [rule_trigger_time(Columns)] rule_trigger_ts => [rule_trigger_time(Columns)]
}). }).
reset_logger_process_metadata(undefined = _PrevProcessMetadata) ->
logger:unset_process_metadata();
reset_logger_process_metadata(PrevProcessMetadata) ->
logger:set_process_metadata(PrevProcessMetadata).
rule_trigger_time(Columns) -> rule_trigger_time(Columns) ->
case Columns of case Columns of
#{timestamp := Timestamp} -> #{timestamp := Timestamp} ->
@ -160,28 +166,6 @@ rule_trigger_time(Columns) ->
erlang:system_time(millisecond) erlang:system_time(millisecond)
end. end.
reset_process_trace_metadata(#{clientid := _ClientID}) ->
Meta0 = logger:get_process_metadata(),
Meta1 = maps:without(
[
clientid,
rule_id,
rule_trigger_ts
],
Meta0
),
logger:set_process_metadata(Meta1);
reset_process_trace_metadata(_) ->
Meta0 = logger:get_process_metadata(),
Meta1 = maps:without(
[
rule_id,
rule_trigger_ts
],
Meta0
),
logger:set_process_metadata(Meta1).
do_apply_rule( do_apply_rule(
#{ #{
id := RuleId, id := RuleId,

View File

@ -69,18 +69,22 @@ do_apply_rule(
end. end.
do_apply_matched_rule(Rule, Context, StopAfterRender, EventTopics) -> do_apply_matched_rule(Rule, Context, StopAfterRender, EventTopics) ->
update_process_trace_metadata(StopAfterRender), PrevLoggerProcessMetadata = logger:get_process_metadata(),
FullContext = fill_default_values( try
hd(EventTopics), update_process_trace_metadata(StopAfterRender),
emqx_rule_maps:atom_key_map(Context) FullContext = fill_default_values(
), hd(EventTopics),
ApplyRuleRes = emqx_rule_runtime:apply_rule( emqx_rule_maps:atom_key_map(Context)
Rule, ),
FullContext, ApplyRuleRes = emqx_rule_runtime:apply_rule(
apply_rule_environment() Rule,
), FullContext,
reset_trace_process_metadata(StopAfterRender), apply_rule_environment()
ApplyRuleRes. ),
ApplyRuleRes
after
reset_logger_process_metadata(PrevLoggerProcessMetadata)
end.
update_process_trace_metadata(true = _StopAfterRender) -> update_process_trace_metadata(true = _StopAfterRender) ->
logger:update_process_metadata(#{ logger:update_process_metadata(#{
@ -89,12 +93,10 @@ update_process_trace_metadata(true = _StopAfterRender) ->
update_process_trace_metadata(false = _StopAfterRender) -> update_process_trace_metadata(false = _StopAfterRender) ->
ok. ok.
reset_trace_process_metadata(true = _StopAfterRender) -> reset_logger_process_metadata(undefined = _PrevProcessMetadata) ->
Meta = logger:get_process_metadata(), logger:unset_process_metadata();
NewMeta = maps:remove(stop_action_after_render, Meta), reset_logger_process_metadata(PrevProcessMetadata) ->
logger:set_process_metadata(NewMeta); logger:set_process_metadata(PrevProcessMetadata).
reset_trace_process_metadata(false = _StopAfterRender) ->
ok.
%% At the time of writing the environment passed to the apply rule function is %% At the time of writing the environment passed to the apply rule function is
%% not used at all for normal actions. When it is used for custom functions it %% not used at all for normal actions. When it is used for custom functions it