<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Configure storage on Grafana Labs</title><link>https://grafana.com/docs/pyroscope/v1.18.x/configure-server/storage/</link><description>Recent content in Configure storage on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/pyroscope/v1.18.x/configure-server/storage/index.xml" rel="self" type="application/rss+xml"/><item><title>Configure disk storage</title><link>https://grafana.com/docs/pyroscope/v1.18.x/configure-server/storage/configure-disk-storage/</link><pubDate>Wed, 08 Apr 2026 14:38:28 +0000</pubDate><guid>https://grafana.com/docs/pyroscope/v1.18.x/configure-server/storage/configure-disk-storage/</guid><content><![CDATA[&lt;h1 id=&#34;configure-disk-storage&#34;&gt;Configure disk storage&lt;/h1&gt;
&lt;p&gt;The &lt;a href=&#34;../../../reference-pyroscope-architecture/components/ingester/&#34;&gt;ingester&lt;/a&gt; component in Grafana Pyroscope processes the received profiling data.
First it keeps the data organized in memory, in the so-called &amp;ldquo;head block&amp;rdquo;.
Once the size of the head block exceeds a threshold or the head block is older than
&lt;code&gt;-pyroscopedb.max-block-duration&lt;/code&gt; (by default 1 hour), the ingester writes
the block to the local persistent disk.
Refer to &lt;a href=&#34;../../../reference-pyroscope-architecture/block-format/&#34;&gt;block format&lt;/a&gt; for more detail about the block&amp;rsquo;s layout.&lt;/p&gt;
&lt;p&gt;Each of those blocks are identified by an &lt;a href=&#34;https://github.com/ulid/spec&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;ULID&lt;/a&gt; and stored
within Pyroscope&amp;rsquo;s data path &lt;code&gt;-pyroscopedb.data-path=&lt;/code&gt; (by default
&lt;code&gt;./data&lt;/code&gt;).
This directory is organized by the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./&amp;lt;tenant-id&amp;gt;&lt;/code&gt;: Each tenant has its own subdirectory with the following subdirectories:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;head/&amp;lt;block-id&amp;gt;&lt;/code&gt;: Contains the current data still being written.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;local/&amp;lt;block-id&amp;gt;&lt;/code&gt;: Contains the finished blocks, which are kept locally&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;object-storage&#34;&gt;Object storage&lt;/h2&gt;
&lt;p&gt;When &lt;a href=&#34;../configure-object-storage-backend/&#34;&gt;object storage is configured&lt;/a&gt;, finished blocks are
uploaded to the object store bucket.&lt;/p&gt;
&lt;h2 id=&#34;high-disk-utilization&#34;&gt;High disk utilization&lt;/h2&gt;
&lt;p&gt;To avoid losing the most recent data, Pyroscope removes the oldest blocks
when it detects that the volume on which the data path is located is close to
running out of disk space.
The check for high disk utilization runs every
&lt;code&gt;-pyroscopedb.retention-policy-enforcement-interval&lt;/code&gt; when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;less than &lt;code&gt;-pyroscopedb.retention-policy-min-disk-available-percentage=0.05&lt;/code&gt; of the total size of the volume is available and&lt;/li&gt;
&lt;li&gt;the available disk space smaller then &lt;code&gt;-pyroscopedb.retention-policy-min-free-disk-gb=10&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The deletion is logged like this:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;level=warn caller=pyroscopedb.go:231 ts=2022-10-05T13:19:09.770693308Z msg=&amp;#34;disk utilization is high, deleted oldest block&amp;#34; path=data/anonymous/local/01GDZYHKKKY2ANY6PCJJZGT1N8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="configure-disk-storage">Configure disk storage&lt;/h1>
&lt;p>The &lt;a href="../../../reference-pyroscope-architecture/components/ingester/">ingester&lt;/a> component in Grafana Pyroscope processes the received profiling data.
First it keeps the data organized in memory, in the so-called &amp;ldquo;head block&amp;rdquo;.
Once the size of the head block exceeds a threshold or the head block is older than
&lt;code>-pyroscopedb.max-block-duration&lt;/code> (by default 1 hour), the ingester writes
the block to the local persistent disk.
Refer to &lt;a href="../../../reference-pyroscope-architecture/block-format/">block format&lt;/a> for more detail about the block&amp;rsquo;s layout.&lt;/p></description></item><item><title>Configure object storage backend</title><link>https://grafana.com/docs/pyroscope/v1.18.x/configure-server/storage/configure-object-storage-backend/</link><pubDate>Wed, 08 Apr 2026 14:38:28 +0000</pubDate><guid>https://grafana.com/docs/pyroscope/v1.18.x/configure-server/storage/configure-object-storage-backend/</guid><content><![CDATA[&lt;h1 id=&#34;configure-object-storage-backend&#34;&gt;Configure object storage backend&lt;/h1&gt;
&lt;p&gt;Grafana Pyroscope can use different object storage services to persist blocks containing the profiles data.
Blocks are flushed by ingesters 
    &lt;a href=&#34;/docs/pyroscope/v1.18.x/configure-server/storage/configure-disk-storage/&#34;&gt;on disk&lt;/a&gt; first then are uploaded to the object store.&lt;/p&gt;
