<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hosted storage on Grafana Labs</title><link>https://grafana.com/docs/tempo/v3.0.x/configuration/hosted-storage/</link><description>Recent content in Hosted storage on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v3.0.x/configuration/hosted-storage/index.xml" rel="self" type="application/rss+xml"/><item><title>Amazon S3 and S3-compatible storage</title><link>https://grafana.com/docs/tempo/v3.0.x/configuration/hosted-storage/s3/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/configuration/hosted-storage/s3/</guid><content><![CDATA[&lt;h1 id=&#34;amazon-s3-and-s3-compatible-storage&#34;&gt;Amazon S3 and S3-compatible storage&lt;/h1&gt;
&lt;p&gt;Tempo supports Amazon S3 and S3-compatible object stores as backends for trace storage.
For general storage configuration options, refer to the storage section on the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/#storage&#34;&gt;configuration&lt;/a&gt; page.&lt;/p&gt;
&lt;h2 id=&#34;authentication&#34;&gt;Authentication&lt;/h2&gt;
&lt;p&gt;The following authentication methods are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS environment variables &lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt; and &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Static access key and secret credentials specified in &lt;code&gt;access_key&lt;/code&gt; and &lt;code&gt;secret_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;MinIO environment variables &lt;code&gt;MINIO_ACCESS_KEY&lt;/code&gt; and &lt;code&gt;MINIO_SECRET_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;AWS shared credentials &lt;a href=&#34;https://docs.aws.amazon.com/ses/latest/DeveloperGuide/create-shared-credentials-file.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;configuration file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MinIO client credentials &lt;a href=&#34;https://docs.min.io/enterprise/aistor-object-store/reference/cli/#configuration-file&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;configuration file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AWS IAM (&lt;a href=&#34;https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;IRSA via WebIdentity&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;AWS &lt;a href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;EC2 instance role&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;AWS &lt;a href=&#34;https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;EKS Pod Identity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;iam-policy&#34;&gt;IAM policy&lt;/h3&gt;
&lt;p&gt;The following IAM policy shows minimal permissions required by Tempo, where the bucket has already been created.&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;JSON&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-json&#34;&gt;{
  &amp;#34;Version&amp;#34;: &amp;#34;2012-10-17&amp;#34;,
  &amp;#34;Statement&amp;#34;: [
    {
      &amp;#34;Sid&amp;#34;: &amp;#34;TempoPermissions&amp;#34;,
      &amp;#34;Effect&amp;#34;: &amp;#34;Allow&amp;#34;,
      &amp;#34;Action&amp;#34;: [
        &amp;#34;s3:PutObject&amp;#34;,
        &amp;#34;s3:GetObject&amp;#34;,
        &amp;#34;s3:ListBucket&amp;#34;,
        &amp;#34;s3:DeleteObject&amp;#34;,
        &amp;#34;s3:GetObjectTagging&amp;#34;,
        &amp;#34;s3:PutObjectTagging&amp;#34;
      ],
      &amp;#34;Resource&amp;#34;: [&amp;#34;arn:aws:s3:::&amp;lt;bucketname&amp;gt;/*&amp;#34;, &amp;#34;arn:aws:s3:::&amp;lt;bucketname&amp;gt;&amp;#34;]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;lifecycle-policy&#34;&gt;Lifecycle policy&lt;/h3&gt;
&lt;p&gt;A lifecycle policy is recommended that deletes incomplete multipart uploads after one day.&lt;/p&gt;
&lt;h2 id=&#34;s3-compatible-local-stores-for-testing&#34;&gt;S3-compatible local stores for testing&lt;/h2&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The tools in this section are provided for local testing and evaluation only. They have not been fully tested with Tempo and are not recommended for production use.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;You can run an S3-compatible object store locally to test Tempo with the &lt;code&gt;s3&lt;/code&gt; storage backend.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/seaweedfs/seaweedfs&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;SeaweedFS&lt;/a&gt; is the recommended option for local testing, with a single-command startup and a built-in web UI.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://rclone.org/commands/rclone_serve_s3/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;rclone serve s3&lt;/a&gt; is an alternative that serves any local directory as an S3-compatible endpoint. It is classified as experimental by the &lt;code&gt;rclone&lt;/code&gt; project and has known limitations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://min.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MinIO&lt;/a&gt; is also supported but its &lt;a href=&#34;https://github.com/minio/minio&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;open source repository has been archived&lt;/a&gt; and the community edition is now distributed as source code only. Pre-compiled binaries are no longer published.&lt;/p&gt;
&lt;h3 id=&#34;set-up-a-local-s3-compatible-object-store&#34;&gt;Set up a local S3-compatible object store&lt;/h3&gt;
&lt;p&gt;Choose a tab below to set up your preferred object store:&lt;/p&gt;



