Backtrace

The line. The frame.
The fix.

Every exception lands on the offending source line with context and the full stack. Grouping is a documented fingerprint you can read — and correct when it’s wrong.

errorStripe::CardError · ×412fp sha256:9f2c41a8…
0app/services/checkout/charge.rb:81charge!app
78 def charge!(order)
79 amount = order.total_cents
80 Stripe::Charge.create(
81 source: order.card_token,
82 amount: amount,
83 )
1app/controllers/checkout_controller.rb:34createapp
2lib/middleware/payment_guard.rb:12callapp
3rack (3.0.8) lib/rack/builder.rb:277callvendor
4puma (6.4.0) lib/puma/request.rb:99handle_requestvendor
How it works

Grouping you can read.

No opaque ML clustering. A fingerprint is three documented inputs and a hash — so identical bugs collapse and different bugs don’t.

01 · Fingerprint

Three inputs, one hash

SHA-256 of the error type, the normalized message pattern (digits and ids masked), and the top frame. Deterministic and inspectable.

02 · Group

Thousands collapse to one

Same fingerprint, same group — with an occurrence count, sparkline, and the releases that triggered it. The rationale panel shows exactly why.

03 · Correct

Merge and split, with a diff

When the fingerprint is wrong, fix it. Merge and split flows show a per-signal diff of what matches and what doesn’t before you commit.

Fingerprint rationale

See why these grouped.

Every group carries its rationale: the matched error type, the normalized message pattern, and the top frame. If two errors share a group, you can see the proof.

  • Normalization masks digits, ids, and addresses
  • Source context shown per frame, app frames first
fingerprint rationalewhy these grouped
error typeStripe::CardErrorexact match
message patternYour card was declined (…)normalized · digits + ids masked
top framecharge.rb:81 · charge!exact match
SHA-256 →fp 9f2c41a8e3b07d52…
Merge / split

Wrong group? Fix it in one move.

The merge view diffs candidate groups signal by signal — type, message pattern, top frame — so you know what you’re collapsing before you collapse it. Split works the same way in reverse.

merge candidatesper-signal diff
Stripe::CardError · group A ×412group B ×38
error typematch=
message patternmatch=
top framecharge.rb:81 vs charge.rb:94
Deploy diff overlap

The deploy that touched the frame.

Errorgap overlays the latest release’s changed files onto the backtrace. When a frame in the stack was touched by the deploy, it’s flagged — usually that’s your answer.

  • Changed-file overlap highlighted on the backtrace
  • Feeds the incident engine’s deploy-correlation heuristic
deployv2.14.1 diff vs backtrace2 frames overlap
app/services/checkout/charge.rb+14 −3in backtrace
app/controllers/checkout_controller.rb+2 −2in backtrace
app/models/spree/order.rb+41 −12

Close the errorgap.

Start free, no credit card. Turn scattered production signals into one investigable incident in under five minutes. Cancel anytime, keep your data.