Collector
Copy MarkdownReports your Elixir app's errors to Collector, which groups them into issues, emails you when one is new or comes back, and shows you what broke and why.
Installation
Add the dependency to mix.exs:
def deps do
[
{:collector, ">= 0.1.0"}
]
endGive it your project's DSN (from its setup page in Collector) in the
COLLECTOR_DSN environment variable of the deployed app. Or, to take it
from somewhere else, in config/runtime.exs:
config :collector, dsn: System.get_env("MY_COLLECTOR_DSN")That's it. From now on, crashes are reported on their own: controllers,
LiveViews, GenServers, Tasks, any process. Oban job failures too, when
Oban is around (not the jobs that return {:cancel, _} or
{:discard, _}). Exceptions that Plug turns into a 4xx, like
Ecto.NoResultsError, aren't bugs and aren't reported.
Without a DSN nothing is sent, so dev and test stay quiet: don't export
COLLECTOR_DSN there.
Request details and users
Add the plug to your endpoint to see the request each error happened in (credentials such as cookies are never sent):
# lib/my_app_web/endpoint.ex
plug Collector.PlugAnd say who hit the error, by id:
Collector.set_user(current_user.id)Source lines in releases
Collector shows the lines around each frame of your code. Releases don't ship source files, so package them right before building the release:
MIX_ENV=prod mix collector.package_source
MIX_ENV=prod mix release
In a Dockerfile, that's one line before mix release.
Reporting by hand
try do
charge!(order)
rescue
e ->
Collector.capture_exception(e, stacktrace: __STACKTRACE__)
{:error, :payment_failed}
end
Collector.capture_message("Payment gateway slow", level: :warning)Options
| Option | Default | |
|---|---|---|
:dsn | COLLECTOR_DSN | https://clt_…@app.clt.chrom.ar: where Collector runs plus the project's key. Nothing is sent without it |
:key, :endpoint | COLLECTOR_KEY, https://app.clt.chrom.ar | The DSN's two halves, set apart. A DSN wins over both |
:environment | The Mix env the app was built in | prod, staging, … |
:release | RELEASE_VSN | Version or git sha |
:in_app | Your app's own applications | Which applications count as "your code" |
:repos | none | Ecto repo telemetry prefixes, e.g. [[:my_app, :repo]], to record queries as breadcrumbs |
How it behaves
Events are sent in the background, one at a time, from a bounded queue (the oldest is dropped past 1000), so a slow or unreachable Collector never slows your app down. Failed sends are retried with the same id, so nothing is counted twice; when Collector asks to slow down, it does.
The protocol is documented in Collector's docs/protocol.md, if you'd
like to report from another language.
License
MIT. See LICENSE.