&lt;div data-element=&#34;tabs&#34;&gt;
  &lt;div data-element=&#34;tabs-bar&#34;&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;0&#34; data-label=&#34;SeaweedFS&#34;&gt;SeaweedFS&lt;/div&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;1&#34; data-label=&#34;rclone serve s3 (experimental)&#34;&gt;rclone serve s3 (experimental)&lt;/div&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;2&#34; data-label=&#34;MinIO&#34;&gt;MinIO&lt;/div&gt;
    
  &lt;/div&gt;
  &lt;div data-element=&#34;tab-content&#34;&gt;
    



&lt;div&gt;
  &lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;SeaweedFS has not been fully tested with Tempo and is provided here as an alternative for local evaluation only. It isn&amp;rsquo;t recommended for production use with Tempo.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/seaweedfs/seaweedfs&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;SeaweedFS&lt;/a&gt; is an Apache 2.0-licensed distributed storage system with a built-in S3 gateway.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download and install SeaweedFS from the &lt;a href=&#34;https://github.com/seaweedfs/seaweedfs/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;releases page&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a data directory and start SeaweedFS in mini mode:&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;Bash&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-bash&#34;&gt;sudo mkdir -p /data/seaweedfs
sudo chown -R $USER:$USER /data/seaweedfs
weed mini -dir=/data/seaweedfs&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;weed mini&lt;/code&gt; command starts a complete single-node setup including the S3 gateway on port 8333. SeaweedFS runs in the foreground, so open a new terminal for the remaining steps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a bucket called &lt;code&gt;tempo&lt;/code&gt; using the AWS CLI:&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;Bash&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-bash&#34;&gt;aws --endpoint-url http://localhost:8333 s3 mb s3://tempo --no-sign-request&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You need the &lt;a href=&#34;https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;AWS CLI&lt;/a&gt; installed. SeaweedFS mini mode allows anonymous access, so the &lt;code&gt;--no-sign-request&lt;/code&gt; flag skips credential checks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;




&lt;div&gt;
  &lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;&lt;code&gt;rclone serve s3&lt;/code&gt; is classified as experimental by the rclone project and hasn&amp;rsquo;t been fully tested with Tempo. It&amp;rsquo;s provided as an alternative for local evaluation only and isn&amp;rsquo;t recommended for production use. Refer to the &lt;a href=&#34;https://rclone.org/commands/rclone_serve_s3/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;rclone documentation&lt;/a&gt; for current limitations.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&#34;https://rclone.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;rclone&lt;/a&gt; can serve any local directory as an S3-compatible endpoint.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install rclone by following the &lt;a href=&#34;https://rclone.org/install/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;rclone install guide&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a data directory and start the S3 server:&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;Bash&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-bash&#34;&gt;sudo mkdir -p /data/rclone-s3
sudo chown -R $USER:$USER /data/rclone-s3
rclone serve s3 /data/rclone-s3 --auth-key tempokey,temposecret --addr :8080&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The server runs in the foreground on port 8080. Open a new terminal for the remaining steps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a bucket called &lt;code&gt;tempo&lt;/code&gt; using the AWS CLI:&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;Bash&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-bash&#34;&gt;AWS_ACCESS_KEY_ID=tempokey AWS_SECRET_ACCESS_KEY=temposecret \
  aws --endpoint-url http://localhost:8080 s3 mb s3://tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You need the &lt;a href=&#34;https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;AWS CLI&lt;/a&gt; installed. Use the credentials you set with the &lt;code&gt;--auth-key&lt;/code&gt; flag.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;




