From ca7d0edf5cfc8d396aa311fa65b4b563d53379ff Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Thu, 19 Dec 2019 12:30:06 -0600 Subject: [PATCH 1/3] genserver timeout test --- test/logger_backend_test.exs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/logger_backend_test.exs b/test/logger_backend_test.exs index 3beaa6ac..3e16f05d 100644 --- a/test/logger_backend_test.exs +++ b/test/logger_backend_test.exs @@ -149,6 +149,40 @@ defmodule Sentry.LoggerBackendTest do end) end + test "GenServer timeout makes call to Sentry API" do + self_pid = self() + Process.flag(:trap_exit, true) + bypass = Bypass.open() + + Bypass.expect(bypass, fn conn -> + {:ok, body, conn} = Plug.Conn.read_body(conn) + json = Jason.decode!(body) + + exception_value = + List.first(json["exception"]) + |> Map.fetch!("value") + + assert String.contains?(exception_value, "{:timeout, {GenServer, :call") + + assert conn.request_path == "/api/1/store/" + assert conn.method == "POST" + send(self_pid, "API called") + Plug.Conn.resp(conn, 200, ~s<{"id": "340"}>) + end) + + modify_env(:sentry, dsn: "http://public:secret@localhost:#{bypass.port}/1") + + {:ok, pid1} = Sentry.TestGenServer.start_link(self_pid) + + capture_log(fn -> + Task.start(fn -> + GenServer.call(pid1, {:sleep, 20}, 1) + end) + + assert_receive "API called" + end) + end + test "only sends one error when a Plug process crashes" do Code.compile_string(""" defmodule SentryApp do From f010584e81ec116a879aeaf116d6a2cc8cc6695c Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Fri, 20 Dec 2019 14:05:39 -0600 Subject: [PATCH 2/3] ensure stacktrace is list --- lib/sentry/logger_backend.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/sentry/logger_backend.ex b/lib/sentry/logger_backend.ex index cfef615a..03254c35 100644 --- a/lib/sentry/logger_backend.ex +++ b/lib/sentry/logger_backend.ex @@ -76,7 +76,7 @@ defmodule Sentry.LoggerBackend do end case Keyword.get(meta, :crash_reason) do - {reason, stacktrace} -> + {reason, stacktrace} when is_list(stacktrace) -> if ignore_plug && Enum.any?(stacktrace, fn {module, function, arity, _file_line} -> match?({^module, ^function, ^arity}, {Plug.Cowboy.Handler, :init, 2}) || From 5252ca9db8a832caa2b94d1f0635d99bece79fd1 Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Thu, 13 Feb 2020 12:23:35 -0600 Subject: [PATCH 3/3] ignore cowboy crash_reason format --- lib/sentry/logger_backend.ex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/sentry/logger_backend.ex b/lib/sentry/logger_backend.ex index 03254c35..27ea1b2f 100644 --- a/lib/sentry/logger_backend.ex +++ b/lib/sentry/logger_backend.ex @@ -93,6 +93,11 @@ defmodule Sentry.LoggerBackend do Sentry.capture_exception(reason, opts) end + {{_reason, stacktrace}, {_m, _f, args}} when is_list(stacktrace) and is_list(args) -> + # Cowboy stuff + # https://github.com/ninenines/cowboy/blob/master/src/cowboy_stream_h.erl#L148-L151 + :ok + reason when is_atom(reason) and not is_nil(reason) -> Sentry.capture_exception(reason, [{:event_source, :logger} | opts])