---
title: "Limits"
description: "Request and record sizes, rates, new environments, datasets, retention and search limits."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.ezghcloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Limits

## Sending logs

| Limit | Value |
| --- | --- |
| Request size (HTTP body or gRPC message) | 5 MiB, compressed |
| Request size, decompressed | 64 MiB |
| Record body | 64 KiB |
| Attributes per map (resource, scope or record) | 256 |
| Record event time | From the dataset's retention (its total days) up to 1 day in the future |
| New environments | 10 an hour per project |
| `ezgh.metadata.*` values | 1 to 63 characters, after trimming and lowercasing |

Over a size limit, the request is refused with `413`. A record over a record limit is rejected in
`partial_success` while the rest are stored. Over the new-environments rate, the request is
refused with `429` and retried by the exporter. See [Troubleshooting](/observability/troubleshooting).

## Rates

Your organization, and each dataset, has a rate of bytes and requests per second for sending
logs, with a burst above it. Over a rate, requests are refused with `429` / `RESOURCE_EXHAUSTED`
with a retry delay, and exporters retry them. The organization's rate (applied to each project
too) counts each request's decompressed size. A dataset's rate counts the stored size of its
records, which differs from the request's size. For traces, the rates count every span received,
including spans that [trace sampling](/observability/sampling) then drops.

```sh
ezgh obs limits get
```

shows your organization's rates and bursts, how many searches can run at once, the new-environment
rate and the most datasets a project can have, and the effective limits of any dataset with its
own ([GetLimits](/obs-api/GetLimits/)). To raise a limit, contact support.

## Datasets

| Quota ID | Name | Scope | Adjustable |
| --- | --- | --- | --- |
| `obs.datasets.perProject` | Datasets per project | Project | Yes, up to 100 |

A dataset create over the quota is `409 quota_exceeded`, and over the platform's ceiling of 100
datasets per project, `409 project_dataset_limit`. A new environment's records over either are
rejected in `partial_success`. `ezgh quotas get obs.datasets.perProject --scope-key <project>`
shows the limit and usage; see [Service quotas](/quotas).

## Dashboards

| Quota ID | Name | Scope | Adjustable |
| --- | --- | --- | --- |
| `obs.dashboards.perProject` | Dashboards per project | Project | Yes, up to 1,000 |

A dashboard has at most 50 panels, 4 queries per panel, 10 variables and 256 KiB of spec, and its
last 50 versions are kept. See [Dashboards](/observability/dashboards#limits).

## Services

| Quota ID | Name | Scope | Adjustable |
| --- | --- | --- | --- |
| `obs.services.perProject` | Services per project | Project | Yes, up to 5,000 |

A project's [service catalog](/observability/service-catalog) keeps up to 1,000 services by
default. Past the quota, new services aren't cataloged; their data is still stored. Span metrics
have their own caps; see [Span metrics](/observability/span-metrics#caps).

## Trace sampling

A dataset's [sampling policy](/observability/sampling#limits) has at most 20 rules, 10 attribute
filters per rule and 64 KiB in all, and a decision wait of 5 to 120 seconds.

## Retention

| Class | Hot days | Total days |
| --- | --- | --- |
| `7d-30d` (the default) | 7 | 30 |
| `7d-90d` | 7 | 90 |
| `14d-365d` | 14 | 365 |
| `14d-395d` (the default for metrics) | 14 | 395 |
| `cold-365d` | 0 | 365 |

Records past their total days aren't returned, and are deleted. Metrics' limits and query budgets
are on [Metrics](/observability/metrics#limits).

## Search and async queries

| Limit | Value |
| --- | --- |
| Records per search page | 1 to 100 (default 50) |
| Reading a search's next pages | Within 10 minutes of its first page |
| Datasets per search | 1 |
| Datasets per async query | 1 to 10, of one project |
| Records an async query keeps | 1 to 100,000 (default 10,000) |
| Groups an async group-by query returns | At most 10,000 |
| Rows per page of async results | 1 to 1,000 (default 100) |
| How long async results are kept | 24 hours by default (`resultsExpireAt` says when) |

A search has a budget of time and data read. A search over it is refused with
`422 query_too_expensive`, never cut short: run it as an async query instead.

Source: https://docs.ezghcloud.com/observability/limits/index.mdx