&lt;div&gt;
  &lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The MinIO open source repository has been archived and the community edition is now source-only. Pre-compiled binaries are no longer published. You must build MinIO from source using Go 1.24 or later.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install MinIO from source:&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;Bash&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-bash&#34;&gt;go install github.com/minio/minio@latest&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Refer to the &lt;a href=&#34;https://github.com/minio/minio&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MinIO repository&lt;/a&gt; for alternative installation methods including building a Docker image.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a data directory and start MinIO:&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;Bash&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-bash&#34;&gt;sudo mkdir -p /data/minio
sudo chown -R $USER:$USER /data/minio
minio server /data/minio --console-address &amp;#39;:9001&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;By default, MinIO uses &lt;code&gt;minioadmin&lt;/code&gt; for both the access key and secret key. MinIO runs in the foreground, so open a new terminal for the remaining steps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a bucket called &lt;code&gt;tempo&lt;/code&gt; using the MinIO Client (&lt;code&gt;mc&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;Bash&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-bash&#34;&gt;mc alias set local http://localhost:9000 minioadmin minioadmin
mc mb local/tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;


  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;tempo-configuration-for-s3-compatible-stores&#34;&gt;Tempo configuration for S3-compatible stores&lt;/h3&gt;
&lt;p&gt;The following example configuration uses the S3 backend. Replace the &lt;code&gt;&amp;lt;S3_ENDPOINT&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;S3_ACCESS_KEY&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;S3_SECRET_KEY&amp;gt;&lt;/code&gt; placeholders with the values for your object store.&lt;/p&gt;
&lt;p&gt;This example configuration includes the metrics-generator. To disable it, remove the &lt;code&gt;metrics_generator&lt;/code&gt; block and the &lt;code&gt;processors&lt;/code&gt; list from the overrides.&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;stream_over_http_enabled: true

server:
  http_listen_port: 3200

distributor:
  receivers:
    otlp:
      protocols:
        grpc:
          endpoint: &amp;#34;0.0.0.0:4317&amp;#34;
        http:
          endpoint: &amp;#34;0.0.0.0:4318&amp;#34;

backend_scheduler:
  provider:
    compaction:
      compaction:
        block_retention: 1h

backend_worker:
  compaction:
    block_retention: 1h

metrics_generator:
  registry:
    external_labels:
      source: tempo
      cluster: linux-monolithic
  storage:
    path: /tmp/tempo/generator/wal
    remote_write:
      - url: http://&amp;lt;PROMETHEUS_URL&amp;gt;/api/v1/write
        send_exemplars: true

storage:
  trace:
    backend: s3
    s3:
      endpoint: &amp;lt;S3_ENDPOINT&amp;gt;
      bucket: tempo
      access_key: &amp;lt;S3_ACCESS_KEY&amp;gt;
      secret_key: &amp;lt;S3_SECRET_KEY&amp;gt;
      insecure: true
    wal:
      path: /var/tempo/wal

overrides:
  defaults:
    metrics_generator:
      processors: [service-graphs, span-metrics]

usage_report:
  reporting_enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace the &lt;code&gt;&amp;lt;PROMETHEUS_URL&amp;gt;&lt;/code&gt; placeholder with the address of your Prometheus-compatible storage instance (for example, &lt;code&gt;localhost:9090&lt;/code&gt;).
To disable the metrics-generator, remove the &lt;code&gt;processors&lt;/code&gt; list from the overrides and the &lt;code&gt;metrics_generator&lt;/code&gt; block.&lt;/p&gt;
&lt;p&gt;Use the following endpoint and credential values for each object store:&lt;/p&gt;



&lt;div data-element=&#34;tabs&#34;&gt;
  &lt;div data-element=&#34;tabs-bar&#34;&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;0&#34; data-label=&#34;SeaweedFS&#34;&gt;SeaweedFS&lt;/div&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;1&#34; data-label=&#34;rclone serve s3 (experimental)&#34;&gt;rclone serve s3 (experimental)&lt;/div&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;2&#34; data-label=&#34;MinIO&#34;&gt;MinIO&lt;/div&gt;
    
  &lt;/div&gt;
  &lt;div data-element=&#34;tab-content&#34;&gt;
    



&lt;div&gt;
  &lt;p&gt;SeaweedFS mini mode allows anonymous access, so the &lt;code&gt;access_key&lt;/code&gt; and &lt;code&gt;secret_key&lt;/code&gt; fields can be omitted or set to any value:&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:
  trace:
    backend: s3
    s3:
      endpoint: localhost:8333
      bucket: tempo
      insecure: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;




