Skip to content

Commit

Permalink
feat: Tower.Event.captured_by
Browse files Browse the repository at this point in the history
  • Loading branch information
grzuy committed Oct 16, 2024
1 parent 343da5a commit 1f827da
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 39 deletions.
2 changes: 1 addition & 1 deletion lib/tower/bandit_exception_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ defmodule Tower.BanditExceptionHandler do
stacktrace: stacktrace
}) do
Exception.normalize(:error, reason, stacktrace)
|> Tower.report_exception(stacktrace, plug_conn: conn)
|> Tower.report_exception(stacktrace, plug_conn: conn, captured_by: __MODULE__)
end

defp handle_event_metadata(event_metadata) do
Expand Down
9 changes: 6 additions & 3 deletions lib/tower/event.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ defmodule Tower.Event do
:stacktrace,
:log_event,
:plug_conn,
:metadata
:metadata,
:captured_by
]

@type error_kind :: :error | :exit | :throw
Expand All @@ -40,7 +41,8 @@ defmodule Tower.Event do
stacktrace: Exception.stacktrace() | nil,
log_event: :logger.log_event() | nil,
plug_conn: struct() | nil,
metadata: map()
metadata: map(),
captured_by: atom() | nil
}

@similarity_source_attributes [:level, :kind, :reason, :stacktrace, :metadata]
Expand Down Expand Up @@ -131,7 +133,8 @@ defmodule Tower.Event do
datetime: event_datetime(log_event),
log_event: log_event,
plug_conn: plug_conn(options),
metadata: Keyword.get(options, :metadata, %{})
metadata: Keyword.get(options, :metadata, %{}),
captured_by: Keyword.get(options, :captured_by)
}
end

Expand Down
22 changes: 15 additions & 7 deletions lib/tower/logger_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -46,42 +46,42 @@ defmodule Tower.LoggerHandler do
%{level: :error, meta: %{crash_reason: {exception, stacktrace}}} = log_event
)
when is_exception(exception) and is_list(stacktrace) do
Tower.report_exception(exception, stacktrace, log_event: log_event)
Tower.report_exception(exception, stacktrace, log_event: log_event, captured_by: __MODULE__)
end

defp handle_log_event(
%{level: :error, meta: %{crash_reason: {{:nocatch, reason}, stacktrace}}} = log_event
)
when is_list(stacktrace) do
Tower.report_throw(reason, stacktrace, log_event: log_event)
Tower.report_throw(reason, stacktrace, log_event: log_event, captured_by: __MODULE__)
end

defp handle_log_event(
%{level: :error, meta: %{crash_reason: {exit_reason, stacktrace}}} = log_event
)
when is_list(stacktrace) do
Tower.report_exit(exit_reason, stacktrace, log_event: log_event)
report_exit(exit_reason, stacktrace, log_event)
end

defp handle_log_event(%{level: :error, meta: %{crash_reason: exit_reason}} = log_event) do
Tower.report_exit(exit_reason, [], log_event: log_event)
report_exit(exit_reason, [], log_event)
end

defp handle_log_event(%{level: level, msg: {:string, reason_chardata}} = log_event) do
if should_handle?(level) do
Tower.report_message(level, IO.chardata_to_string(reason_chardata), log_event: log_event)
report_message(level, IO.chardata_to_string(reason_chardata), log_event)
end
end

defp handle_log_event(%{level: level, msg: {:report, report}} = log_event) do
if should_handle?(level) do
Tower.report_message(level, report, log_event: log_event)
report_message(level, report, log_event)
end
end

defp handle_log_event(%{level: level, msg: {format, args}} = log_event) when is_list(args) do
if should_handle?(level) do
Tower.report_message(level, formatted_message(format, args), log_event: log_event)
report_message(level, formatted_message(format, args), log_event)
end
end

Expand All @@ -103,6 +103,14 @@ defmodule Tower.LoggerHandler do
Tower.equal_or_greater_level?(level, log_level())
end

