All pages
Limits and fair use
These are the limits the Metrics API and its clients enforce. The API has no request rate limit or storage quota today. It rejects a value over a limit with an error that names the limit, and never truncates it. Metrics is free to use under fair use; there are no paid plans, and for more than this page allows, email info@041.io.
Requests
| what | limit |
|---|---|
envelopes per request to /api/v2/events or /api/v2/experiments/{experimentId}/events |
1 to 1,000 |
envelopes per request to /api/v2/query/series |
exactly 1 |
messageId, correlationId |
1 to 200 characters |
messageId in one experiment batch |
unique; a duplicate rejects the whole request with 400 |
tokenRevoke in a batch |
must be the last event |
query.experiments, query.revisions |
at most 500 experimentIds, and the only event in its request |
A batch is not a transaction: events run in order and each one succeeds or fails on its own. See HTTP API.
Experiments and folders
| what | limit |
|---|---|
experiment slug |
1 to 200 characters, unique in the organization |
| experiment display name | 1 to 200 characters after trimming; null clears it |
experiment description |
at most 4,000 characters |
experiment meta |
any JSON object |
experiment.error message |
1 to 8,000 characters |
| folder name | 1 to 200 characters, not blank, no /, unique among its siblings |
| folder nesting | at most 100 levels below a root folder |
Saved views
| what | limit |
|---|---|
| view name | 1 to 200 characters after trimming, unique in the organization |
| view state | a JSON object of at most 65,536 UTF-8 bytes as compact JSON |
A name another view already has is refused with view_already_exists. The app
and the command line write the workspace state;
the API stores any JSON object within the limit.
Metrics
| what | limit |
|---|---|
| metric name | printable ASCII, 1 to 256 bytes, and at most 512 bytes once percent-encoded |
metricValue |
a finite number; NaN and infinity are rejected |
step |
an integer from 0 to 2^53 − 2 |
timestampMs |
an integer from 0 to 2^53 − 1 |
| metadata keys per point | at most 32 |
| metadata key | at most 128 UTF-8 bytes |
| metadata value | a string of at most 512 UTF-8 bytes |
| metadata, as canonical JSON | at most 4,096 UTF-8 bytes |
| distinct metadata maps per metric in one experiment | 4,096 |
Every distinct metadata map is its own line on a chart. A write that would give
a metric a 4,097th map fails with a 409 event error; writes that use only
existing maps keep succeeding. Keep metadata to bounded categories such as
split or rank; see What to log.
When one metric's local write buffer reaches 2 GiB, it answers writes with a retryable 503 until flushing to long-term storage frees space. See Series storage.
Annotations
| what | limit |
|---|---|
| annotation text | 1 to 16,000 characters |
| annotation metadata | at most 65,536 UTF-8 bytes of compact JSON |
query.annotations |
returns at most 100,000 annotations, without pagination |
Store larger records as artifacts and put their paths or URLs in the metadata.
Reading series
| what | limit |
|---|---|
query.series |
one series per request |
query.experimentseries seriesNames |
at most 1,000; omit it to read every series |
filter predicates |
at most 32 |
filter metadataKey |
at most 128 UTF-8 bytes |
filter metadataValue |
at most 512 UTF-8 bytes |
| order | ascending by step or timestamp |
The API sets no cap on the points one read returns. The API has no slicing, descending order or aggregation; see API events.
Credentials
| what | limit |
|---|---|
| experiment token lifetime | 24 hours from experiment.open or experiment.tokenRefresh |
| old token after a refresh | valid for at most 30 more seconds |
| refreshing a token | needs the organization key and a token that is neither expired nor revoked |
| a revoked organization API key | can keep working for up to 60 seconds |
The collector refreshes its tokens five minutes before they expire, so a run longer than a day keeps working. See Organizations and keys.
The collector
These are the defaults of syvain-metrics-collector, not API limits, except
where the API sets the ceiling.
| setting | default | range or behavior |
|---|---|---|
max_queue_items |
100,000 | at capacity the oldest queued event is evicted and counted as dropped |
max_batch_items |
500 | 1 to 1,000, the API's batch ceiling |
flush_delay_seconds |
0.25 | how long a burst is coalesced |
request_timeout_seconds |
10.0 | per request |
| opening an experiment | waits up to 120 seconds | |
| draining at process exit | up to 30 seconds |
The collector checks metric and annotation limits when you call metric() or
annotation() and raises ValueError there, so an invalid event never reaches
the queue. It shortens an exception message to fit the 8,000-character error
limit. See the collector.
Charts from the command line
syvain-metrics renders PNG charts through a renderer with its own limits.
| what | limit |
|---|---|
| lines | 1 to 32 |
| x positions | at most 10,000 |
| lines × x positions | at most 50,000 |
| width | 320 to 2,400 px, default 1,200 |
| height | 240 to 1,600 px, default 720 |
| subplots | at least 76 px of height per panel |
| title | at most 200 characters |
See Command line.
Fair use and pricing
Metrics is free to use under fair use. There are no paid plans today.
If you need more than this page allows (higher limits, retention guarantees, an on-prem or dedicated deployment, or anything Metrics does not do yet), email info@041.io.