&lt;div&gt;
  &lt;p&gt;Use the credentials you set with the &lt;code&gt;--auth-key&lt;/code&gt; flag when starting &lt;code&gt;rclone&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:
  trace:
    backend: s3
    s3:
      endpoint: localhost:8080
      bucket: tempo
      access_key: tempokey
      secret_key: temposecret
      insecure: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;




&lt;div&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:
  trace:
    backend: s3
    s3:
      endpoint: localhost:9000
      bucket: tempo
      access_key: minioadmin
      secret_key: minioadmin
      insecure: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;verify-data-in-your-s3-compatible-store&#34;&gt;Verify data in your S3-compatible store&lt;/h3&gt;
&lt;p&gt;After traces start flowing, verify that your storage bucket has received data:&lt;/p&gt;



&lt;div data-element=&#34;tabs&#34;&gt;
  &lt;div data-element=&#34;tabs-bar&#34;&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;0&#34; data-label=&#34;SeaweedFS&#34;&gt;SeaweedFS&lt;/div&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;1&#34; data-label=&#34;rclone serve s3 (experimental)&#34;&gt;rclone serve s3 (experimental)&lt;/div&gt;
    
      
      &lt;div data-element=&#34;tab&#34; data-key=&#34;2&#34; data-label=&#34;MinIO&#34;&gt;MinIO&lt;/div&gt;
    
  &lt;/div&gt;
  &lt;div data-element=&#34;tab-content&#34;&gt;
    



&lt;div&gt;
  &lt;p&gt;Open the SeaweedFS admin UI at &lt;code&gt;http://localhost:23646&lt;/code&gt;, or list the bucket contents using the AWS CLI:&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;Bash&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-bash&#34;&gt;aws --endpoint-url http://localhost:8333 s3 ls s3://tempo/ --recursive --no-sign-request&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You should see files such as &lt;code&gt;single-tenant/&amp;lt;block-id&amp;gt;/data.parquet&lt;/code&gt; and &lt;code&gt;single-tenant/&amp;lt;block-id&amp;gt;/meta.json&lt;/code&gt;.&lt;/p&gt;

&lt;/div&gt;




&lt;div&gt;
  &lt;p&gt;List the bucket contents using the AWS CLI:&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;Bash&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-bash&#34;&gt;AWS_ACCESS_KEY_ID=tempokey AWS_SECRET_ACCESS_KEY=temposecret \
  aws --endpoint-url http://localhost:8080 s3 ls s3://tempo/ --recursive&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You should see files such as &lt;code&gt;single-tenant/&amp;lt;block-id&amp;gt;/data.parquet&lt;/code&gt; and &lt;code&gt;single-tenant/&amp;lt;block-id&amp;gt;/meta.json&lt;/code&gt;. &lt;code&gt;rclone serve s3&lt;/code&gt; does not provide a web UI.&lt;/p&gt;

&lt;/div&gt;




&lt;div&gt;
  Open the MinIO Console at &lt;code&gt;http://localhost:9001&lt;/code&gt; and check the &lt;code&gt;tempo&lt;/code&gt; bucket for files such as &lt;code&gt;work.json&lt;/code&gt; and a tenant data directory.
&lt;/div&gt;


  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="amazon-s3-and-s3-compatible-storage">Amazon S3 and S3-compatible storage&lt;/h1>