defp report_exit(reason, stacktrace, log_event) do
Tower.report_exit(reason, stacktrace, log_event: log_event, captured_by: __MODULE__)
end

defp report_message(level, message, log_event) do
Tower.report_message(level, message, log_event: log_event, captured_by: __MODULE__)
end

defp log_level do
# This config env can be to any of the 8 levels in https://www.erlang.org/doc/apps/kernel/logger#t:level/0,
# or special values :all and :none.
Expand Down
2 changes: 1 addition & 1 deletion lib/tower/oban_exception_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ defmodule Tower.ObanExceptionHandler do
%{kind: kind, reason: reason, stacktrace: stacktrace},
_handler_config
) do
Tower.report(kind, reason, stacktrace)
Tower.report(kind, reason, stacktrace, captured_by: __MODULE__)
end

def handle_event(
Expand Down
9 changes: 6 additions & 3 deletions test/tower/tower_oban_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ defmodule TowerObanTest do
level: :error,
kind: :error,
reason: %RuntimeError{message: "error from an Oban worker"},
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: Tower.ObanExceptionHandler
}
] = Tower.EphemeralReporter.events()
)
Expand All @@ -59,7 +60,8 @@ defmodule TowerObanTest do
level: :error,
kind: :error,
reason: %Oban.CrashError{reason: "something"},
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: Tower.ObanExceptionHandler
}
] = Tower.EphemeralReporter.events()
)
Expand All @@ -81,7 +83,8 @@ defmodule TowerObanTest do
level: :error,
kind: :error,
reason: %Oban.CrashError{reason: :abnormal},
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: Tower.ObanExceptionHandler
}
] = Tower.EphemeralReporter.events()
)
Expand Down
21 changes: 14 additions & 7 deletions test/tower/tower_plug_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ defmodule TowerPlugTest do
kind: :error,
reason: %RuntimeError{message: "an error"},
stacktrace: stacktrace,
plug_conn: %Plug.Conn{} = plug_conn
plug_conn: %Plug.Conn{} = plug_conn,
captured_by: Tower.LoggerHandler
}
] = Tower.EphemeralReporter.events()
)
Expand Down Expand Up @@ -62,7 +63,8 @@ defmodule TowerPlugTest do
kind: :throw,
reason: "something",
stacktrace: stacktrace,
plug_conn: %Plug.Conn{} = plug_conn
plug_conn: %Plug.Conn{} = plug_conn,
captured_by: Tower.LoggerHandler
}
] = Tower.EphemeralReporter.events()
)
Expand Down Expand Up @@ -93,7 +95,8 @@ defmodule TowerPlugTest do
kind: :exit,
reason: :abnormal,
stacktrace: stacktrace,
plug_conn: %Plug.Conn{} = plug_conn
plug_conn: %Plug.Conn{} = plug_conn,
captured_by: Tower.LoggerHandler
}
] = Tower.EphemeralReporter.events()
)
Expand Down Expand Up @@ -125,7 +128,8 @@ defmodule TowerPlugTest do
kind: :error,
reason: %RuntimeError{message: "an error"},
stacktrace: stacktrace,
plug_conn: %Plug.Conn{} = plug_conn
plug_conn: %Plug.Conn{} = plug_conn,
captured_by: Tower.BanditExceptionHandler
}
] = Tower.EphemeralReporter.events()
)
Expand Down Expand Up @@ -159,7 +163,8 @@ defmodule TowerPlugTest do
reason: {:bad_return_value, "something"},
stacktrace: stacktrace,
# Bandit doesn't handle uncaught throws so it doesn't provide the conn in the metadata
plug_conn: nil
plug_conn: nil,
captured_by: Tower.LoggerHandler
}
] = Tower.EphemeralReporter.events()
)
Expand Down Expand Up @@ -192,7 +197,8 @@ defmodule TowerPlugTest do
reason: :abnormal,
stacktrace: stacktrace,
# Bandit doesn't handle exits so it doesn't provide the conn in the metadata
plug_conn: nil
plug_conn: nil,
captured_by: Tower.LoggerHandler
}
] = Tower.EphemeralReporter.events()
)
Expand All @@ -215,7 +221,8 @@ defmodule TowerPlugTest do
level: :info,
kind: :message,
reason: "Something interesting",
plug_conn: %Plug.Conn{assigns: %{hello: "world"}}
plug_conn: %Plug.Conn{assigns: %{hello: "world"}},
captured_by: nil
}
] = Tower.EphemeralReporter.events()
)
Expand Down
51 changes: 34 additions & 17 deletions test/tower_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ defmodule TowerTest do
level: :error,
kind: :error,
reason: %RuntimeError{message: "an error"},
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand Down Expand Up @@ -81,7 +82,8 @@ defmodule TowerTest do
level: :error,
kind: :throw,
reason: "error",
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand Down Expand Up @@ -147,7 +149,8 @@ defmodule TowerTest do
level: :error,
kind: :exit,
reason: :abnormal,
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand All @@ -172,7 +175,8 @@ defmodule TowerTest do
level: :error,
kind: :exit,
reason: :kill,
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand Down Expand Up @@ -212,7 +216,8 @@ defmodule TowerTest do
level: :error,
kind: :message,
reason: "Something went wrong here",
stacktrace: nil
stacktrace: nil,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand Down Expand Up @@ -247,7 +252,8 @@ defmodule TowerTest do
kind: :message,
reason:
"Postgrex.Protocol (#PID<0.2612.0>) disconnected: ** (DBConnection.ConnectionError) tcp recv (idle): closed",
stacktrace: nil
stacktrace: nil,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand All @@ -273,7 +279,8 @@ defmodule TowerTest do
level: :critical,
kind: :message,
reason: [something: :reported, this: :critical],
stacktrace: nil
stacktrace: nil,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand All @@ -299,7 +306,8 @@ defmodule TowerTest do
level: :critical,
kind: :message,
reason: "This is a format with 2 :args",
stacktrace: nil
stacktrace: nil,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand All @@ -322,7 +330,8 @@ defmodule TowerTest do
stacktrace: nil,
metadata: %{
something: "else"
}
},
captured_by: nil
}
] = reported_events()
)
Expand All @@ -348,7 +357,8 @@ defmodule TowerTest do
level: :error,
kind: :error,
reason: %RuntimeError{message: "an error"},
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: nil
}
] = reported_events()
)
Expand All @@ -375,7 +385,8 @@ defmodule TowerTest do
level: :error,
kind: :error,
reason: %RuntimeError{message: "an error"},
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: nil
}
] = reported_events()
)
Expand All @@ -402,7 +413,8 @@ defmodule TowerTest do
level: :error,
kind: :throw,
reason: "error",
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: nil
}
] = reported_events()
)
Expand All @@ -429,7 +441,8 @@ defmodule TowerTest do
level: :error,
kind: :throw,
reason: "error",
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: nil
}
] = reported_events()
)
Expand All @@ -456,7 +469,8 @@ defmodule TowerTest do
level: :error,
kind: :exit,
reason: :abnormal,
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: nil
}
] = reported_events()
)
Expand Down Expand Up @@ -514,7 +528,8 @@ defmodule TowerTest do
level: :error,
kind: :exit,
reason: :abnormal,
stacktrace: stacktrace
stacktrace: stacktrace,
captured_by: nil
}
] = reported_events()
)
Expand Down Expand Up @@ -553,15 +568,17 @@ defmodule TowerTest do
reporter: BuggyReporter,
original: {:error, %RuntimeError{message: "I have a bug"}, [_ | _]}
},
stacktrace: stacktrace1
stacktrace: stacktrace1,
captured_by: Tower.LoggerHandler
},
%{
id: id2,
datetime: datetime2,
level: :error,
kind: :error,
reason: %RuntimeError{message: "an error"},
stacktrace: stacktrace2
stacktrace: stacktrace2,
captured_by: Tower.LoggerHandler
}
] = reported_events()
)
Expand Down

0 comments on commit 1f827da

Please sign in to comment.