TraceHawk // browser and PHP errors Group · Count · File the ticket Ingest operational

09:41:02 shop-web · production · first event Window 20 min Rule 50 / 1h Owner Checkout

Your site threw 4,812 errors last night. It was three bugs.

TraceHawk takes browser and PHP errors, collapses the ones with the same stack into a single issue, keeps the release and the trace, and files one Jira task when a count you set is crossed.

  • Events received4,812
  • Issues on the board3
  • Jira tasks filed1
  • People woken up0
One night, end to end

What actually happens between the first error and the ticket.

No dashboard tour. This is the same incident as above, step by step, in the order TraceHawk handles it.

Step 01 · Ingest

It arrives as one line, from a tag or from PHP.

The snippet catches uncaught errors and unhandled rejections. The PHP class reports an exception you pass it, including the lines around the crash and the previous exception. You can attach a release, a user, and breadcrumbs. Nothing is read from your repository.

// POST /api/<public-key>/store
{
  "type":    "TypeError",
  "value":   "Cannot read properties of undefined (reading 'total')",
  "url":     "https://shop.example/checkout?step=card",
  "release": "shop@1.4.2",
  "user":    "u_84213",
  "trace":   "9f2c4e1b…ab31",
  "frames":  11
}
Step 02 · Fingerprint

The stack decides which issue it belongs to.

The fingerprint is the exception type plus the top application frames, with line numbers and the query string dropped. Library frames are ignored, so a bundler bump does not split one bug into two.

readTotalcart.js:44
handleCheckoutcheckout.js:218
dispatchnode_modules/react-dom
invokeGuardednode_modules/react-dom
flushWorknode_modules/scheduler
→
Fingerprint TypeError·readTotal·handleCheckout
● SHOP-14
Step 03 · Roll-up

Another 1,240 arrive. The list stays three rows long.

A repeat does not create a row, a message, or a mention. It moves the count, the distinct user total, and last seen. That is the difference between a feed you mute and a board you read.

TypeError: Cannot read properties of undefined SHOP-14 · /assets/checkout.js · shop@1.4.2
1,248 events · 611 users
Still one row. Still one page to read.
Step 04 · Rule

You decide when it stops being noise.

A rule is a count inside a window: 15 minutes, an hour, 6 hours, or a day. Under the line the issue just sits on the board. Over it, TraceHawk acts once, for this episode, and not again.

Step 05 · Jira

One task, in the project key of the team that owns it.

Connect Jira Cloud with the site URL, an account email, and an API token. Give a team a project key, an issue type, and labels. The same episode never files a second task. If you resolve it and it comes back, the rule can open a fresh one.

SHOP-412 Bug · Checkout Opened by TraceHawk

Checkout crashes on the card step for 611 users

Issue
SHOP-14 · TypeError: Cannot read properties of undefined
Release
shop@1.4.2
Rule
50 events in 1 hour, crossed at 09:52:40
Labels
tracehawk, checkout
Step 06 · Quiet

A release ships and the line goes flat.

Resolve the issue and it leaves the unresolved view. If the same stack shows up on a later release, TraceHawk marks it as a regression instead of pretending it is new.

Resolved in shop@1.4.3
The page you land on

Six things worth reading. Nothing to browse.

The issue page is built to answer one question quickly: is this worth a ticket, and whose is it?

1 2 3 4 5 6
  1. 01
    Level, short id, culprit

    Enough to know what broke and where, before you scroll.

  2. 02
    Events, users, releases, age

    Counts belong to the issue, not to the event you happen to be reading.

  3. 03
    Volume with release marks

    1 hour to 30 days. The marked bar is where a new release appeared.

  4. 04
    Stack, folded correctly

    Application frames open, library frames collapsed, the crashing line marked.

  5. 05
    First seen, last seen, owner, ticket

    Plus the activity log: who resolved it, who ignored it, which rule fired.

  6. 06
    Breadcrumbs, request, trace

    What happened right before, and the waterfall if the event carried a trace id.

Pricing

One dial: how many events a month.

Base is $199 a month. Business is $299 and creates the Slack message and the Jira task when a rule is crossed.

Base Monthly
50,000 events
1 project · unlimited users · grouping, releases, trace cap resets monthly
Business Monthly
500,000 events
Unlimited projects · unlimited users · grouping, releases, trace · Slack and Jira cap resets monthly

Choosing a plan here does not charge you. The workspace starts on that plan, and you subscribe from Billing after you confirm your email. Business creates the Slack message and the Jira task when a rule is crossed. Full pricing

The entire install Two clients

Same endpoint.
Browser or PHP.

Browser

One script tag. It catches uncaught errors and rejected promises. The key is public, so restrict origins. async means a dead host does not block the page.

<script async src="https://tracehawk.net/api/<public-key>/snippet.js" crossorigin="anonymous"></script>
PHP

One package, tracehawk/sdk. Laravel is one call. Symfony is one bundle line. The package reads TRACEHAWK_DSN.

# composer
composer config repositories.tracehawk composer https://tracehawk.net/sdk
composer require tracehawk/sdk:1.0.0

# .env
TRACEHAWK_DSN=https://tracehawk.net/api/<key>

# Laravel
Integration::handles($exceptions);

# Symfony
TraceHawk\Sdk\Symfony\TraceHawkBundle::class => ['all' => true],

Base is $199 a month. Business is $299 and creates the Slack message and the Jira task when a rule is crossed.