fix(postgres): format unicode error messages from driver

Fixes https://emqx.atlassian.net/browse/EMQX-11024

Sample error:

```
{error, error, <<"42501">>, insufficient_privilege,
<<229,175,185,232,161,168,32,109,113,116,116,95,117,115,101,114,32,230,157,131,233,153,144,228,184,141,229,164,159>>,
[]}
```
This commit is contained in:
Thales Macedo Garitezi 2023-10-11 17:31:26 -03:00
parent f84efd98e5
commit b07dddd49e
3 changed files with 50 additions and 14 deletions

View File

@ -1,7 +1,7 @@
%% -*- mode: erlang -*- %% -*- mode: erlang -*-
{application, emqx_connector, [ {application, emqx_connector, [
{description, "EMQX Data Integration Connectors"}, {description, "EMQX Data Integration Connectors"},
{vsn, "0.1.32"}, {vsn, "0.1.33"},
{registered, []}, {registered, []},
{mod, {emqx_connector_app, []}}, {mod, {emqx_connector_app, []}},
{applications, [ {applications, [

View File

@ -246,13 +246,18 @@ on_sql_query(InstId, PoolName, Type, NameOrSQL, Data) ->
pgsql_connector_query_return, pgsql_connector_query_return,
#{error => Reason} #{error => Reason}
), ),
?SLOG(error, #{ ?SLOG(
msg => "postgresql_connector_do_sql_query_failed", error,
connector => InstId, maps:merge(
type => Type, #{
sql => NameOrSQL, msg => "postgresql_connector_do_sql_query_failed",
reason => Reason connector => InstId,
}), type => Type,
sql => NameOrSQL
},
translate_to_log_context(Reason)
)
),
case Reason of case Reason of
sync_required -> sync_required ->
{error, {recoverable_error, Reason}}; {error, {recoverable_error, Reason}};
@ -452,10 +457,12 @@ init_prepare(State = #{prepare_sql := Prepares, pool_name := PoolName}) ->
{ok, Sts} -> {ok, Sts} ->
State#{prepare_statement := Sts}; State#{prepare_statement := Sts};
Error -> Error ->
LogMeta = #{ LogMsg =
msg => <<"postgresql_init_prepare_statement_failed">>, error => Error maps:merge(
}, #{msg => <<"postgresql_init_prepare_statement_failed">>},
?SLOG(error, LogMeta), translate_to_log_context(Error)
),
?SLOG(error, LogMsg),
%% mark the prepare_sql as failed %% mark the prepare_sql as failed
State#{prepare_sql => {error, Prepares}} State#{prepare_sql => {error, Prepares}}
end end
@ -500,10 +507,20 @@ prepare_sql_to_conn(Conn, [{Key, SQL} | PrepareList], Statements) when is_pid(Co
{error, {error, error, _, undefined_table, _, _} = Error} -> {error, {error, error, _, undefined_table, _, _} = Error} ->
%% Target table is not created %% Target table is not created
?tp(pgsql_undefined_table, #{}), ?tp(pgsql_undefined_table, #{}),
?SLOG(error, LogMeta#{msg => "postgresql_parse_failed", error => Error}), LogMsg =
maps:merge(
LogMeta#{msg => "postgresql_parse_failed"},
translate_to_log_context(Error)
),
?SLOG(error, LogMsg),
{error, undefined_table}; {error, undefined_table};
{error, Error} = Other -> {error, Error} = Other ->
?SLOG(error, LogMeta#{msg => "postgresql_parse_failed", error => Error}), LogMsg =
maps:merge(
LogMeta#{msg => "postgresql_parse_failed"},
translate_to_log_context(Error)
),
?SLOG(error, LogMsg),
Other Other
end. end.
@ -529,3 +546,21 @@ handle_batch_result([{error, Error} | _Rest], _Acc) ->
{error, {unrecoverable_error, Error}}; {error, {unrecoverable_error, Error}};
handle_batch_result([], Acc) -> handle_batch_result([], Acc) ->
{ok, Acc}. {ok, Acc}.
translate_to_log_context(#error{} = Reason) ->
#error{
severity = Severity,
code = Code,
codename = Codename,
message = Message,
extra = Extra
} = Reason,
#{
driver_severity => Severity,
driver_error_codename => Codename,
driver_error_code => Code,
driver_error_message => emqx_logger_textfmt:try_format_unicode(Message),
driver_error_extra => Extra
};
translate_to_log_context(Reason) ->
#{reason => Reason}.

View File

@ -0,0 +1 @@
Improved log formatting for Postgres bridge when there are unicode characters in the error messages returned by the driver.