&lt;p>Tempo supports Amazon S3 and S3-compatible object stores as backends for trace storage.
For general storage configuration options, refer to the storage section on the
&lt;a href="/docs/tempo/v3.0.x/configuration/#storage">configuration&lt;/a> page.&lt;/p></description></item><item><title>Azure blob storage permissions and management</title><link>https://grafana.com/docs/tempo/v3.0.x/configuration/hosted-storage/azure/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/configuration/hosted-storage/azure/</guid><content><![CDATA[&lt;h1 id=&#34;azure-blob-storage-permissions-and-management&#34;&gt;Azure blob storage permissions and management&lt;/h1&gt;
&lt;p&gt;Tempo supports Azure blob storage for both monolithic and distributed modes.
Some of the supported features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Object layout: custom &lt;code&gt;container_name&lt;/code&gt; and optional &lt;code&gt;prefix&lt;/code&gt; to nest objects in a shared container.&lt;/li&gt;
&lt;li&gt;Performance: hedged requests (&lt;code&gt;hedge_requests_at&lt;/code&gt;, &lt;code&gt;hedge_requests_up_to&lt;/code&gt;) to reduce long-tail latency.&lt;/li&gt;
&lt;li&gt;Regional or sovereign clouds: configurable endpoint suffix (for example, US Gov, Germany) using &lt;code&gt;endpoint_suffix&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Local development: Azurite emulator support (non-&lt;code&gt;blob.\*&lt;/code&gt; endpoint style is auto-detected).&lt;/li&gt;
&lt;li&gt;Ops guidance: compatible with Azure Storage lifecycle policies for cleanup (example provided in the doc).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tempo supports the following authentication methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shared key&lt;/li&gt;
&lt;li&gt;Managed Identity (system/user-assigned): use &lt;code&gt;use_managed_identity&lt;/code&gt;, &lt;code&gt;user_assigned_id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Azure Workload Identity (federated token): use &lt;code&gt;use_federated_token&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;Tempo requires the following configuration to authenticate to and access Azure blob storage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Storage Account name specified in the configuration file as &lt;code&gt;storage_account_name&lt;/code&gt; or in the environment variable &lt;code&gt;AZURE_STORAGE_ACCOUNT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Credentials for accessing the Storage Account that are one of the following:
&lt;ul&gt;
&lt;li&gt;Storage Account access key specified in the configuration file as &lt;code&gt;storage_account_key&lt;/code&gt; or in the environment variable &lt;code&gt;AZURE_STORAGE_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An Azure Managed Identity that&amp;rsquo;s either system or user assigned. To use Azure Managed Identities, you need to set &lt;code&gt;use_managed_identity&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in the configuration file or set &lt;code&gt;user_assigned_id&lt;/code&gt; to the client ID for the managed identity you&amp;rsquo;d like to use.
&lt;ul&gt;
&lt;li&gt;System-assigned managed identity don&amp;rsquo;t require additional configuration.&lt;/li&gt;
&lt;li&gt;User-assigned managed identity require you to set &lt;code&gt;user_assigned_id&lt;/code&gt; to the client ID for the managed identity in the configuration file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Via Azure Workload Identity. To use Azure Workload Identity, you need to enable Azure Workload Identity on your cluster, add the required label and annotation to the service account and the required Pod label. Additionally, you need to set &lt;code&gt;use_federated_token&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; to utilize Azure Workload Identity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;sample-configuration-for-tempo-monolithic-mode&#34;&gt;Sample configuration for Tempo monolithic mode&lt;/h2&gt;
&lt;p&gt;This sample configuration shows how to set up Azure blob storage using Helm charts and an access key from Kubernetes secrets.&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;tempo:
  storage:
    trace:
      backend: azure
      azure:
        container_name: container-name
        storage_account_name: storage-account-name
        storage_account_key: ${STORAGE_ACCOUNT_ACCESS_KEY}

  extraArgs:
    config.expand-env: true
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: secret-name
          key: STORAGE_ACCOUNT_ACCESS_KEY&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;azure-workload-identity&#34;&gt;Azure Workload Identity&lt;/h3&gt;
&lt;p&gt;Here is an example configuration using Azure Workload Identity.&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;tempo:
  storage:
    trace:
      backend: azure
      azure:
        container_name: container-name
        storage_account_name: storage-account-name
        use_federated_token: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;sample-configuration-for-tempo-distributed-mode&#34;&gt;Sample configuration for Tempo distributed mode&lt;/h2&gt;
&lt;p&gt;In distributed mode, the &lt;code&gt;trace&lt;/code&gt; configuration needs to be applied against the &lt;code&gt;storage&lt;/code&gt; object, which resides at the root of the Values object. Additionally, the &lt;code&gt;extraArgs&lt;/code&gt; and &lt;code&gt;extraEnv&lt;/code&gt; configuration need to be applied to each of the following services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;distributor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;blockBuilder&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;liveStore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;querier&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queryFrontend&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backendScheduler&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backendWorker&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Distributed mode is usually installed using a Helm chart, like &lt;code&gt;tempo-distributed&lt;/code&gt;.
To use this example, add it to your &lt;code&gt;custom.yaml&lt;/code&gt; or &lt;code&gt;values.yaml&lt;/code&gt; file.&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:
  trace:
    backend: azure
    azure:
      container_name: tempo-traces
      storage_account_name: stgappgeneraluks
      storage_account_key: ${STORAGE_ACCOUNT_ACCESS_KEY}