&lt;p&gt;The supported backends are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/s3/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Amazon S3&lt;/a&gt; and compatible implementations like &lt;a href=&#34;https://min.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MinIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/storage&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Google Cloud Storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://azure.microsoft.com/es-es/services/storage/blobs/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Blob Storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.openstack.org/wiki/Swift&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Swift (OpenStack Object Storage)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Internally, Pyroscope uses &lt;a href=&#34;https://github.com/thanos-io/objstore#supported-providers-clients&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Thanos&amp;rsquo; object store client&lt;/a&gt; library, so their stated limitations apply.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;amazon-s3&#34;&gt;Amazon S3&lt;/h2&gt;
&lt;p&gt;To use an AWS S3 or S3-compatible bucket for long term storage, you can find Pyroscope&amp;rsquo;s configuration parameters &lt;a href=&#34;../../reference-configuration-parameters/#s3_storage_backend&#34;&gt;in the reference config&lt;/a&gt;. Apart from those parameters, it is also possible to supply configuration  parameters using &lt;a href=&#34;https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;the well-known environment variables&lt;/a&gt; of the AWS SDK.&lt;/p&gt;
&lt;p&gt;At a minimum, you will need to provide values for the &lt;code&gt;bucket_name&lt;/code&gt;, &lt;code&gt;endpoint&lt;/code&gt;, &lt;code&gt;access_key_id&lt;/code&gt;, and &lt;code&gt;secret_access_key&lt;/code&gt; keys.&lt;/p&gt;
&lt;h3 id=&#34;example-using-an-aws-bucket&#34;&gt;Example using an AWS Bucket&lt;/h3&gt;
&lt;p&gt;This how one would configure a bucket in the AWS region &lt;code&gt;eu-west-2&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage:
  backend: s3
  s3:
    bucket_name: #REPLACE_WITH_BUCKET_NAME
    region: eu-west-2
    endpoint: s3.eu-west-2.amazonaws.com
    access_key_id: #REPLACE_WITH_ACCESS_KEY
    secret_access_key: #REPLACE_WITH_SECRET_KEY&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;example-using-a-s3-compatible-bucket&#34;&gt;Example using a S3 compatible Bucket&lt;/h3&gt;
&lt;p&gt;This how one would configure a bucket on a locally running instance of &lt;a href=&#34;https://min.io/docs/minio/container/index.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MinIO&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage:
  backend: s3
  s3:
    bucket_name: grafana-pyroscope-data
    endpoint: localhost:9000
    insecure: true
    access_key_id: grafana-pyroscope-data
    secret_access_key: grafana-pyroscope-data&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;google-cloud-storage&#34;&gt;Google Cloud Storage&lt;/h2&gt;
