Skip to content

Commit

Permalink
Make sure GCP/Elastic formatters won't crash on unknown error terms
Browse files Browse the repository at this point in the history
  • Loading branch information
AndrewDryga committed Sep 12, 2024
1 parent f1b0cc9 commit 17025e0
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 11 deletions.
14 changes: 6 additions & 8 deletions lib/logger_json/formatters/elastic.ex
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ defmodule LoggerJSON.Formatters.Elastic do
def format_crash_reason(message, {{:EXIT, pid}, reason}, _meta) do
stacktrace = Exception.format_banner({:EXIT, pid}, reason, [])
error_message = "process #{inspect(pid)} exit: #{inspect(reason)}"
format_error_fields(message, error_message, stacktrace, "EXIT")
format_error_fields(message, error_message, stacktrace, "exit")
end

def format_crash_reason(message, {:exit, reason}, _meta) do
Expand Down Expand Up @@ -238,10 +238,8 @@ defmodule LoggerJSON.Formatters.Elastic do
format_error_fields(message, error_message, stacktrace, error)
end

def format_crash_reason(message, {error, reason}, _meta) do
stacktrace = "** (#{inspect(error)}) #{inspect(reason)}"
error_message = "#{inspect(error)}: #{inspect(reason)}"
format_error_fields(message, error_message, stacktrace, "error")
def format_crash_reason(message, other, _meta) do
format_error_fields(message, inspect(other), nil, nil)
end

defp get_exception_id(%{id: id}), do: id
Expand All @@ -254,10 +252,10 @@ defmodule LoggerJSON.Formatters.Elastic do
defp format_error_fields(message, error_message, stacktrace, type) do
%{
message: safe_chardata_to_string(message),
"error.stack_trace": stacktrace,
"error.message": error_message,
"error.type": type
"error.message": error_message
}
|> maybe_put(:"error.stack_trace", stacktrace)
|> maybe_put(:"error.type", type)
end

# Formats the log.logger and log.origin fields as specified in https://www.elastic.co/guide/en/ecs/8.11/ecs-log.html
Expand Down
4 changes: 4 additions & 0 deletions lib/logger_json/formatters/google_cloud.ex
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,10 @@ defmodule LoggerJSON.Formatters.GoogleCloud do
format_crash_reason(binary, {inspect(error), reason}, service_context, meta)
end

def format_crash_reason(binary, _other, service_context, meta) do
format_reported_error_event(binary, nil, service_context, meta)
end

defp format_reported_error_event(message, stacktrace, service_context, meta) do
%{
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
Expand Down
2 changes: 1 addition & 1 deletion test/logger_json/formatters/elastic_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ defmodule LoggerJSON.Formatters.ElasticTest do
"message" => "oops!",
"error.message" => error_message,
"error.stack_trace" => stacktrace,
"error.type" => "EXIT",
"error.type" => "exit",
"log.logger" => "Elixir.LoggerJSON.Formatters.ElasticTest",
"log.origin" => %{
"file.line" => _,
Expand Down
36 changes: 34 additions & 2 deletions test/logger_json/formatters/google_cloud_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -443,8 +443,6 @@ defmodule LoggerJSON.Formatters.GoogleCloudTest do
Process.sleep(100)
end)

refute logs =~ "FORMATTER CRASH"

[_, log_entry] =
logs
|> String.trim()
Expand All @@ -461,6 +459,40 @@ defmodule LoggerJSON.Formatters.GoogleCloudTest do
assert message =~ ~r/Task #PID<\d+.\d+.\d+> started from #{inspect(test_pid)} terminating/
end

test "does not crash on unknown error tuples" do
Logger.metadata(crash_reason: {{:something, :else}, [:unknown]})

log_entry =
capture_log(fn ->
Logger.debug("oops!")
end)
|> decode_or_print_error()

assert %{
"@type" => "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
"message" => "oops!",
"stack_trace" => "** ({:something, :else}) [:unknown]",
"serviceContext" => %{"service" => "nonode@nohost"}
} = log_entry
end

test "does not crash on unknown errors" do
Logger.metadata(crash_reason: :what_is_this?)

log_entry =
capture_log(fn ->
Logger.debug("oops!")
end)
|> decode_or_print_error()

assert %{
"@type" => "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
"message" => "oops!",
"stack_trace" => nil,
"serviceContext" => %{"service" => "nonode@nohost"}
} = log_entry
end

test "logs process exits" do
Logger.metadata(crash_reason: {{:EXIT, self()}, :sad_failure})

Expand Down

0 comments on commit 17025e0

Please sign in to comment.