distributor:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: tempo-traces-stg-key
          key: tempo-traces-key

blockBuilder:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: tempo-traces-stg-key
          key: tempo-traces-key

liveStore:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: tempo-traces-stg-key
          key: tempo-traces-key

querier:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: tempo-traces-stg-key
          key: tempo-traces-key

queryFrontend:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: tempo-traces-stg-key
          key: tempo-traces-key

backendScheduler:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: tempo-traces-stg-key
          key: tempo-traces-key

backendWorker:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: STORAGE_ACCOUNT_ACCESS_KEY
      valueFrom:
        secretKeyRef:
          name: tempo-traces-stg-key
          key: tempo-traces-key&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;use-metrics-generator-with-azure-storage&#34;&gt;Use &lt;code&gt;metrics-generator&lt;/code&gt; with Azure storage&lt;/h4&gt;


&lt;div data-shared=&#34;azure-metrics-generator.md&#34;&gt;
            &lt;!-- metrics-generator, Azure storage, and Helm charts--&gt;
&lt;p&gt;The metrics-generator consumes trace data from Kafka and writes derived metrics using the Prometheus remote write protocol.
If the metrics-generator needs access to Azure blob storage, list it in the &lt;code&gt;env var&lt;/code&gt; expansion configuration so the &lt;code&gt;STORAGE_ACCOUNT_ACCESS_KEY&lt;/code&gt; has the secret value.&lt;/p&gt;
&lt;p&gt;You can use this configuration example with Helm charts, like &lt;code&gt;tempo-distributed&lt;/code&gt;.
Replace any values in all caps with the values for your Helm deployment.&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;generator:
  extraArgs:
    - &amp;#34;-config.expand-env=true&amp;#34;
  extraEnv:
    - name: &amp;lt;STORAGE_ACCOUNT_ACCESS_KEY&amp;gt;
      valueFrom:
        secretKeyRef:
          name: &amp;lt;TEMPO-TRACES-STG-KEY&amp;gt;
          key: &amp;lt;TEMPO-TRACES-KEY&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

        
&lt;p&gt;For more information, refer to &lt;a href=&#34;/docs/tempo/next/metrics-from-traces/metrics-queries/configure-traceql-metrics/&#34;&gt;Configure TraceQL metrics&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;additional-configuration-options&#34;&gt;Additional configuration options&lt;/h2&gt;
&lt;p&gt;The following sections provide additional configuration options for Azure blob storage.&lt;/p&gt;
&lt;h3 id=&#34;use-azurite-for-local-development&#34;&gt;Use Azurite for local development&lt;/h3&gt;
&lt;p&gt;You can use the Azurite emulator to test your Tempo configuration locally.
Refer to the &lt;a href=&#34;https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azurite emulator documentation&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;Tempo treats any Azure &lt;code&gt;endpoint_suffix&lt;/code&gt; that doesn&amp;rsquo;t start with &lt;code&gt;blob.&lt;/code&gt; as Azurite and automatically switches to the emulator URL style.
For more information about the Azurite URL style, refer to the &lt;a href=&#34;https://learn.microsoft.com/en-us/rest/api/storageservices/get-blob#emulated-storage-service-uri&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Storage documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Set &lt;code&gt;backend&lt;/code&gt; to &lt;code&gt;azure&lt;/code&gt;, supply your Azurite account and key, and point &lt;code&gt;endpoint_suffix&lt;/code&gt; to the emulator &lt;code&gt;host:port&lt;/code&gt;.
Tempo handles the Azurite URL format automatically.&lt;/p&gt;
&lt;p&gt;If you encounter any issues, try using the fully qualified domain name (FQDN) for the Azurite emulator.
For example, &lt;code&gt;azurite-host.azure.local:10000&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In this example, replace the example values with your Azure configuration values and then update your Helm deployment.&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:
  trace:
    blocklist_poll: 1s
    backend: azure
    azure:
      container_name: container-name # how to store data in azure
      endpoint_suffix: azurite-host.svc.cluster.local:10000 # Azurite emulator host:port
      storage_account_name: &amp;#34;&amp;lt;STORAGE-ACCOUNT-NAME&amp;gt;&amp;#34;
      storage_account_key: &amp;#34;&amp;lt;STORAGE_ACCOUNT_ACCESS_KEY&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;azure-blocklist-polling&#34;&gt;Azure blocklist polling&lt;/h3&gt;
