This package allows your Phoenix application to send notifications whenever an exception is raised. By default it includes an email and a webhook notifier, you can also implement custom ones, or use some of the independently realeased notifiers listed below.
It was inspired by the ExceptionNotification gem that provides a similar functionality for Rack/Rails applications.
You can read the full documentation at https://hexdocs.pm/boom_notifier.
The package can be installed by adding boom_notifier
to your list of dependencies in
mix.exs
:
def deps do
[
{:boom_notifier, "~> 0.8.0"}
]
end
This is an example for setting up an email notifier, you can see the full list of available notifiers here.
BoomNotifier has built in support for both Bamboo and Swoosh.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
notifier: BoomNotifier.MailNotifier.Bamboo,
# or to use Swoosh
# notifier: BoomNotifier.MailNotifier.Swoosh,
options: [
mailer: YourApp.Mailer,
from: "[email protected]",
to: "[email protected]",
subject: "BOOM error caught"
]
# ...
For the email to be sent, you need to define a valid mailer in the options
keyword list. You can customize the from
, to
and subject
attributes.
subject
will be truncated at 80 chars, if you want more add the option max_subject_length
.
BoomNotifier uses notifiers to deliver notifications when errors occur in your applications. By default, 2 notifiers are available:
You can also choose from these independetly-released notifiers:
On top of this, you can easily implement your own custom notifier.
BoomNotifier allows you to setup multiple notifiers, like in the example below:
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
notifiers: [
[
notifier: BoomNotifier.WebhookNotifier,
options: [
url: "http://example.com",
]
],
[
notifier: CustomNotifier,
options: # ...
]
]
By default, BoomNotifier
will send a notification every time an exception is
raised.
However, there are different strategies to decide when to send the
notifications using the :notification_trigger
option with one of the
following values: :always
and :exponential
.
This option is the default one. It will trigger a notification for every exception.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
notification_trigger: :always,
notifiers: [
# ...
]
It uses a formula of log2(errors_count)
to determine whether to send a
notification, based on the accumulated error count for each specific
exception. This makes the notifier only send a notification when the count
is: 1, 2, 4, 8, 16, 32, 64, 128, ..., (2**n).
You can also set an optional max value.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
notification_trigger: :exponential,
notifiers: [
# ...
]
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
notification_trigger: [exponential: [limit: 100]]
notifiers: [
# ...
]
If you've defined a triggering strategy which holds off notification delivering you can define a time limit value which will be used to deliver the notification after a time limit milliseconds have passed from the last error. The time counter is reset on new errors and only applies for cases where notifications are not sent.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
notification_trigger: [:exponential],
time_limit: :timer.minutes(30),
notifier: CustomNotifier
# ...
end
By default, BoomNotifier
will not include any custom data from your
requests.
However, there are different strategies to decide which information do
you want to include in the notifications using the :custom_data
option
with one of the following values: :assigns
, :logger
or both.
The included information will show up in your notification, in a new section titled "Metadata".
This option will include the data that is in the connection
assigns
field.
You can also specify the fields you want to retrieve from conn.assigns
.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
custom_data: :assigns,
notifiers: [
# ...
]
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
custom_data: [assigns: [fields: [:current_user, :session_data]]],
notifiers: [
# ...
]
Example of adding custom data to the connection:
assign(conn, :name, "John")
This option will include the data that is in the Logger
metadata
field.
You can also specify the fields you want to retrieve from Logger.metadata()
.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
custom_data: :logger,
notifiers: [
# ...
]
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
custom_data: [logger: [fields: [:request_id, :current_user]]],
notifiers: [
# ...
]
Example of adding custom data to the logger:
Logger.metadata(name: "John")
You can do any combination of the above settings to include data from both sources. The names of the fields are independent for each source, they will appear under the source namespace.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
custom_data: [
[assigns: [fields: [:current_user]]],
[logger: [fields: [:request_id, :current_user]]]
],
notifiers: [
# ...
]
# ...
end
By default, all exceptions are captured by Boom. The :ignore_exceptions
setting is provided to ignore exceptions of a certain kind. Said exceptions will not generate any kind of notification from Boom.
defmodule YourApp.Router do
use Phoenix.Router
use BoomNotifier,
ignore_exceptions: [
HTTPoison.Error, MyApp.CustomException
],
notifiers: [
# ...
]
# ...
end
Boom uses Plug.ErrorHandler
to trigger notifications.
If you are already using that module you must use BoomNotifier
after it.
This library aims to be compatible with Elixir versions from 1.10 to 1.17 although it might work with other versions.
BoomNotifier is released under the terms of the MIT License.
The authors of this project are Ignacio and Jorge. It is sponsored and maintained by Wyeworks.