fix(json trace format): use best_effort_json instead of new encoder

This commit is contained in:
Kjell Winblad 2024-04-12 17:33:20 +02:00
parent aa39835242
commit 968dc2ccda
2 changed files with 31 additions and 67 deletions

View File

@ -199,9 +199,6 @@ filters(#{type := ruleid, filter := Filter, name := Name}) ->
formatter(#{type := _Type, payload_encode := PayloadEncode, formatter := json}) -> formatter(#{type := _Type, payload_encode := PayloadEncode, formatter := json}) ->
{emqx_trace_json_formatter, #{ {emqx_trace_json_formatter, #{
single_line => true,
max_size => unlimited,
depth => unlimited,
payload_encode => PayloadEncode payload_encode => PayloadEncode
}}; }};
formatter(#{type := _Type, payload_encode := PayloadEncode}) -> formatter(#{type := _Type, payload_encode := PayloadEncode}) ->

View File

@ -33,78 +33,45 @@ format(
LogMap, LogMap,
#{payload_encode := PEncode} #{payload_encode := PEncode}
) -> ) ->
%% We just make some basic transformations on the input LogMap and then do
%% an external call to create the JSON text
Time = emqx_utils_calendar:now_to_rfc3339(microsecond), Time = emqx_utils_calendar:now_to_rfc3339(microsecond),
LogMap1 = LogMap#{time => Time}, LogMap1 = LogMap#{time => Time},
[format_log_map(LogMap1, PEncode), "\n"]. LogMap2 = prepare_log_map(LogMap1, PEncode),
[emqx_logger_jsonfmt:best_effort_json(LogMap2, [force_utf8]), "\n"].
%%%----------------------------------------------------------------- %%%-----------------------------------------------------------------
%%% Helper Functions %%% Helper Functions
%%%----------------------------------------------------------------- %%%-----------------------------------------------------------------
format_log_map(Map, PEncode) -> prepare_log_map(LogMap, PEncode) when is_map(LogMap) ->
KeyValuePairs = format_key_value_pairs(maps:to_list(Map), PEncode, []), NewKeyValuePairs = [prepare_key_value(K, V, PEncode) || {K, V} <- maps:to_list(LogMap)],
["{", KeyValuePairs, "}"]. maps:from_list(NewKeyValuePairs);
prepare_log_map(Term, _PEncode) ->
Term.
format_key_value_pairs([], _PEncode, Acc) -> prepare_key_value(payload = K, V, PEncode) ->
lists:join(",", Acc); NewV =
format_key_value_pairs([{payload, Value} | Rest], PEncode, Acc) -> try
FormattedPayload = format_payload(Value, PEncode), format_payload(V, PEncode)
FormattedPayloadEscaped = escape(FormattedPayload), catch
Pair = ["\"payload\": \"", FormattedPayloadEscaped, "\""], _:_:_ ->
format_key_value_pairs(Rest, PEncode, [Pair | Acc]); V
format_key_value_pairs([{packet, Value} | Rest], PEncode, Acc) -> end,
Formatted = format_packet(Value, PEncode), {K, NewV};
FormattedEscaped = escape(Formatted), prepare_key_value(packet = K, V, PEncode) ->
Pair = ["\"packet\": \"", FormattedEscaped, "\""], NewV =
format_key_value_pairs(Rest, PEncode, [Pair | Acc]); try
format_key_value_pairs([{Key, Value} | Rest], PEncode, Acc) -> format_packet(V, PEncode)
FormattedKey = format_key(Key), catch
FormattedValue = format_value(Value, PEncode), _:_:_ ->
Pair = ["\"", FormattedKey, "\":", FormattedValue], V
format_key_value_pairs(Rest, PEncode, [Pair | Acc]). end,
{K, NewV};
format_key(Term) -> prepare_key_value(K, V, PEncode) when is_map(V) ->
%% Keys must be strings {K, prepare_log_map(V, PEncode)};
String = try_format_unicode(Term), prepare_key_value(K, V, _PEncode) ->
escape(String). {K, V}.
format_value(Map, PEncode) when is_map(Map) ->
format_log_map(Map, PEncode);
format_value(V, _PEncode) when is_integer(V) ->
integer_to_list(V);
format_value(V, _PEncode) when is_float(V) ->
float_to_list(V, [{decimals, 2}]);
format_value(true, _PEncode) ->
"true";
format_value(false, _PEncode) ->
"false";
format_value(V, _PEncode) ->
String = try_format_unicode(V),
["\"", escape(String), "\""].
try_format_unicode(undefined) ->
%% emqx_logger_textfmt:try_format_unicode converts the atom undefined to
%% the atom undefined
"undefined";
try_format_unicode(V) ->
emqx_logger_textfmt:try_format_unicode(V).
escape(IOList) ->
Bin = iolist_to_binary(IOList),
List = binary_to_list(Bin),
escape_list(List).
escape_list([]) ->
[];
escape_list([$\n | Rest]) ->
%% 92 is backslash
[92, $n | escape_list(Rest)];
escape_list([$" | Rest]) ->
[92, $" | escape_list(Rest)];
escape_list([92 | Rest]) ->
[92, 92 | escape_list(Rest)];
escape_list([X | Rest]) ->
[X | escape_list(Rest)].
format_packet(undefined, _) -> ""; format_packet(undefined, _) -> "";
format_packet(Packet, Encode) -> emqx_packet:format(Packet, Encode). format_packet(Packet, Encode) -> emqx_packet:format(Packet, Encode).