&lt;p&gt;If you are hosting Tempo on Azure, you may need to update two values to ensure consistent successful blocklist polling.
If you experience &lt;a href=&#34;https://stackoverflow.com/questions/12917857/the-specified-block-list-is-invalid-while-uploading-blobs-in-parallel/55902744#55902744&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;this issue&lt;/a&gt;, try setting &lt;code&gt;blocklist_poll_tenant_index_builders&lt;/code&gt; to 1.&lt;/p&gt;
&lt;p&gt;Additionally, if you are seeing DNS failures like the ones below, try increasing &lt;code&gt;blocklist_poll_jitter_ms&lt;/code&gt;.
Refer to the discussion in &lt;a href=&#34;https://github.com/grafana/tempo/issues/1462&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;GitHub issue 1462&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example:&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;text&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-text&#34;&gt;reading storage container: Head &amp;#34;https://tempoe**************.blob.core.windows.net/tempo/single-tenant/d8aafc48-5796-4221-ac0b-58e001d18515/meta.compacted.json?timeout=61&amp;#34;: dial tcp: lookup tempoe**************.blob.core.windows.net on 10.0.0.10:53: dial udp 10.0.0.10:53: operation was canceled&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Your final configuration may look something like:&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:
  trace:
    blocklist_poll_tenant_index_builders: 1
    blocklist_poll_jitter_ms: 500&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;optional-storage-account-management-policy-for-cleaning-up-the-storage-container&#34;&gt;(Optional) Storage Account management policy for cleaning up the storage container&lt;/h3&gt;
