chore(postgres): prettify logged errors

Fixes https://emqx.atlassian.net/browse/EMQX-11490
This commit is contained in:
Thales Macedo Garitezi 2023-12-05 11:13:23 -03:00
parent 89732cb4e4
commit e03b8fd80e
2 changed files with 39 additions and 12 deletions

View File

@ -604,7 +604,11 @@ t_missing_data(Config) ->
#{ #{
result := result :=
{error, {error,
{unrecoverable_error, {error, error, <<"23502">>, not_null_violation, _, _}}} {unrecoverable_error, #{
error_code := <<"23502">>,
error_codename := not_null_violation,
severity := error
}}}
}, },
Event Event
), ),

View File

@ -383,11 +383,12 @@ get_prepared_statement(Key, #{prepares := PrepStatements}) ->
on_sql_query(InstId, PoolName, Type, NameOrSQL, Data) -> on_sql_query(InstId, PoolName, Type, NameOrSQL, Data) ->
try ecpool:pick_and_do(PoolName, {?MODULE, Type, [NameOrSQL, Data]}, no_handover) of try ecpool:pick_and_do(PoolName, {?MODULE, Type, [NameOrSQL, Data]}, no_handover) of
{error, Reason} = Result -> {error, Reason} ->
?tp( ?tp(
pgsql_connector_query_return, pgsql_connector_query_return,
#{error => Reason} #{error => Reason}
), ),
TranslatedError = translate_to_log_context(Reason),
?SLOG( ?SLOG(
error, error,
maps:merge( maps:merge(
@ -397,7 +398,7 @@ on_sql_query(InstId, PoolName, Type, NameOrSQL, Data) ->
type => Type, type => Type,
sql => NameOrSQL sql => NameOrSQL
}, },
translate_to_log_context(Reason) TranslatedError
) )
), ),
case Reason of case Reason of
@ -406,9 +407,9 @@ on_sql_query(InstId, PoolName, Type, NameOrSQL, Data) ->
ecpool_empty -> ecpool_empty ->
{error, {recoverable_error, Reason}}; {error, {recoverable_error, Reason}};
{error, error, _, undefined_table, _, _} -> {error, error, _, undefined_table, _, _} ->
{error, {unrecoverable_error, Reason}}; {error, {unrecoverable_error, export_error(TranslatedError)}};
_ -> _ ->
Result {error, export_error(TranslatedError)}
end; end;
Result -> Result ->
?tp( ?tp(
@ -593,15 +594,16 @@ init_prepare(State = #{}) ->
{ok, PrepStatements} -> {ok, PrepStatements} ->
State#{prepares => PrepStatements}; State#{prepares => PrepStatements};
Error -> Error ->
TranslatedError = translate_to_log_context(Error),
?SLOG( ?SLOG(
error, error,
maps:merge( maps:merge(
#{msg => <<"postgresql_init_prepare_statement_failed">>}, #{msg => <<"postgresql_init_prepare_statement_failed">>},
translate_to_log_context(Error) TranslatedError
) )
), ),
%% mark the prepares failed %% mark the prepares failed
State#{prepares => Error} State#{prepares => {error, export_error(TranslatedError)}}
end. end.
prepare_sql(#{query_templates := Templates, pool_name := PoolName}) -> prepare_sql(#{query_templates := Templates, pool_name := PoolName}) ->
@ -652,14 +654,15 @@ prepare_sql_to_conn(Conn, [{Key, {SQL, _RowTemplate}} | Rest], Statements) when
), ),
?SLOG(error, LogMsg), ?SLOG(error, LogMsg),
{error, undefined_table}; {error, undefined_table};
{error, Error} = Other -> {error, Error} ->
TranslatedError = translate_to_log_context(Error),
LogMsg = LogMsg =
maps:merge( maps:merge(
LogMeta#{msg => "postgresql_parse_failed"}, LogMeta#{msg => "postgresql_parse_failed"},
translate_to_log_context(Error) TranslatedError
), ),
?SLOG(error, LogMsg), ?SLOG(error, LogMsg),
Other {error, export_error(TranslatedError)}
end. end.
to_bin(Bin) when is_binary(Bin) -> to_bin(Bin) when is_binary(Bin) ->
@ -674,17 +677,21 @@ handle_result({error, {unrecoverable_error, _Error}} = Res) ->
handle_result({error, disconnected}) -> handle_result({error, disconnected}) ->
{error, {recoverable_error, disconnected}}; {error, {recoverable_error, disconnected}};
handle_result({error, Error}) -> handle_result({error, Error}) ->
{error, {unrecoverable_error, Error}}; TranslatedError = translate_to_log_context(Error),
{error, {unrecoverable_error, export_error(TranslatedError)}};
handle_result(Res) -> handle_result(Res) ->
Res. Res.
handle_batch_result([{ok, Count} | Rest], Acc) -> handle_batch_result([{ok, Count} | Rest], Acc) ->
handle_batch_result(Rest, Acc + Count); handle_batch_result(Rest, Acc + Count);
handle_batch_result([{error, Error} | _Rest], _Acc) -> handle_batch_result([{error, Error} | _Rest], _Acc) ->
{error, {unrecoverable_error, Error}}; TranslatedError = translate_to_log_context(Error),
{error, {unrecoverable_error, export_error(TranslatedError)}};
handle_batch_result([], Acc) -> handle_batch_result([], Acc) ->
{ok, Acc}. {ok, Acc}.
translate_to_log_context({error, Reason}) ->
translate_to_log_context(Reason);
translate_to_log_context(#error{} = Reason) -> translate_to_log_context(#error{} = Reason) ->
#error{ #error{
severity = Severity, severity = Severity,
@ -702,3 +709,19 @@ translate_to_log_context(#error{} = Reason) ->
}; };
translate_to_log_context(Reason) -> translate_to_log_context(Reason) ->
#{reason => Reason}. #{reason => Reason}.
export_error(#{
driver_severity := Severity,
driver_error_codename := Codename,
driver_error_code := Code
}) ->
%% Extra information has already been logged.
#{
error_code => Code,
error_codename => Codename,
severity => Severity
};
export_error(#{reason := Reason}) ->
Reason;
export_error(Error) ->
Error.