Collector

Copy Markdown

Reports 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"}
  ]
end

Give 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.Plug

And 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

OptionDefault
:dsnCOLLECTOR_DSNhttps://clt_…@app.clt.chrom.ar: where Collector runs plus the project's key. Nothing is sent without it
:key, :endpointCOLLECTOR_KEY, https://app.clt.chrom.arThe DSN's two halves, set apart. A DSN wins over both
:environmentThe Mix env the app was built inprod, staging, …
:releaseRELEASE_VSNVersion or git sha
:in_appYour app's own applicationsWhich applications count as "your code"
:reposnoneEcto 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.