&lt;p&gt;The following Storage Account management policy shows an example of cleaning up
files from the container after they have been deleted for a period of time.&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;JSON&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-json&#34;&gt;{
  &amp;#34;id&amp;#34;: &amp;#34;/subscriptions/00000000-0000-0000000000000000000000/resourceGroups/resourceGroupName/providers/Microsoft.Storage/storageAccounts/accountName/managementPolicies/default&amp;#34;,
  &amp;#34;lastModifiedTime&amp;#34;: &amp;#34;2021-11-30T19:19:54.855455&amp;#43;00:00&amp;#34;,
  &amp;#34;name&amp;#34;: &amp;#34;DefaultManagementPolicy&amp;#34;,
  &amp;#34;policy&amp;#34;: {
    &amp;#34;rules&amp;#34;: [
      {
        &amp;#34;definition&amp;#34;: {
          &amp;#34;actions&amp;#34;: {
            &amp;#34;baseBlob&amp;#34;: {
              &amp;#34;delete&amp;#34;: {
                &amp;#34;daysAfterLastAccessTimeGreaterThan&amp;#34;: null,
                &amp;#34;daysAfterModificationGreaterThan&amp;#34;: 60.0
              },
              &amp;#34;enableAutoTierToHotFromCool&amp;#34;: null,
              &amp;#34;tierToArchive&amp;#34;: null,
              &amp;#34;tierToCool&amp;#34;: null
            },
            &amp;#34;snapshot&amp;#34;: null,
            &amp;#34;version&amp;#34;: null
          },
          &amp;#34;filters&amp;#34;: {
            &amp;#34;blobIndexMatch&amp;#34;: null,
            &amp;#34;blobTypes&amp;#34;: [&amp;#34;blockBlob&amp;#34;],
            &amp;#34;prefixMatch&amp;#34;: [&amp;#34;tempo-data&amp;#34;]
          }
        },
        &amp;#34;enabled&amp;#34;: true,
        &amp;#34;name&amp;#34;: &amp;#34;TempoBlobRetention&amp;#34;,
        &amp;#34;type&amp;#34;: &amp;#34;Lifecycle&amp;#34;
      },
      {
        &amp;#34;definition&amp;#34;: {
          &amp;#34;actions&amp;#34;: {
            &amp;#34;baseBlob&amp;#34;: null,
            &amp;#34;snapshot&amp;#34;: null,
            &amp;#34;version&amp;#34;: {
              &amp;#34;delete&amp;#34;: {
                &amp;#34;daysAfterCreationGreaterThan&amp;#34;: 7.0
              },
              &amp;#34;tierToArchive&amp;#34;: null,
              &amp;#34;tierToCool&amp;#34;: null
            }
          },
          &amp;#34;filters&amp;#34;: {
            &amp;#34;blobIndexMatch&amp;#34;: null,
            &amp;#34;blobTypes&amp;#34;: [&amp;#34;blockBlob&amp;#34;],
            &amp;#34;prefixMatch&amp;#34;: []
          }
        },
        &amp;#34;enabled&amp;#34;: true,
        &amp;#34;name&amp;#34;: &amp;#34;VersionRetention&amp;#34;,
        &amp;#34;type&amp;#34;: &amp;#34;Lifecycle&amp;#34;
      }
    ]
  },
  &amp;#34;resourceGroup&amp;#34;: &amp;#34;resource-group-name&amp;#34;,
  &amp;#34;type&amp;#34;: &amp;#34;Microsoft.Storage/storageAccounts/managementPolicies&amp;#34;
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="azure-blob-storage-permissions-and-management">Azure blob storage permissions and management&lt;/h1>
&lt;p>Tempo supports Azure blob storage for both monolithic and distributed modes.
Some of the supported features include:&lt;/p>
&lt;ul>
&lt;li>Object layout: custom &lt;code>container_name&lt;/code> and optional &lt;code>prefix&lt;/code> to nest objects in a shared container.&lt;/li>
&lt;li>Performance: hedged requests (&lt;code>hedge_requests_at&lt;/code>, &lt;code>hedge_requests_up_to&lt;/code>) to reduce long-tail latency.&lt;/li>
&lt;li>Regional or sovereign clouds: configurable endpoint suffix (for example, US Gov, Germany) using &lt;code>endpoint_suffix&lt;/code>.&lt;/li>
&lt;li>Local development: Azurite emulator support (non-&lt;code>blob.\*&lt;/code> endpoint style is auto-detected).&lt;/li>
&lt;li>Ops guidance: compatible with Azure Storage lifecycle policies for cleanup (example provided in the doc).&lt;/li>
&lt;/ul>
&lt;p>Tempo supports the following authentication methods:&lt;/p></description></item><item><title>Google Cloud Storage</title><link>https://grafana.com/docs/tempo/v3.0.x/configuration/hosted-storage/gcs/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/configuration/hosted-storage/gcs/</guid><content><![CDATA[&lt;h1 id=&#34;google-cloud-storage&#34;&gt;Google Cloud Storage&lt;/h1&gt;
&lt;p&gt;For configuration options, check the storage section on the &lt;a href=&#34;../../#storage&#34;&gt;configuration&lt;/a&gt; page.&lt;/p&gt;
&lt;h2 id=&#34;permissions&#34;&gt;Permissions&lt;/h2&gt;
&lt;p&gt;The following authentication methods are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Cloud Platform environment variable &lt;code&gt;GOOGLE_APPLICATION_CREDENTIALS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Google Cloud Platform Workload Identity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;(service-)account&lt;/code&gt; that will communicate towards GCS should be assigned to the bucket which will receive the traces and should have the following IAM policies within the bucket:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;storage.objects.create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;storage.objects.delete&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;storage.objects.get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;storage.buckets.get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;storage.objects.list&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="google-cloud-storage">Google Cloud Storage&lt;/h1>
&lt;p>For configuration options, check the storage section on the &lt;a href="../../#storage">configuration&lt;/a> page.&lt;/p>
&lt;h2 id="permissions">Permissions&lt;/h2>
&lt;p>The following authentication methods are supported:&lt;/p>
&lt;ul>
&lt;li>Google Cloud Platform environment variable &lt;code>GOOGLE_APPLICATION_CREDENTIALS&lt;/code>&lt;/li>
&lt;li>Google Cloud Platform Workload Identity&lt;/li>
&lt;/ul>
&lt;p>The &lt;code>(service-)account&lt;/code> that will communicate towards GCS should be assigned to the bucket which will receive the traces and should have the following IAM policies within the bucket:&lt;/p></description></item></channel></rss>