diff --git a/lib/tower_honeybadger/honeybadger/notice.ex b/lib/tower_honeybadger/honeybadger/notice.ex index 2e0e009..9f34cbb 100644 --- a/lib/tower_honeybadger/honeybadger/notice.ex +++ b/lib/tower_honeybadger/honeybadger/notice.ex @@ -28,7 +28,7 @@ defmodule TowerHoneybadger.Honeybadger.Notice do stacktrace: stacktrace, plug_conn: plug_conn }) do - error_notice("(exit)", reason, stacktrace, plug_conn) + error_notice("(exit)", Exception.format_exit(reason), stacktrace, plug_conn) end defp error_notice(class, message, stacktrace, plug_conn) do diff --git a/test/tower_honeybadger_test.exs b/test/tower_honeybadger_test.exs index 59c4a0a..43908b5 100644 --- a/test/tower_honeybadger_test.exs +++ b/test/tower_honeybadger_test.exs @@ -126,7 +126,7 @@ defmodule TowerHoneybadgerTest do %{ "error" => %{ "class" => "(exit)", - "message" => "abnormal", + "message" => ":abnormal", "backtrace" => backtrace_entries }, "server" => %{ @@ -159,6 +159,51 @@ defmodule TowerHoneybadgerTest do end) end + test "reports :gen_server bad exit", %{bypass: bypass} do + waiting_for(fn done -> + Bypass.expect_once(bypass, "POST", "/notices", fn conn -> + {:ok, body, conn} = Plug.Conn.read_body(conn) + + assert( + { + :ok, + %{ + "error" => %{ + "class" => "(exit)", + "message" => "bad return value: \"bad value\"", + "backtrace" => backtrace_entries + }, + "server" => %{ + "environment_name" => "test" + } + } + } = Jason.decode(body) + ) + + assert( + %{ + "file" => "test/tower_honeybadger_test.exs", + "method" => + ~s(anonymous fn/0 in TowerHoneybadgerTest."test reports :gen_server bad exit"/1), + "number" => 201 + } = List.first(backtrace_entries) + ) + + done.() + + conn + |> Plug.Conn.put_resp_content_type("application/json") + |> Plug.Conn.resp(200, Jason.encode!(%{"id" => "123"})) + end) + + capture_log(fn -> + in_unlinked_process(fn -> + exit({:bad_return_value, "bad value"}) + end) + end) + end) + end + defp waiting_for(fun) do # ref message synchronization trick copied from # https://github.com/PSPDFKit-labs/bypass/issues/112