Skip to content

Capacity and profiles

Metric has four starting profiles. They change memory limits, MongoDB cache, request concurrency, queue sizes, file limits and retention together.

ProfilevCPURAMSSD/NVMeSymbolicatorBlobStore capacity
Min11 GiB15 GiBNo5 GiB
Low22 GiB30 GiBNo10 GiB
Medium48 GiB100 GiBYes33 GiB
High816 GiB250 GiBYes83 GiB

Medium is the default installer profile. Min is deliberately designed for a small VPS but can still batch a continuous stream of compact logs. Its practical long-term limit is usually disk space and retention rather than Rust request handling. Give a 1 GiB Min server 1–2 GiB of swap as an emergency buffer.

The profile names describe resource limits, not guaranteed traffic. Event size, MongoDB indexes, attachments, Replay, source maps and traffic bursts can change capacity substantially.

Foreground ingest

The supplied profiles use aggressive but bounded admission. A larger admission window lets the Log and Span writers fill MongoDB batches instead of writing many small batches.

ProfileActive ingest requestsParsing tasksStorage queueDocuments per batch
Min642128128
Low2564512250
Medium102482048500
High4096168192500

Queue limits are ceilings, not preallocated memory. Small SDK envelopes use only a small part of them. Large attachments and Replay segments remain controlled by separate byte limits.

Feature choices

FeatureMinLowMediumHigh
Errors, issues and web interfaceYesYesYesYes
Logs, transactions, spans and metricsYesYesYesYes
Attachments and feedback screenshotsNoYesYesYes
Symbolicator and source-map processingNoNoYesYes
Session ReplayKeep disabledKeep disabledOptional per projectOptional per project
MinidumpsDisabledDisabledDisabledDisabled
Cold archiveDisabledDisabledDisabledDisabled

Minidumps remain disabled because they may contain process memory. Cold archive remains disabled because archived data cannot yet be searched or restored through Metric. These choices should not change merely because a server is larger.

Min and Low still store raw JavaScript and native frames. They only skip the separate Symbolicator processing step.

Retention

High-volume raw data is kept for less time than compact hourly statistics. This preserves useful trends without filling a small disk with individual rows. Cold archive is disabled in the supplied profiles, so every period below is for searchable hot data.

DataMinLowMediumHigh
Error events30 days60 days90 days180 days
Logs7 days14 days30 days90 days
Spans7 days14 days30 days90 days
Hourly span statistics180 days1 year2 years3 years
Feedback90 days180 days1 year2 years
Hourly issue statistics1 year2 years3 years5 years
Individual release sessions14 days30 days60 days90 days
Hourly release statistics1 year2 years3 years5 years
Monitor runs90 days180 days1 year2 years
Application metrics60 days120 days180 days1 year
Session Replay, when enabled7 days14 days30 days90 days
Delivered notification history30 days60 days90 days180 days
Failed notification history90 days180 days1 year2 years

MongoDB TTL cleanup is asynchronous. Data can remain for a short time after its retention period, so never size a disk with zero free space.

Why Min can fit in 1 GiB

The Min Compose profile:

  • does not start Symbolicator or its cleanup process;
  • gives MongoDB a 256 MiB WiredTiger cache and a 512 MiB container limit;
  • limits Metric to 320 MiB;
  • batches bursts while keeping active requests and background workers bounded;
  • disables attachments and limits Replay buffering to 4 MiB;
  • rotates container logs after two 5 MiB files per service.

The limits leave part of the recommended RAM to Linux, Docker and short memory spikes:

ProfileMongoDB ceilingMetric ceilingSymbolicator ceilingLeft for host and spikes
Min512 MiB320 MiB192 MiB
Low768 MiB768 MiB512 MiB
Medium3 GiB1.5 GiB2 GiB + 128 MiB cleanup1.375 GiB
High6 GiB3 GiB4 GiB + 256 MiB cleanup2.75 GiB

These are container ceilings, not expected idle use. Docker may use less.

MongoDB documents a minimum WiredTiger cache of 256 MiB. Metric uses that lower bound explicitly rather than letting MongoDB compete for the entire host.

One GiB is still a tight machine. Use a minimal 64-bit Linux installation, keep swap available, avoid unrelated services and watch for container restarts. The profile already uses an aggressive ingest window. If Min frequently returns 429/503 or uses swap continuously, move to Low instead of removing its final safety bounds.

Plan disk space

Metric stores data in:

  • mongo-data: events, issues, users, indexes and settings;
  • blob-data: attachments, replays, debug files and exports;
  • symbolicator-cache: rebuildable data used only by Medium and High.

The SSD recommendation includes the operating system, container images, swap and working space. Backups must be stored on another disk or machine and are not included in the table.

Each supplied profile gives BlobStore about one third of the recommended disk. Its internal reserve keeps 256 MiB, 512 MiB, 2 GiB or 4 GiB of that allocation unwritable so one large upload cannot consume the last available bytes. MongoDB, the operating system, images and swap share the rest of the disk. This is a ceiling, not preallocated space.

One event per second is 2,592,000 events over 30 days. Even a 10 KiB stored event would be about 25 GiB before indexes and other collections. Sampling SDK traces and logs matters more than choosing a larger queue.

Reference result

A committed short reference test reached 4,983 durable error events per second with no acknowledged loss on:

  • AMD Ryzen 5 5600H, 6 cores and 12 threads;
  • 16 GiB RAM;
  • MongoDB 8 on the same machine;
  • a 5,000 events-per-second target for 15 seconds.

This is a regression reference, not a long-running capacity claim and not evidence for Min or Low. Raw results are in performance/baselines.

Check your installation

Watch:

  • docker stats;
  • HTTP 429 and 503 responses;
  • /ready failures and container restarts;
  • event processing delay;
  • MongoDB disk use;
  • free space in all active volumes.

Start with the smallest profile that contains the features you need. Move up when normal traffic, not a one-time spike, repeatedly reaches its limits.

The DSN load script prints 200, 429, 503, other HTTP statuses and TCP errors separately:

bash
k6 run -e FAULTKEEP_DSN=http://KEY@SERVER:4001/PROJECT \
  -e FAULTKEEP_LOG_RPS=500 -e FAULTKEEP_DURATION=30s \
  performance/k6/structured-logs-dsn.js

Released under the MIT License.