Error tracking you actually own.One binary.

Works with the Sentry SDKs you already use. Change one line of config and every event lands on infrastructure you control.

Already works with

  • JavaScript
  • Node.js
  • Python
  • Go
  • Rust
  • Java
  • .NET
  • PHP
  • Ruby
  • Elixir
Day one

Setupinthreesteps.Createaproject,copytheDSN,deploy.Releases,sessionsandissuesstartfillinginontheirown.

Runitwhereveryouwant.Rustrakisoneserveryoudeployonyourowninfrastructure.Youreventdataneverleavesit.

Platform

OneplaceforeverythingyourSDKsends.Errors,logs,traces,releasesandsessions,allfromasingleDSN.

Issues

Start with a list, not a stream. Every row carries a status, a priority and a 24-hour trend, so new issues, regressions and escalations are visible before you open anything.

Automatic grouping. Every event with the same fingerprint lands on the same issue, with a counter instead of a thousand duplicates.

Alerts where you already work. A rule decides which issues are worth an interruption and which channel they arrive on.

Stack traces

Open an event and land on your own source. The failing frame, the breadcrumbs before it, the tags and the context are on one page, with the next event one click away.

Source maps applied server side. Maps are resolved against the release that produced the event, so a crash from six months ago still lands on the right line.

Breadcrumbs with every event. The route, the request and the click that led into the frame that failed.

Performance

See where every request spends its time. Every span the SDK sends lands on one waterfall: queries, outbound calls and cache lookups, with total and self time on each row.

  • Spans

    the full tree

  • Timing

    self and total

  • Ops

    db, http, cache

  • Ingest

    the same DSN

Logs

Logs and errors in the same system. Structured logs arrive through the same DSN and carry the trace ID, so the lines that ran before a crash are one click from the crash itself.

Six levels, one view. Trace, debug, info, warn, error and fatal all arrive on the same endpoint and filter in the same list.

Attributes stay typed. What the SDK attached is stored keyed and typed instead of flattened into the message, so you can still filter on it.

Agent traces

Debug agents like any other request. Model calls, tool calls and handoffs between agents arrive as spans, on the same waterfall as your HTTP and database work.

  • Tokens

    input and output

  • Latency

    per span

  • Handoffs

    agent to agent

  • Status

    on every span

Migration

Onelineofconfiguration.PointtheDSNatyourownserveranddeploy.Pointitbackandthemigrationisreverted.

Sentry.init({
dsn: "https://abc123@o447951.ingest.sentry.io/1234567",
dsn: "https://abc123@errors.yourcompany.com/1",
tracesSampleRate: 1.0,
environment: "production",
});
  • UnchangedSDK

    The official package, at the version you pinned.

  • UnchangedInstrumentation

    Every capture, span and breadcrumb.

  • UnchangedSource maps

    The same upload step in the same CI job.

  • UnchangedReleases

    Tagged with the release you already set.

Alerts

Alertruleswithconditionsandescalation.Aruledecideswhatfiresit,whatitchecksbeforefiring,andwhereitgoes.Ifnobodyacknowledgesit,itescalatesonitsown.

Fires on
First seenRegressionSpikeLevelProject
Reaches
SlackDiscordPagerDutyEmailWebhook
  1. When

    A new issue appears

    first seen in checkout-api

  2. If

    level >= error

    and not muted

  3. Slack

    #eng-oncall

  4. Daily digest

    one email, 09:00

  5. PagerDuty

    wakes whoever is on call

Engine

Fiveparts,oneprocess.Thesearethestagesaneventpassesthrough,intheorderitpassesthroughthem.Scrolltoopenit.

The server, opened upRUSTRAK
  • 01Admission control

    Over-quota requests are rejected first

    The quota is checked before a single byte is decompressed. A project over its limit gets a 429 with a Retry-After, and nothing else in the server ever sees the request.

  • 02Envelope decoder

    Every item is typed on arrival

    One request can carry errors, transactions, sessions, logs and spans at once. They are split into eight typed kinds under a hard size cap, and each kind ended up with its handler when the binary was compiled rather than being looked up per event.

  • 03Durable spool

    A restart never loses an event

    The event is written to disk and the response goes straight back. Everything expensive happens after your SDK has moved on, and a process that dies in between still has the event when it restarts.

  • 04Digest workers

    No queue, no broker, no workers to scale

    Grouping, source maps, session rollups and alerts run on threads the server already has. Nothing extra to install, and no garbage collector waiting to pause any of it.

  • 05Fingerprint

    Identical crashes fold into one row

    Every event gets a deterministic fingerprint, so a bad deploy costs you one issue with a counter going up instead of a million rows.

Footprint

Itfitsonthecheapestmachineyouhave.OneRustbinary,SQLiteoutofthebox,PostgreSQLwhenyouneedit,andnothingelsetoinstall.

  • <100MB

    Resident memory, idle

  • <50ms

    Ingest latency, P99

  • 10k/s

    Events per second, target

  • <20MB

    Container image, distroless

Install

Upwithonecommand.Docker,SQLitebydefault,andanadminusercreatedonfirstboot.

docker run -d \  --name rustrak \  -p 8080:8080 \  -v rustrak_data:/data \  -e SESSION_SECRET_KEY=$(openssl rand -hex 32) \  -e CREATE_SUPERUSER=admin@example.com:changeme123 \  rustrak/rustrak-server:latest

The server comes up on localhost:8080. SQLite by default, so there is no second service to stand up.

Sponsors

Thankyou.ToeveryonesponsoringRustrakonGitHub.

Sponsor on GitHub

Yoursendtoend.Theserver,thedashboardandthedata.GPL-3.0,deployedwhereveryousay.