-
Notifications
You must be signed in to change notification settings - Fork 89
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: properly normalize erlang errors before emitting telemetry and logging crash_reason #455
Conversation
Plug.Conn.WrapperError
assert msg =~ "** (RuntimeError) boom" | ||
assert msg =~ "** (MatchError)" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the reason for this change? Is there an issue that comes up with MatchError that doesn't with a simple raise?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there an issue that comes up with MatchError that doesn't with a simple raise?
Yes, sorry for the lack of explanation.
Elixir's raise
directly errors with an elixir's RuntimeError
struct.
However, :one = :two
or 1 / 0
will exit with {:badmatch, :two}
and :badarith
respectively, to name a few examples from https://www.erlang.org/doc/system/errors.html#exit-reasons.
Those need to be normalized with Exception.normalize
somewhere, to become well-known elixir Exception structs (https://github.com/elixir-lang/elixir/blob/8deaaf4117fef24f516c12dc40989b9772a6d763/lib/elixir/lib/exception.ex#L2357-L2494).
The symptom in bandit right now is only that the non-normalized exit appears in crash_reason
value.
The reason why is properly appearing normalized in the logged text message is because the existent Exception.format
before Logger.error
in
Line 238 in 177b053
Logger.error(Exception.format(kind, reason, stacktrace), logger_metadata) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see. I wonder if we should be doing that for all errors (ie continue to have the Plug.Conn.WrapperError
pattern match be 'dumb' and just pass the value through unchanged) and normalize in the other handle_error clauses. Does that make sense, or is it only needed in the narrow case of wrapped errors?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I think you're right.
That's regardless of whether it's wrapped or not.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also now realized this will fix/normalize the emitted telemetry exception.
Updated PR title.
Plug.Conn.WrapperError
Looks great! Thanks for the continued work! |
@grzuy I just noticed that this PR introduced console warnings during tests; would it be sufficient for us to explicitly raise a |
Hey @mtrudel, sorry about that. #459 should fix one.
No, because the test cases are there to test that when original erlang |
Hi there 👋
Minor follow up for a053c1c.
Analogous code in
plug_cowboy
: https://github.com/elixir-plug/plug_cowboy/blob/ced253f035f2a07ebed17cfacb64d4f16357a750/lib/plug/cowboy/handler.ex#L51-L55.Thanks!