&lt;p&gt;To use a Google Cloud Storage (GCS) bucket for long term storage, you can find Pyroscope&amp;rsquo;s configuration parameters &lt;a href=&#34;../../reference-configuration-parameters/#gcs_storage_backend&#34;&gt;in the reference config&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At a minimum, you will need to provide a values for the &lt;code&gt;bucket_name&lt;/code&gt; and a service account. To supply the service account there are two ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt; environment variable to locate your &lt;a href=&#34;https://cloud.google.com/docs/authentication/production&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;application credentials&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Provide the content the service account key within the &lt;code&gt;service_account&lt;/code&gt; parameter.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;example-using-a-google-cloud-storage-bucket&#34;&gt;Example using a Google Cloud Storage bucket&lt;/h3&gt;
&lt;p&gt;This how one would configure a GCS bucket using the &lt;code&gt;service_account&lt;/code&gt; parameter:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage:
  backend: gcs
  gcs:
    bucket_name: grafana-pyroscope-data
    service_account: |
      {
        &amp;#34;type&amp;#34;: &amp;#34;service_account&amp;#34;,
        &amp;#34;project_id&amp;#34;: &amp;#34;PROJECT_ID&amp;#34;,
        &amp;#34;private_key_id&amp;#34;: &amp;#34;KEY_ID&amp;#34;,
        &amp;#34;private_key&amp;#34;: &amp;#34;-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY\n-----END PRIVATE KEY-----\n&amp;#34;,
        &amp;#34;client_email&amp;#34;: &amp;#34;SERVICE_ACCOUNT_EMAIL&amp;#34;,
        &amp;#34;client_id&amp;#34;: &amp;#34;CLIENT_ID&amp;#34;,
        &amp;#34;auth_uri&amp;#34;: &amp;#34;https://accounts.google.com/o/oauth2/auth&amp;#34;,
        &amp;#34;token_uri&amp;#34;: &amp;#34;https://accounts.google.com/o/oauth2/token&amp;#34;,
        &amp;#34;auth_provider_x509_cert_url&amp;#34;: &amp;#34;https://www.googleapis.com/oauth2/v1/certs&amp;#34;,
        &amp;#34;client_x509_cert_url&amp;#34;: &amp;#34;https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL&amp;#34;
      }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;azure-blob-storage&#34;&gt;Azure Blob Storage&lt;/h2&gt;
&lt;p&gt;To use an Azure Blob Storage bucket for long term storage, you can find Pyroscope&amp;rsquo;s configuration parameters &lt;a href=&#34;../../reference-configuration-parameters/#azure_storage_backend&#34;&gt;in the reference config&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;user_assigned_id&lt;/code&gt; is used, authentication is done via user-assigned managed identity.&lt;/p&gt;
&lt;h2 id=&#34;swift-openstack-object-storage&#34;&gt;Swift (OpenStack Object Storage)&lt;/h2&gt;
&lt;p&gt;To use a Swift (OpenStack Object Storage) bucket for long term storage, you can find Pyroscope&amp;rsquo;s configuration parameters &lt;a href=&#34;../../reference-configuration-parameters/#swift_storage_backend&#34;&gt;in the reference config&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the &lt;code&gt;name&lt;/code&gt; of a user, project or tenant is used one must also specify its domain by ID or name. Various examples for OpenStack authentication can be found in the &lt;a href=&#34;https://developer.openstack.org/api-ref/identity/v3/index.html?expanded=password-authentication-with-scoped-authorization-detail#password-authentication-with-unscoped-authorization&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;official documentation&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
]]></content><description>&lt;h1 id="configure-object-storage-backend">Configure object storage backend&lt;/h1>
&lt;p>Grafana Pyroscope can use different object storage services to persist blocks containing the profiles data.
Blocks are flushed by ingesters
&lt;a href="/docs/pyroscope/v1.18.x/configure-server/storage/configure-disk-storage/">on disk&lt;/a> first then are uploaded to the object store.&lt;/p></description></item></channel></rss>