errors
Error tracking that speaks the Sentry SDK protocol, so existing SDKs for Go, JavaScript, Swift, Python
and the rest just get a DSN. Host: errors.<d>. Binary: errorsd. Stage 7.
Concepts
- Error project: linked to an
id project; DSN keys; rate limits; data scrubbing rules (default:
passwords, tokens, cookies, auth headers).
- Ingest:
POST /api/<project>/envelope/ and /store/ (Sentry envelope format): events, exceptions
with stack traces, breadcrumbs, tags, user, release, environment. Transactions and replays are
accepted and dropped in v1.
- Issue: events grouped by fingerprint (exception type + normalized top in-app frames, or a
custom fingerprint); state (unresolved, resolved, resolved in next release, ignored until N),
assignee, first and last seen, count, users affected, regression detection.
- Release: from SDKs or
xvii errors release; apps and pages deploys create releases
automatically. Source maps and debug symbols (upload and symbolication) in a later step.
Data
Events in partitioned tables with retention (30 days by default), issues and counters kept.
Events
issue.new, issue.regressed, issue.spike (rate over a threshold).
As built (stage 7)
- Ingest:
POST /api/<num>/envelope/ (event items; sessions, transactions, attachments, client reports
are accepted and dropped) and /api/<num>/store/; gzip and deflate; the key from X-Sentry-Auth,
Authorization, ?sentry_key= or the envelope's DSN; open CORS. Events up to 1 MB, envelopes 20 MB;
a repeated event_id counts once. Answers 429 with Retry-After and X-Sentry-Rate-Limits past the
project's events a minute (600 by default) or the team's errors.events of the month.
- Scrubbing: values under keys containing password, secret, token, api_key, auth, cookie, session,
csrf, credit, cvv, private_key, dsn (plus the project's own) anywhere in the event, header pairs and
query strings;
{{auto}} IPs are dropped. People are counted by a hash of their id, e-mail, name or IP.
- Grouping: the raised exception's type and its 5 in-app frames nearest the raise (module or path
without host and query, and function; no line numbers), else the type and the message with numbers,
ids and quoted values taken out;
fingerprint with {{ default }}. Issues keep title, culprit, level,
counts, people, first and last release; hourly counts (90 days) for charts and spikes.
- States: unresolved, resolved (or "in the next release": events of the newest release keep it
resolved), ignored (for good or until N more events). Events:
issue.new, issue.regressed,
issue.spike (the project's events of one issue in an hour, 100 by default), in the event's
transaction. Assignee: oneself or no one.
- Releases: an event's
release; deploys of linked apps (<app>@<release number>, which apps puts in
SENTRY_RELEASE with SENTRY_ENVIRONMENT on every app) and linked pages aliases
(<alias>@<deploy>), read every minute; or POST /api/v1/projects/{id}/releases.
- Links (errors' own token, the person's rights checked first): an app gets
SENTRY_DSN through
apps' PUT /api/v1/apps/{id}/integrations/errors (from its next deploy); a pages alias gets
https://errors.<d>/js/<key>.js through pages' PUT /api/v1/aliases/{name}/scripts/errors, which pagesd
puts at the end of <head> of every HTML page of the alias (its own address and custom domains) with
data-release and data-environment. The script (no SDK, under 2 KB) reports uncaught errors and
rejected promises, at most 10 a page, and offers window.xviiErrors.capture(error).
- The DSN is shown in the panel: it only sends, so it is public by design (it ends up in browser code).
A new DSN stops the old one at once and goes to linked apps and aliases.
- Not yet: source maps and debug symbols, transactions and replays, search beyond the list's filter.