Skip to content

Commit 17025e0

Browse files
committed
Make sure GCP/Elastic formatters won't crash on unknown error terms
1 parent f1b0cc9 commit 17025e0

File tree

4 files changed

+45
-11
lines changed

4 files changed

+45
-11
lines changed

lib/logger_json/formatters/elastic.ex

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ defmodule LoggerJSON.Formatters.Elastic do
191191
def format_crash_reason(message, {{:EXIT, pid}, reason}, _meta) do
192192
stacktrace = Exception.format_banner({:EXIT, pid}, reason, [])
193193
error_message = "process #{inspect(pid)} exit: #{inspect(reason)}"
194-
format_error_fields(message, error_message, stacktrace, "EXIT")
194+
format_error_fields(message, error_message, stacktrace, "exit")
195195
end
196196

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

241-
def format_crash_reason(message, {error, reason}, _meta) do
242-
stacktrace = "** (#{inspect(error)}) #{inspect(reason)}"
243-
error_message = "#{inspect(error)}: #{inspect(reason)}"
244-
format_error_fields(message, error_message, stacktrace, "error")
241+
def format_crash_reason(message, other, _meta) do
242+
format_error_fields(message, inspect(other), nil, nil)
245243
end
246244

247245
defp get_exception_id(%{id: id}), do: id
@@ -254,10 +252,10 @@ defmodule LoggerJSON.Formatters.Elastic do
254252
defp format_error_fields(message, error_message, stacktrace, type) do
255253
%{
256254
message: safe_chardata_to_string(message),
257-
"error.stack_trace": stacktrace,
258-
"error.message": error_message,
259-
"error.type": type
255+
"error.message": error_message
260256
}
257+
|> maybe_put(:"error.stack_trace", stacktrace)
258+
|> maybe_put(:"error.type", type)
261259
end
262260

263261
# Formats the log.logger and log.origin fields as specified in https://www.elastic.co/guide/en/ecs/8.11/ecs-log.html

lib/logger_json/formatters/google_cloud.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ defmodule LoggerJSON.Formatters.GoogleCloud do
208208
format_crash_reason(binary, {inspect(error), reason}, service_context, meta)
209209
end
210210

211+
def format_crash_reason(binary, _other, service_context, meta) do
212+
format_reported_error_event(binary, nil, service_context, meta)
213+
end
214+
211215
defp format_reported_error_event(message, stacktrace, service_context, meta) do
212216
%{
213217
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",

test/logger_json/formatters/elastic_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ defmodule LoggerJSON.Formatters.ElasticTest do
324324
"message" => "oops!",
325325
"error.message" => error_message,
326326
"error.stack_trace" => stacktrace,
327-
"error.type" => "EXIT",
327+
"error.type" => "exit",
328328
"log.logger" => "Elixir.LoggerJSON.Formatters.ElasticTest",
329329
"log.origin" => %{
330330
"file.line" => _,

test/logger_json/formatters/google_cloud_test.exs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,6 @@ defmodule LoggerJSON.Formatters.GoogleCloudTest do
443443
Process.sleep(100)
444444
end)
445445

446-
refute logs =~ "FORMATTER CRASH"
447-
448446
[_, log_entry] =
449447
logs
450448
|> String.trim()
@@ -461,6 +459,40 @@ defmodule LoggerJSON.Formatters.GoogleCloudTest do
461459
assert message =~ ~r/Task #PID<\d+.\d+.\d+> started from #{inspect(test_pid)} terminating/
462460
end
463461

462+
test "does not crash on unknown error tuples" do
463+
Logger.metadata(crash_reason: {{:something, :else}, [:unknown]})
464+
465+
log_entry =
466+
capture_log(fn ->
467+
Logger.debug("oops!")
468+
end)
469+
|> decode_or_print_error()
470+
471+
assert %{
472+
"@type" => "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
473+
"message" => "oops!",
474+
"stack_trace" => "** ({:something, :else}) [:unknown]",
475+
"serviceContext" => %{"service" => "nonode@nohost"}
476+
} = log_entry
477+
end
478+
479+
test "does not crash on unknown errors" do
480+
Logger.metadata(crash_reason: :what_is_this?)
481+
482+
log_entry =
483+
capture_log(fn ->
484+
Logger.debug("oops!")
485+
end)
486+
|> decode_or_print_error()
487+
488+
assert %{
489+
"@type" => "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
490+
"message" => "oops!",
491+
"stack_trace" => nil,
492+
"serviceContext" => %{"service" => "nonode@nohost"}
493+
} = log_entry
494+
end
495+
464496
test "logs process exits" do
465497
Logger.metadata(crash_reason: {{:EXIT, self()}, :sad_failure})
466498

0 commit comments

Comments
 (0)