These numbers come from cmd/tracelet-bench replaying requests recorded from the official SDKs
(testdata/) against one Tracelet process. They measure ingest: the time for Tracelet to validate a
request, write it durably to the write-ahead log and answer the SDK. "Drained" is how long the
processor took, after the last request, to finish writing everything into ClickHouse and Postgres.
| Suite | Requests in 30 s | Requests per second | p50 | p95 | p99 | Accepted | Drained |
|---|---|---|---|---|---|---|---|
| Sentry envelopes | 215,913 | 7,197 | 8.5 ms | 13.0 ms | 17.8 ms | 100% | 311 ms |
| PostHog capture | 139,547 | 4,651 | 10.3 ms | 27.7 ms | 58.6 ms | 100% | 107 ms |
| OTLP traces and logs | 134,176 | 4,472 | 11.4 ms | 23.5 ms | 35.7 ms | 100% | 107 ms |
| All mixed | 126,466 | 4,215 | 11.0 ms | 32.4 ms | 76.4 ms | 100% | 209 ms |
Each request carries one or more events, so events per second are higher than requests per second.
After cron check-ins, surveys and experiment exposures joined the recorded fixtures (2026-11-03, same machine), the mixed suite ran 121,916 requests in 30 s (4,063 per second; p50 12.0 ms, p95 29.4 ms, p99 59.4 ms; 100% accepted) and the processor drained in 518 ms. That is 3.6% below the mixed row above. A like-for-like run with exactly the baseline fixtures (9 Sentry, 13 PostHog, 7 OTLP) ran 151,085 requests (5,036 per second; p50 10.2 ms, p95 21.7 ms, p99 54.9 ms; 100% accepted; drained in 305 ms), 19% above the baseline, so the gap comes from the heavier fixtures.
Measured on the same machine while tracelet-bench -suite all -concurrency 64 -duration 30s ran,
sampling every 3 seconds. Postgres and ClickHouse use their default Docker settings; nothing was
tuned. Sampling competes for the same CPUs, so this run's throughput (1,171 requests per second) is
lower than the table above; read it for memory, not speed.
- Tracelet: 41 MB resident when idle, 78 MB at peak under load (105 MB private bytes). It used 11.9 CPU seconds over the 33-second run, about a third of one core.
- Postgres 17: 113 MiB idle, 129 MiB after the run.
- ClickHouse 25.8: about 1.3 GiB throughout, peaking at 1.49 GiB. Most of this is ClickHouse's default caches, not data.
- Whole stack: under 1.8 GB of memory and three containers.
- Binary: 49 MB (
tracelet.exe, Windows amd64, with the dashboard embedded).
- One desktop machine: 12 logical CPUs, Windows 11, the load generator on the same machine.
- Postgres 17 and ClickHouse 25.8 in Docker Desktop (WSL 2), default settings.
- 64 concurrent senders, 30 seconds per suite, default Tracelet settings.
This is a development machine, not a server. Docker on Windows adds file system and network overhead, and the load generator competes with Tracelet for the same CPUs. Treat these numbers as a floor and a regression baseline, not as a capacity rating.
go build -o tracelet-bench ./cmd/tracelet-bench
tracelet-bench -url http://localhost:3420 -key <public key> -project <id> -suite all -concurrency 64 -duration 30sRun it against a separate project or instance: it sends real fixture events, so they show up in that project's issues and analytics.