Skip to content

Commit 42c074a

Browse files
aloukissasAndrewDryga
authored andcommitted
honor existing metadata
1 parent b7a1e1a commit 42c074a

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

lib/logger_json/formatters/datadog.ex

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ defmodule LoggerJSON.Formatters.Datadog do
108108
%{syslog: syslog(level, meta, hostname)}
109109
|> maybe_put(:logger, format_logger(meta))
110110
|> maybe_merge(format_http_request(meta))
111-
|> maybe_merge(format_error(message, level, reported_levels))
111+
|> maybe_merge(format_error(message, metadata, level, reported_levels))
112112
|> maybe_merge(encode(metadata, redactors))
113113
|> maybe_merge(encode(message, redactors))
114114
|> @encoder.encode_to_iodata!(encoder_opts)
@@ -259,27 +259,28 @@ defmodule LoggerJSON.Formatters.Datadog do
259259

260260
defp format_http_request(_meta), do: nil
261261

262-
defp format_error(%{message: message} = msg, level, reported_levels) when is_binary(message) do
263-
if level in reported_levels do
264-
existing_error = msg[:error] || %{}
262+
defp format_error(%{message: message} = msg, metadata, level, reported_levels) when is_binary(message) do
263+
existing_error = msg[:error]
265264

265+
if level in reported_levels and is_nil(existing_error) do
266266
error =
267-
existing_error
268-
|> Map.put(:kind, get_error_kind(msg))
267+
metadata[:error]
268+
|> Kernel.||(%{})
269+
|> Map.put(:kind, get_error_kind(metadata))
269270
|> Map.put(:message, message)
270-
|> maybe_put(:stack, get_error_stack(msg))
271+
|> maybe_put(:stack, get_error_stack(metadata))
271272

272273
%{error: error}
273274
end
274275
end
275276

276-
defp format_error(_msg, _level, _reported_levels), do: nil
277+
defp format_error(_msg, _metadata, _level, _reported_levels), do: nil
277278

278279
defp get_error_kind(%{error: %{kind: kind}}) when is_binary(kind), do: kind
279-
defp get_error_kind(_), do: "error"
280+
defp get_error_kind(_metadata), do: "error"
280281

281282
defp get_error_stack(%{error: %{stack: stack}}) when is_binary(stack), do: stack
282-
defp get_error_stack(_msg), do: nil
283+
defp get_error_stack(_metadata), do: nil
283284

284285
if Code.ensure_loaded?(Plug.Conn) do
285286
defp build_http_request_data(%Plug.Conn{} = conn, request_id) do

test/logger_json/formatters/datadog_test.exs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,23 @@ defmodule LoggerJSON.Formatters.DatadogTest do
472472
end
473473
end
474474

475+
test "logs error.* fields from logger metadata" do
476+
for level <- [:error, :critical, :alert, :emergency] do
477+
log =
478+
capture_log(level, fn ->
479+
Logger.log(level, "Something went wrong",
480+
error: %{kind: "CustomError", module: "PaymentGateway", stack: "stacktrace"}
481+
)
482+
end)
483+
|> decode_or_print_error()
484+
485+
assert log["error"]["kind"] == "CustomError"
486+
assert log["error"]["message"] == "Something went wrong"
487+
assert log["error"]["module"] == "PaymentGateway"
488+
assert log["error"]["stack"] == "stacktrace"
489+
end
490+
end
491+
475492
if @encoder == Jason do
476493
test "passing options to encoder" do
477494
formatter = Datadog.new(encoder_opts: [pretty: true])

0 commit comments

Comments
 (0)