Faulty - error tracking for your application

I recently released a new error tracker Faulty, based largely on error_tracker, but instead of hosting your errors locally it sends them to the accompanying FaultyTower website.

Errors are tracked from Logger and telemetry events, integrations are available for Phoenix, Plug, Oban and Quantum.

Installation is as simple as mix igniter.install faulty.

The FaultyTower website allows you to create users, organizations and projects within those organizations.

You can be notified of new errors by e-mail, integration with ntfy.sh or Github issues.

9 Likes

I for one welcome more logging libraries.

One question that’s been bothering me as a fellow logging enthusiast. Why do “integrations” telemetry handlers report errors directly? Wouldn’t it make more sense to log them as a report and then let logger handler pick them up? I understand that literally every logging library does that so I it may just be a decision taken from them, but maybe you have thoughts on that while everything is fresh in your memory?

2 Likes

Shouldn’t the website be called FattyOwls instead?

Sorry couldn’t help myself. :face_with_open_eyes_and_hand_over_mouth:

8 Likes

Do you know of a way to have the logger handler pick them up?
It would make a difference as I now have to check that errors aren’t reported twice.

I imagine it would be something like this:

  def handle_event([:oban, :job, :exception], _measurements, metadata, :no_config) do
    %{kind: kind, reason: reason, stacktrace: stacktrace, job: job} = metadata
    state = Map.get(metadata, :state, :failure)

    error = Exception.normalize(kind, reason, stacktrace)

    Exception.format(kind, reason, stacktrace)
    |> Logger.error(crash_reason: {error, stacktrace}, state: state)
  end

So we still attach to the telemetry event, but log the message instead of reporting it directly to Faulty bypassing the logging stack.

I don’t think that will work as in lots of the cases there will already have been an error logged.

I know because I had to add a mechanism so I wouldn’t report them twice.

Regarding the name of “FaultyTower”, at first I thought this was an integration with :tower, another Elixir error library: tower | Hex (an integration would be neat though!)