Skip to content

Commit a27b61d

Browse files
Handle Task/GenServer exits correctly in Google formatter (#133)
We were running into a situation where errors caused by GenServers terminating were not being formatted because they were a slightly different shape to what was expected in the formatter. This updates the formatter to handle them.
1 parent 5ad0dee commit a27b61d

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed

lib/logger_json/formatters/google_cloud.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,15 @@ defmodule LoggerJSON.Formatters.GoogleCloud do
188188
format_reported_error_event(message, ruby_stacktrace, service_context, meta)
189189
end
190190

191-
def format_crash_reason(binary, {error, reason}, service_context, meta) do
191+
def format_crash_reason(binary, {error, reason}, service_context, meta) when is_atom(error) or is_binary(error) do
192192
stacktrace = "** (#{error}) #{inspect(reason)}"
193193
format_reported_error_event(binary, stacktrace, service_context, meta)
194194
end
195195

196+
def format_crash_reason(binary, {error, reason}, service_context, meta) do
197+
format_crash_reason(binary, {inspect(error), reason}, service_context, meta)
198+
end
199+
196200
defp format_reported_error_event(message, stacktrace, service_context, meta) do
197201
%{
198202
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",

test/logger_json/formatters/google_cloud_test.exs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,51 @@ defmodule LoggerJSON.Formatters.GoogleCloudTest do
414414
} = log_entry
415415
end
416416

417+
test "logs Task/GenServer termination" do
418+
test_pid = self()
419+
420+
logs =
421+
capture_log(fn ->
422+
{:ok, _} = Supervisor.start_link([{CrashingGenServer, :ok}], strategy: :one_for_one)
423+
424+
{:ok, _} =
425+
Task.start(fn ->
426+
try do
427+
GenServer.call(CrashingGenServer, :boom)
428+
catch
429+
_ -> nil
430+
after
431+
send(test_pid, :done)
432+
end
433+
end)
434+
435+
# Wait for task to finish
436+
receive do
437+
:done -> nil
438+
end
439+
440+
# Let logs flush
441+
Process.sleep(100)
442+
end)
443+
444+
refute logs =~ "FORMATTER CRASH"
445+
446+
[_, log_entry] =
447+
logs
448+
|> String.trim()
449+
|> String.split("\n")
450+
|> Enum.map(&decode_or_print_error/1)
451+
452+
assert %{
453+
"@type" => "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
454+
"message" => message,
455+
"stack_trace" => "** ({{%RuntimeError{message: \"boom\"}" <> _,
456+
"serviceContext" => %{"service" => "nonode@nohost"}
457+
} = log_entry
458+
459+
assert message =~ ~r/Task #PID<\d+.\d+.\d+> started from #{inspect(test_pid)} terminating/
460+
end
461+
417462
test "logs process exits" do
418463
Logger.metadata(crash_reason: {{:EXIT, self()}, :sad_failure})
419464

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
defmodule CrashingGenServer do
2+
use GenServer
3+
4+
def start_link(_) do
5+
GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
6+
end
7+
8+
def init(state) do
9+
{:ok, state}
10+
end
11+
12+
def handle_call(:boom, _, _) do
13+
raise "boom"
14+
end
15+
end

0 commit comments

Comments
 (0)