Storage

    Prometheus includes a local on-disk time series database, but also optionally integrates with remote storage systems.

    Prometheus’s local time series database stores data in a custom, highly efficient format on local storage.

    Ingested samples are grouped into blocks of two hours. Each two-hour block consists of a directory containing one or more chunk files that contain all time series samples for that window of time, as well as a metadata file and index file (which indexes metric names and labels to time series in the chunk files). When series are deleted via the API, deletion records are stored in separate tombstone files (instead of deleting the data immediately from the chunk files).

    The current block for incoming samples is kept in memory and is not fully persisted. It is secured against crashes by a write-ahead log (WAL) that can be replayed when the Prometheus server restarts. Write-ahead log files are stored in the directory in 128MB segments. These files contain raw data that has not yet been compacted; thus they are significantly larger than regular block files. Prometheus will retain a minimum of three write-ahead log files. High-traffic servers may retain more than three WAL files in order to to keep at least two hours of raw data.

    A Prometheus server’s data directory looks something like this:

    Note that a limitation of local storage is that it is not clustered or replicated. Thus, it is not arbitrarily scalable or durable in the face of drive or node outages and should be managed like any other single node database. The use of RAID is suggested for storage availability, and are recommended for backups. With proper architecture, it is possible to retain years of data in local storage.

    Alternatively, external storage may be used via the remote read/write APIs. Careful evaluation is required for these systems as they vary greatly in durability, performance, and efficiency.

    The initial two-hour blocks are eventually compacted into longer blocks in the background.

    Compaction will create larger blocks containing data spanning up to 10% of the retention time, or 31 days, whichever is smaller.

    Prometheus has several flags that configure local storage. The most important are:

    • --storage.tsdb.path: Where Prometheus writes its database. Defaults to data/.
    • --storage.tsdb.retention.time: When to remove old data. Defaults to . Overrides storage.tsdb.retention if this flag is set to anything other than default.
    • : Deprecated in favor of storage.tsdb.retention.time.
    • --storage.tsdb.wal-compression: Enables compression of the write-ahead log (WAL). Depending on your data, you can expect the WAL size to be halved with little extra cpu load. This flag was introduced in 2.11.0 and enabled by default in 2.20.0. Note that once enabled, downgrading Prometheus to a version below 2.11.0 will require deleting the WAL.

    Prometheus stores an average of only 1-2 bytes per sample. Thus, to plan the capacity of a Prometheus server, you can use the rough formula:

    1. needed_disk_space = retention_time_seconds * ingested_samples_per_second * bytes_per_sample

    To lower the rate of ingested samples, you can either reduce the number of time series you scrape (fewer targets or fewer series per target), or you can increase the scrape interval. However, reducing the number of series is likely more effective, due to compression of samples within a series.

    If your local storage becomes corrupted for whatever reason, the best strategy to address the problenm is to shut down Prometheus then remove the entire storage directory. You can also try removing individual block directories, or the WAL directory to resolve the problem. Note that this means losing approximately two hours data per block directory. Again, Prometheus’s local storage is not intended to be durable long-term storage; external solutions offer exteded retention and data durability.

    CAUTION: Non-POSIX compliant filesystems are not supported for Prometheus’ local storage as unrecoverable corruptions may happen. NFS filesystems (including AWS’s EFS) are not supported. NFS could be POSIX-compliant, but most implementations are not. It is strongly recommended to use a local filesystem for reliability.

    Expired block cleanup happens in the background. It may take up to two hours to remove expired blocks. Blocks must be fully expired before they are removed.

    Prometheus’s local storage is limited to a single node’s scalability and durability. Instead of trying to solve clustered storage in Prometheus itself, Prometheus offers a set of interfaces that allow integrating with remote storage systems.

    Prometheus integrates with remote storage systems in two ways:

    • Prometheus can write samples that it ingests to a remote URL in a standardized format.

    The read and write protocols both use a snappy-compressed protocol buffer encoding over HTTP. The protocols are not considered as stable APIs yet and may change to use gRPC over HTTP/2 in the future, when all hops between Prometheus and the remote storage can safely be assumed to support HTTP/2.

    For details on configuring remote storage integrations in Prometheus, see the and remote read sections of the Prometheus configuration documentation.

    For details on the request and response messages, see the .

    To learn more about existing integrations with remote storage systems, see the Integrations documentation.