<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Configure Tempo on Grafana Labs</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/</link><description>Recent content in Configure Tempo on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v2.2.x/configuration/index.xml" rel="self" type="application/rss+xml"/><item><title>Google Cloud Storage permissions</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/gcs/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/gcs/</guid><content><![CDATA[&lt;h1 id=&#34;google-cloud-storage-permissions&#34;&gt;Google Cloud Storage permissions&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-permissions">Google Cloud Storage permissions&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><item><title>Amazon S3 permissions</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/s3/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/s3/</guid><content><![CDATA[&lt;h1 id=&#34;amazon-s3-permissions&#34;&gt;Amazon S3 permissions&lt;/h1&gt;
&lt;p&gt;For configuration options, refer to the storage section on the &lt;a href=&#34;../#storage&#34;&gt;configuration&lt;/a&gt; page.&lt;/p&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://github.com/minio/mc/blob/master/docs/minio-client-configuration-files.md&#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;/ul&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;h2 id=&#34;lifecycle-policy&#34;&gt;Lifecycle policy&lt;/h2&gt;
&lt;p&gt;A lifecycle policy is recommended that deletes incomplete multipart uploads after one day.&lt;/p&gt;
]]></content><description>&lt;h1 id="amazon-s3-permissions">Amazon S3 permissions&lt;/h1>
&lt;p>For configuration options, refer to the storage section on the &lt;a href="../#storage">configuration&lt;/a> page.&lt;/p>
&lt;p>The following authentication methods are supported:&lt;/p>
&lt;ul>
&lt;li>AWS environment variables &lt;code>AWS_ACCESS_KEY_ID&lt;/code> and &lt;code>AWS_SECRET_ACCESS_KEY&lt;/code>&lt;/li>
&lt;li>Static access key and secret credentials specified in &lt;code>access_key&lt;/code> and &lt;code>secret_key&lt;/code>&lt;/li>
&lt;li>MinIO environment variables &lt;code>MINIO_ACCESS_KEY&lt;/code> and &lt;code>MINIO_SECRET_KEY&lt;/code>&lt;/li>
&lt;li>AWS shared credentials &lt;a href="https://docs.aws.amazon.com/ses/latest/DeveloperGuide/create-shared-credentials-file.html" target="_blank" rel="noopener noreferrer">configuration file&lt;/a>&lt;/li>
&lt;li>MinIO client credentials &lt;a href="https://github.com/minio/mc/blob/master/docs/minio-client-configuration-files.md" target="_blank" rel="noopener noreferrer">configuration file&lt;/a>&lt;/li>
&lt;li>AWS IAM (&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html" target="_blank" rel="noopener noreferrer">IRSA via WebIdentity&lt;/a>,&lt;/li>
&lt;li>AWS &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html" target="_blank" rel="noopener noreferrer">EC2 instance role&lt;/a>)&lt;/li>
&lt;/ul>
&lt;p>The following IAM policy shows minimal permissions required by Tempo, where the bucket has already been created.&lt;/p></description></item><item><title>Azure blob storage permissions and management</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/azure/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/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 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; can be 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; either system or user assigned. To use Azure Managed Identities, you&amp;rsquo;ll 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;For a system-assigned managed identity, no additional configuration is required.&lt;/li&gt;
&lt;li&gt;For a user-assigned managed identity, you&amp;rsquo;ll need 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&amp;rsquo;ll need to enable Azure Workload Identity on your cluster, add the required label and annotation to the service account and the required pod label.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;azure-blocklist-polling&#34;&gt;Azure blocklist polling&lt;/h2&gt;
&lt;p&gt;If you are hosting Tempo on Azure, two values may need to be updated to ensure consistent successful blocklist polling. If you are
experiencing &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;, we recommend to set &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;. Discussion &lt;a href=&#34;https://github.com/grafana/tempo/issues/1462&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;.&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;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 config may look something like:&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;  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;h2 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;/h2&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 requires the following configuration to authenticate to and access Azure blob storage:&lt;/p>
&lt;ul>
&lt;li>Storage Account name specified in the configuration file as &lt;code>storage_account_name&lt;/code> or in the environment variable &lt;code>AZURE_STORAGE_ACCOUNT&lt;/code>&lt;/li>
&lt;li>Credentials for accessing the Storage Account; can be one of the following
&lt;ul>
&lt;li>Storage Account access key specified in the configuration file as &lt;code>storage_account_key&lt;/code> or in the environment variable &lt;code>AZURE_STORAGE_KEY&lt;/code>&lt;/li>
&lt;li>An Azure Managed Identity; either system or user assigned. To use Azure Managed Identities, you&amp;rsquo;ll need to set &lt;code>use_managed_identity&lt;/code> to &lt;code>true&lt;/code> in the configuration file or set &lt;code>user_assigned_id&lt;/code> to the client ID for the managed identity you&amp;rsquo;d like to use.
&lt;ul>
&lt;li>For a system-assigned managed identity, no additional configuration is required.&lt;/li>
&lt;li>For a user-assigned managed identity, you&amp;rsquo;ll need to set &lt;code>user_assigned_id&lt;/code> to the client ID for the managed identity in the configuration file.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Via Azure Workload Identity. To use Azure Workload Identity, you&amp;rsquo;ll need to enable Azure Workload Identity on your cluster, add the required label and annotation to the service account and the required pod label.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="azure-blocklist-polling">Azure blocklist polling&lt;/h2>
&lt;p>If you are hosting Tempo on Azure, two values may need to be updated to ensure consistent successful blocklist polling. If you are
experiencing &lt;a href="https://stackoverflow.com/questions/12917857/the-specified-block-list-is-invalid-while-uploading-blobs-in-parallel/55902744#55902744" target="_blank" rel="noopener noreferrer">this issue&lt;/a>, we recommend to set &lt;code>blocklist_poll_tenant_index_builders&lt;/code> to 1.&lt;/p></description></item><item><title>Configure TLS communication</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/tls/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/tls/</guid><content><![CDATA[&lt;h1 id=&#34;configure-tls-communication&#34;&gt;Configure TLS communication&lt;/h1&gt;
&lt;p&gt;Tempo can be configured to communicate between the components using Transport Layer Security, or TLS.&lt;/p&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 ciphers and TLS version here are for example purposes only. We are not recommending which ciphers or TLS versions for use in production environments.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;server-configuration&#34;&gt;Server configuration&lt;/h2&gt;
&lt;p&gt;This sample TLS server configuration shows supported options.&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;server:
  tls_cipher_suites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  tls_min_version: VersionTLS12

  grpc_tls_config:
    cert_file: /tls/tls.crt
    key_file: /tls/tls.key
    client_auth_type: VerifyClientCertIfGiven
    client_ca_file: /tls/ca.crt
  http_tls_config:
    cert_file: /tls/tls.crt
    key_file: /tls/tls.key
    client_auth_type: VerifyClientCertIfGiven
    client_ca_file: /tls/ca.crt&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Valid values for the &lt;code&gt;client_auth_type&lt;/code&gt; are documented in the standard &lt;code&gt;crypt/tls&lt;/code&gt; package under &lt;code&gt;ClientAuthType&lt;/code&gt; &lt;a href=&#34;https://pkg.go.dev/crypto/tls#ClientAuthType&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;client-configuration&#34;&gt;Client configuration&lt;/h2&gt;
&lt;p&gt;Several components of Tempo need to configure the gRPC clients they use to communicate with other components. For example, when the &lt;code&gt;querier&lt;/code&gt; contacts the &lt;code&gt;query-frontend&lt;/code&gt; to request work, the client in use must enable TLS if the server is serving a TLS endpoint.&lt;/p&gt;
&lt;p&gt;The Tempo configuration uses a standard configuration stanza for each of these client configurations. Below is an example of the configuration.&lt;/p&gt;
&lt;p&gt;The optional configuration elements &lt;code&gt;tls_min_version&lt;/code&gt;, &lt;code&gt;tls_cipher_suites&lt;/code&gt;, and &lt;code&gt;tls_insecure_skip_verify&lt;/code&gt; may be omitted. The option &lt;code&gt;tls_server_name&lt;/code&gt; may or may not be required, depending on the environment.&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;grpc_client_config:
  tls_enabled: true
  tls_cert_path: /tls/tls.crt
  tls_key_path: /tls/tls.key
  tls_ca_path: /tls/ca.crt
  tls_server_name: tempo.trace.svc.cluster.local
  tls_insecure_skip_verify: false
  tls_cipher_suites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  tls_min_version: VersionTLS12&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The configuration block needs to be set at the following configuration locations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ingester_client.grpc_client_config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;metrics_generator_client.grpc_client_config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;querier.query-frontend.grpc_client_config&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, &lt;code&gt;memberlist&lt;/code&gt; must also be configured, but the client configuration is nested directly under &lt;code&gt;memberlist&lt;/code&gt; as follows. The same configuration options are available as above.&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;memberlist:
    tls_enabled: true
    tls_cert_path: /tls/tls.crt
    tls_key_path: /tls/tls.key
    tls_ca_path: /tls/ca.crt
    tls_server_name: tempo.trace.svc.cluster.local
    tls_insecure_skip_verify: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;receiver-tls&#34;&gt;Receiver TLS&lt;/h3&gt;
&lt;p&gt;Additional receiver configuration can be added to support TLS communication for traces being sent to Tempo. The receiver configuration is pulled in from the Open Telemetry collector, and is &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/otlpreceiver/config.md#configtls-tlsserversetting&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;documented upstream here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;An example &lt;code&gt;tls&lt;/code&gt; block might look like the following:&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;tls:
  ca_file: /tls/ca.crt
  cert_file: /tls/tls.crt
  key_file: /tls/tls.key
  min_version: VersionTLS12&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The above structure can be set on the following receiver configurations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;distributor.receivers.otlp.protocols.grpc.tls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distributor.receivers.otlp.protocols.http.tls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distributor.receivers.zipkin.tls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distributor.receivers.jaeger.protocols.grpc.tls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distributor.receivers.jaeger.protocols.thrift_http.tls&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="configure-tls-communication">Configure TLS communication&lt;/h1>
&lt;p>Tempo can be configured to communicate between the components using Transport Layer Security, or TLS.&lt;/p>
&lt;div class="admonition admonition-note">&lt;blockquote>&lt;p class="title text-uppercase">Note&lt;/p>&lt;p>The ciphers and TLS version here are for example purposes only. We are not recommending which ciphers or TLS versions for use in production environments.&lt;/p></description></item><item><title>Run Tempo Distributed with sidecar proxies</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/sidecar-proxy/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/sidecar-proxy/</guid><content><![CDATA[&lt;h1 id=&#34;run-tempo-distributed-with-sidecar-proxies&#34;&gt;Run Tempo Distributed with sidecar proxies&lt;/h1&gt;
&lt;p&gt;You can route inter-pod gRPC traffic run through a sidecar proxy to meet requirements such as custom security, routing, or logging.  Common examples include Envoy, Nginx, Traefik, or service meshes like Istio and Linkerd.&lt;/p&gt;
&lt;h2 id=&#34;how-tempo-pods-communicate&#34;&gt;How Tempo pods communicate&lt;/h2&gt;
&lt;p&gt;Tempo pods communicate using gRPC.&lt;/p&gt;
&lt;p&gt;The different components like distributors and ingesters find each other by a shared ring with the list of pods, their roles, and their addresses.
Pods advertise their address and listening port into the ring when they start, and deregister themselves when they exit.&lt;/p&gt;
&lt;p&gt;The overall network looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/tempo/sidecar-proxy/tempo-network-sidecar-proxy-simple.svg&#34;
  alt=&#34;Tempo distributed network overview&#34;/&gt;&lt;/p&gt;
&lt;p&gt;The low-level ring data for ingesters can be viewed by browsing to the &lt;code&gt;/ingester/ring&lt;/code&gt; URL on a distributor.  It looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/tempo/sidecar-proxy/screenshot-tempo-sidecar.png&#34;
  alt=&#34;Ring status with default port&#34; width=&#34;722&#34;
     height=&#34;298&#34;/&gt;&lt;/p&gt;
&lt;p&gt;By default, gRPC traffic uses port 9095, but this can be changed by customizing the &lt;code&gt;grpc_listen_port&lt;/code&gt; for each pod that needs it.&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;server:
  grpc_listen_port: 12345&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The ring contents reflect the new port:&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/tempo/sidecar-proxy/screenshot-tempo-sidecar-proxies.png&#34;
  alt=&#34;Ring status with updated ports&#34; width=&#34;723&#34;
     height=&#34;310&#34;/&gt;&lt;/p&gt;
&lt;h2 id=&#34;run-tempo-with-proxies&#34;&gt;Run Tempo with proxies&lt;/h2&gt;
&lt;p&gt;Some installations require that the inter-pod gRPC traffic runs through a sidecar proxy.
Running Tempo with proxies requires setting two ports for each pod: one for the Tempo process and one for the sidecar.
Additionally, the ring contents must reflect the proxy&amp;rsquo;s port so that traffic from other pods goes through the proxy.&lt;/p&gt;
&lt;p&gt;The overall network looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/tempo/sidecar-proxy/tempo-network-sidecar-proxy-complex.svg&#34;
  alt=&#34;Tempo distributed network overview&#34;/&gt;&lt;/p&gt;
&lt;p&gt;This cannot be accomplished by setting the same &lt;code&gt;grpc_listen_port&lt;/code&gt; as in the previous example. Instead, we need the ingester to &lt;em&gt;listen&lt;/em&gt; on port A but &lt;em&gt;advertise&lt;/em&gt; itself on port B. This is done by customizing the ingester&amp;rsquo;s lifecycler port:&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;ingester:
   lifecycler:
       port: 12345&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now, the ingester is listening for regular traffic on port 9095, but the distributor will route traffic to it on port 12345.&lt;/p&gt;
&lt;h2 id=&#34;metrics-generator-proxy&#34;&gt;Metrics-generator proxy&lt;/h2&gt;
&lt;p&gt;You can customize the lifecyler port in the metrics-generator. To set an instance port for the metrics-generator, use this configuration:&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;metrics_generator:
  ring:
    instance_port: 12345&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;12345&lt;/code&gt; with the correct port number.&lt;/p&gt;
]]></content><description>&lt;h1 id="run-tempo-distributed-with-sidecar-proxies">Run Tempo Distributed with sidecar proxies&lt;/h1>
&lt;p>You can route inter-pod gRPC traffic run through a sidecar proxy to meet requirements such as custom security, routing, or logging. Common examples include Envoy, Nginx, Traefik, or service meshes like Istio and Linkerd.&lt;/p></description></item><item><title>Configure IPv6</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/ipv6/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/ipv6/</guid><content><![CDATA[&lt;h1 id=&#34;configure-ipv6&#34;&gt;Configure IPv6&lt;/h1&gt;
&lt;p&gt;Tempo can be configured to communicate between the components using Internet Protocol Version 6, or IPv6.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: In order to support this support this configuration, the underlying infrastructure must support this address family. This configuration may be used in a single-stack IPv6 environment, or in a dual-stack environment where both IPv6 and IPv4 are present. In a dual-stack scenario, only one address family may be configured at a time, and all components must be configured for that address family.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;protocol-configuration&#34;&gt;Protocol configuration&lt;/h2&gt;
&lt;p&gt;This sample listen configuration will allow the gRPC and HTTP servers to listen on IPv6, and configure the various memberlist components to enable IPv6.&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;memberlist:
  bind_addr:
    - &amp;#39;::&amp;#39;
  bind_port: 7946

compactor:
  ring:
    kvstore:
      store: memberlist
    enable_inet6: true

metrics_generator:
  ring:
    enable_inet6: true

ingester:
  lifecycler:
    address: &amp;#39;::&amp;#39;
    enable_inet6: true

server:
  grpc_listen_address: &amp;#39;[::0]&amp;#39;
  grpc_listen_port: 9095
  http_listen_address: &amp;#39;[::0]&amp;#39;
  http_listen_port: 3200&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;kubernetes-service-configuration&#34;&gt;Kubernetes service configuration&lt;/h2&gt;
&lt;p&gt;Each service fronting the workloads will need to be configured with with &lt;code&gt;spec.ipFamilies&lt;/code&gt; and &lt;code&gt;spec.ipFamilyPolicy&lt;/code&gt; set. See this &lt;code&gt;compactor&lt;/code&gt; 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;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;apiVersion: v1
kind: Service
metadata:
  labels:
    name: compactor
  name: compactor
  namespace: trace
spec:
  clusterIP: fccb::31a7
  clusterIPs:
    - fccb::31a7
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv6
  ipFamilyPolicy: SingleStack
  ports:
    - name: compactor-http-metrics
      port: 3200
      protocol: TCP
      targetPort: 3200
  selector:
    app: compactor
    name: compactor
  sessionAffinity: None
  type: ClusterIP&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can check the listening service from within a pod.&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;sh&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-sh&#34;&gt;❯ k exec -it compactor-55c778b8d9-2kch2 -- sh
/ # apk add iproute2
OK: 12 MiB in 27 packages
/ # ss -ltn -f inet
State   Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  Process
/ # ss -ltn -f inet6
State    Recv-Q   Send-Q     Local Address:Port     Peer Address:Port  Process
LISTEN   0        4096                   *:7946                *:*
LISTEN   0        4096                   *:9095                *:*
LISTEN   0        4096                   *:3200                *:*&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="configure-ipv6">Configure IPv6&lt;/h1>
&lt;p>Tempo can be configured to communicate between the components using Internet Protocol Version 6, or IPv6.&lt;/p>
&lt;blockquote>
&lt;p>Note: In order to support this support this configuration, the underlying infrastructure must support this address family. This configuration may be used in a single-stack IPv6 environment, or in a dual-stack environment where both IPv6 and IPv4 are present. In a dual-stack scenario, only one address family may be configured at a time, and all components must be configured for that address family.&lt;/p></description></item><item><title>Query Tempo with Grafana</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/querying/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/querying/</guid><content><![CDATA[&lt;!-- Page is being deprecated because it describes versions of Grafana that are no longer supported. --&gt;
&lt;h1 id=&#34;query-tempo-with-grafana&#34;&gt;Query Tempo with Grafana&lt;/h1&gt;
&lt;p&gt;Grafana can query Tempo directly. This feature has been enabled since Grafana 7.5.x.&lt;/p&gt;
&lt;p&gt;Grafana Cloud comes pre-configured with a Tempo data source.&lt;/p&gt;
&lt;p&gt;If you are using Grafana on-prem, you need to &lt;a href=&#34;/docs/grafana/latest/datasources/tempo/&#34;&gt;set up the Tempo data source&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;configure-the-data-source&#34;&gt;Configure the data source&lt;/h2&gt;
&lt;p&gt;To query Tempo with Grafana:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Point the Grafana data source at your Tempo query frontend (or monolithic mode Tempo).&lt;/li&gt;
&lt;li&gt;Enter the URL: &lt;code&gt;http://&amp;lt;tempo hostname&amp;gt;:&amp;lt;http port number&amp;gt;&lt;/code&gt;. For most of &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;our examples&lt;/a&gt; the following works.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The port of 3200 is a common port used in our examples. Tempo default HTTP port is 80.&lt;/p&gt;
&lt;p&gt;Prior to Grafana 7.5.x, Grafana was not able to query Tempo directly and required an intermediary, Tempoo-Query.
This &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/grafana7.4&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;the Grafana 7.4.x example&lt;/a&gt; to explains  configuration. The url entered will be &lt;code&gt;http://&amp;lt;tempo-query hostname&amp;gt;:16686/&lt;/code&gt;.&lt;/p&gt;
]]></content><description>&lt;!-- Page is being deprecated because it describes versions of Grafana that are no longer supported. -->
&lt;h1 id="query-tempo-with-grafana">Query Tempo with Grafana&lt;/h1>
&lt;p>Grafana can query Tempo directly. This feature has been enabled since Grafana 7.5.x.&lt;/p></description></item><item><title>Compression and encoding</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/compression/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/compression/</guid><content><![CDATA[&lt;!-- Page needs to be updated. --&gt;
&lt;h1 id=&#34;compression-and-encoding&#34;&gt;Compression and encoding&lt;/h1&gt;
&lt;p&gt;Tempo can compress traces that it pushes to backend storage. This requires extra
memory and CPU, but it reduces the quantity of stored data.
Anecdotal tests suggest that &lt;code&gt;zstd&lt;/code&gt; will cut your storage costs to ~15% of the uncompressed amount.
It is &lt;em&gt;highly&lt;/em&gt; recommended to use the default &lt;code&gt;zstd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Compression is configured under storage like so:&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:
    block:
      v2_encoding: zstd&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following options are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;none&lt;/li&gt;
&lt;li&gt;gzip&lt;/li&gt;
&lt;li&gt;lz4-64k&lt;/li&gt;
&lt;li&gt;lz4-256k&lt;/li&gt;
&lt;li&gt;lz4-1M&lt;/li&gt;
&lt;li&gt;lz4&lt;/li&gt;
&lt;li&gt;snappy&lt;/li&gt;
&lt;li&gt;zstd&lt;/li&gt;
&lt;li&gt;s2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although all of these compression formats are supported in Tempo, at Grafana
we use &lt;code&gt;zstd&lt;/code&gt;. It&amp;rsquo;s possible/probable that the other compression algorithms may have issue at scale.
File an issue if you have any problems.&lt;/p&gt;
&lt;h2 id=&#34;wal&#34;&gt;WAL&lt;/h2&gt;
&lt;p&gt;The WAL also supports compression. By default, this is configured to use &lt;code&gt;snappy&lt;/code&gt;. This comes with a small performance
penalty but reduces disk I/O and and adds checksums to the WAL. All of the above configuration options are supported
but only &lt;code&gt;snappy&lt;/code&gt; has been tested at scale.&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;storage:
  trace:
    wal:
      v2_encoding: snappy&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;!-- Page needs to be updated. -->
&lt;h1 id="compression-and-encoding">Compression and encoding&lt;/h1>
&lt;p>Tempo can compress traces that it pushes to backend storage. This requires extra
memory and CPU, but it reduces the quantity of stored data.
Anecdotal tests suggest that &lt;code>zstd&lt;/code> will cut your storage costs to ~15% of the uncompressed amount.
It is &lt;em>highly&lt;/em> recommended to use the default &lt;code>zstd&lt;/code>.&lt;/p></description></item><item><title>Manifest</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/manifest/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/manifest/</guid><content><![CDATA[&lt;h1 id=&#34;manifest&#34;&gt;Manifest&lt;/h1&gt;
&lt;p&gt;This document is a reference for all Tempo options and their defaults. If you are just getting
started with Tempo, refer to &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo examples&lt;/a&gt;
and other &lt;a href=&#34;../&#34;&gt;configuration documentation&lt;/a&gt;. Most installations will require only setting 10 to 20 of these options.&lt;/p&gt;
&lt;p&gt;It was generated by running Tempo with a minimal configuration and accessing the &lt;code&gt;/status/config&lt;/code&gt; endpoint:&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;go run ./cmd/tempo --storage.trace.backend=local --storage.trace.local.path=/tmp/tempo/traces --storage.trace.wal.path=/tmp/tempo/wal&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;complete-configuration&#34;&gt;Complete configuration&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;This manifest was generated on 2023-06-01.&lt;/p&gt;&lt;/blockquote&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;target: all
http_api_prefix: &amp;#34;&amp;#34;
server:
    http_listen_network: tcp
    http_listen_address: &amp;#34;&amp;#34;
    http_listen_port: 80
    http_listen_conn_limit: 0
    grpc_listen_network: tcp
    grpc_listen_address: &amp;#34;&amp;#34;
    grpc_listen_port: 9095
    grpc_listen_conn_limit: 0
    tls_cipher_suites: &amp;#34;&amp;#34;
    tls_min_version: &amp;#34;&amp;#34;
    http_tls_config:
        cert: &amp;#34;&amp;#34;
        key: null
        client_ca: &amp;#34;&amp;#34;
        cert_file: &amp;#34;&amp;#34;
        key_file: &amp;#34;&amp;#34;
        client_auth_type: &amp;#34;&amp;#34;
        client_ca_file: &amp;#34;&amp;#34;
    grpc_tls_config:
        cert: &amp;#34;&amp;#34;
        key: null
        client_ca: &amp;#34;&amp;#34;
        cert_file: &amp;#34;&amp;#34;
        key_file: &amp;#34;&amp;#34;
        client_auth_type: &amp;#34;&amp;#34;
        client_ca_file: &amp;#34;&amp;#34;
    register_instrumentation: true
    graceful_shutdown_timeout: 30s
    http_server_read_timeout: 30s
    http_server_write_timeout: 30s
    http_server_idle_timeout: 2m0s
    grpc_server_max_recv_msg_size: 16777216
    grpc_server_max_send_msg_size: 16777216
    grpc_server_max_concurrent_streams: 100
    grpc_server_max_connection_idle: 2562047h47m16.854775807s
    grpc_server_max_connection_age: 2562047h47m16.854775807s
    grpc_server_max_connection_age_grace: 2562047h47m16.854775807s
    grpc_server_keepalive_time: 2h0m0s
    grpc_server_keepalive_timeout: 20s
    grpc_server_min_time_between_pings: 10s
    grpc_server_ping_without_stream_allowed: true
    log_format: logfmt
    log_level: info
    log_source_ips_enabled: false
    log_source_ips_header: &amp;#34;&amp;#34;
    log_source_ips_regex: &amp;#34;&amp;#34;
    log_request_headers: false
    log_request_at_info_level_enabled: false
    log_request_exclude_headers_list: &amp;#34;&amp;#34;
    http_path_prefix: &amp;#34;&amp;#34;
internal_server:
    http_listen_network: tcp
    http_listen_address: localhost
    http_listen_port: 3101
    http_listen_conn_limit: 0
    grpc_listen_network: &amp;#34;&amp;#34;
    grpc_listen_address: &amp;#34;&amp;#34;
    grpc_listen_port: 0
    grpc_listen_conn_limit: 0
    tls_cipher_suites: &amp;#34;&amp;#34;
    tls_min_version: &amp;#34;&amp;#34;
    http_tls_config:
        cert: &amp;#34;&amp;#34;
        key: null
        client_ca: &amp;#34;&amp;#34;
        cert_file: &amp;#34;&amp;#34;
        key_file: &amp;#34;&amp;#34;
        client_auth_type: &amp;#34;&amp;#34;
        client_ca_file: &amp;#34;&amp;#34;
    grpc_tls_config:
        cert: &amp;#34;&amp;#34;
        key: null
        client_ca: &amp;#34;&amp;#34;
        cert_file: &amp;#34;&amp;#34;
        key_file: &amp;#34;&amp;#34;
        client_auth_type: &amp;#34;&amp;#34;
        client_ca_file: &amp;#34;&amp;#34;
    register_instrumentation: false
    graceful_shutdown_timeout: 30s
    http_server_read_timeout: 30s
    http_server_write_timeout: 30s
    http_server_idle_timeout: 2m0s
    grpc_server_max_recv_msg_size: 0
    grpc_server_max_send_msg_size: 0
    grpc_server_max_concurrent_streams: 0
    grpc_server_max_connection_idle: 0s
    grpc_server_max_connection_age: 0s
    grpc_server_max_connection_age_grace: 0s
    grpc_server_keepalive_time: 0s
    grpc_server_keepalive_timeout: 0s
    grpc_server_min_time_between_pings: 0s
    grpc_server_ping_without_stream_allowed: false
    log_format: &amp;#34;&amp;#34;
    log_level: &amp;#34;&amp;#34;
    log_source_ips_enabled: false
    log_source_ips_header: &amp;#34;&amp;#34;
    log_source_ips_regex: &amp;#34;&amp;#34;
    log_request_headers: false
    log_request_at_info_level_enabled: false
    log_request_exclude_headers_list: &amp;#34;&amp;#34;
    http_path_prefix: &amp;#34;&amp;#34;
    enable: false
distributor:
    ring:
        kvstore:
            store: memberlist
            prefix: collectors/
            consul:
                host: localhost:8500
                acl_token: &amp;#34;&amp;#34;
                http_client_timeout: 20s
                consistent_reads: false
                watch_rate_limit: 1
                watch_burst_size: 1
                cas_retry_delay: 1s
            etcd:
                endpoints: []
                dial_timeout: 10s
                max_retries: 10
                tls_enabled: false
                tls_cert_path: &amp;#34;&amp;#34;
                tls_key_path: &amp;#34;&amp;#34;
                tls_ca_path: &amp;#34;&amp;#34;
                tls_server_name: &amp;#34;&amp;#34;
                tls_insecure_skip_verify: false
                tls_cipher_suites: &amp;#34;&amp;#34;
                tls_min_version: &amp;#34;&amp;#34;
                username: &amp;#34;&amp;#34;
                password: &amp;#34;&amp;#34;
            multi:
                primary: &amp;#34;&amp;#34;
                secondary: &amp;#34;&amp;#34;
                mirror_enabled: false
                mirror_timeout: 2s
        heartbeat_period: 5s
        heartbeat_timeout: 5m0s
        instance_id: local-instance
        instance_interface_names:
            - eth0
            - en0
        instance_port: 0
        instance_addr: &amp;#34;&amp;#34;
    receivers: {}
    override_ring_key: distributor
    log_received_traces: false
    forwarders: []
    extend_writes: true
ingester_client:
    pool_config:
        checkinterval: 15s
        healthcheckenabled: true
        healthchecktimeout: 1s
        maxconcurrenthealthchecks: 0
    remote_timeout: 5s
    grpc_client_config:
        max_recv_msg_size: 104857600
        max_send_msg_size: 104857600
        grpc_compression: snappy
        rate_limit: 0
        rate_limit_burst: 0
        backoff_on_ratelimits: false
        backoff_config:
            min_period: 100ms
            max_period: 10s
            max_retries: 10
        initial_stream_window_size: 63KiB1023B
        initial_connection_window_size: 63KiB1023B
        tls_enabled: false
        tls_cert_path: &amp;#34;&amp;#34;
        tls_key_path: &amp;#34;&amp;#34;
        tls_ca_path: &amp;#34;&amp;#34;
        tls_server_name: &amp;#34;&amp;#34;
        tls_insecure_skip_verify: false
        tls_cipher_suites: &amp;#34;&amp;#34;
        tls_min_version: &amp;#34;&amp;#34;
        connect_timeout: 5s
        connect_backoff_base_delay: 1s
        connect_backoff_max_delay: 5s
metrics_generator_client:
    pool_config:
        checkinterval: 15s
        healthcheckenabled: true
        healthchecktimeout: 1s
        maxconcurrenthealthchecks: 0
    remote_timeout: 5s
    grpc_client_config:
        max_recv_msg_size: 104857600
        max_send_msg_size: 104857600
        grpc_compression: snappy
        rate_limit: 0
        rate_limit_burst: 0
        backoff_on_ratelimits: false
        backoff_config:
            min_period: 100ms
            max_period: 10s
            max_retries: 10
        initial_stream_window_size: 63KiB1023B
        initial_connection_window_size: 63KiB1023B
        tls_enabled: false
        tls_cert_path: &amp;#34;&amp;#34;
        tls_key_path: &amp;#34;&amp;#34;
        tls_ca_path: &amp;#34;&amp;#34;
        tls_server_name: &amp;#34;&amp;#34;
        tls_insecure_skip_verify: false
        tls_cipher_suites: &amp;#34;&amp;#34;
        tls_min_version: &amp;#34;&amp;#34;
        connect_timeout: 5s
        connect_backoff_base_delay: 1s
        connect_backoff_max_delay: 5s
querier:
    search:
        query_timeout: 30s
        prefer_self: 10
        external_hedge_requests_at: 8s
        external_hedge_requests_up_to: 2
        external_backend: &amp;#34;&amp;#34;
        google_cloud_run: null
        external_endpoints: []
    trace_by_id:
        query_timeout: 10s
    max_concurrent_queries: 20
    frontend_worker:
        frontend_address: 127.0.0.1:9095
        dns_lookup_duration: 10s
        parallelism: 2
        match_max_concurrent: true
        id: &amp;#34;&amp;#34;
        grpc_client_config:
            max_recv_msg_size: 104857600
            max_send_msg_size: 16777216
            grpc_compression: gzip
            rate_limit: 0
            rate_limit_burst: 0
            backoff_on_ratelimits: false
            backoff_config:
                min_period: 100ms
                max_period: 1s
                max_retries: 5
            initial_stream_window_size: 0B
            initial_connection_window_size: 0B
            tls_enabled: false
            tls_cert_path: &amp;#34;&amp;#34;
            tls_key_path: &amp;#34;&amp;#34;
            tls_ca_path: &amp;#34;&amp;#34;
            tls_server_name: &amp;#34;&amp;#34;
            tls_insecure_skip_verify: false
            tls_cipher_suites: &amp;#34;&amp;#34;
            tls_min_version: &amp;#34;&amp;#34;
            connect_timeout: 0s
            connect_backoff_base_delay: 0s
            connect_backoff_max_delay: 0s
    query_relevant_ingesters: false
query_frontend:
    max_outstanding_per_tenant: 2000
    querier_forget_delay: 0s
    max_batch_size: 5
    max_retries: 2
    search:
        concurrent_jobs: 1000
        target_bytes_per_job: 104857600
        default_result_limit: 20
        max_result_limit: 0
        max_duration: 168h0m0s
        query_backend_after: 15m0s
        query_ingesters_until: 30m0s
    trace_by_id:
        query_shards: 50
        hedge_requests_at: 2s
        hedge_requests_up_to: 2
compactor:
    ring:
        kvstore:
            store: &amp;#34;&amp;#34;
            prefix: collectors/
            consul:
                host: localhost:8500
                acl_token: &amp;#34;&amp;#34;
                http_client_timeout: 20s
                consistent_reads: false
                watch_rate_limit: 1
                watch_burst_size: 1
                cas_retry_delay: 1s
            etcd:
                endpoints: []
                dial_timeout: 10s
                max_retries: 10
                tls_enabled: false
                tls_cert_path: &amp;#34;&amp;#34;
                tls_key_path: &amp;#34;&amp;#34;
                tls_ca_path: &amp;#34;&amp;#34;
                tls_server_name: &amp;#34;&amp;#34;
                tls_insecure_skip_verify: false
                tls_cipher_suites: &amp;#34;&amp;#34;
                tls_min_version: &amp;#34;&amp;#34;
                username: &amp;#34;&amp;#34;
                password: &amp;#34;&amp;#34;
            multi:
                primary: &amp;#34;&amp;#34;
                secondary: &amp;#34;&amp;#34;
                mirror_enabled: false
                mirror_timeout: 2s
        heartbeat_period: 5s
        heartbeat_timeout: 1m0s
        wait_stability_min_duration: 1m0s
        wait_stability_max_duration: 5m0s
        instance_id: local-instance
        instance_interface_names:
            - eth0
            - en0
        instance_port: 0
        instance_addr: &amp;#34;&amp;#34;
        enable_inet6: false
        wait_active_instance_timeout: 10m0s
    compaction:
        v2_in_buffer_bytes: 5242880
        v2_out_buffer_bytes: 20971520
        v2_prefetch_traces_count: 1000
        compaction_window: 1h0m0s
        max_compaction_objects: 6000000
        max_block_bytes: 107374182400
        block_retention: 336h0m0s
        compacted_block_retention: 1h0m0s
        retention_concurrency: 10
        max_time_per_tenant: 5m0s
        compaction_cycle: 30s
    override_ring_key: compactor
ingester:
    lifecycler:
        ring:
            kvstore:
                store: inmemory
                prefix: collectors/
                consul:
                    host: localhost:8500
                    acl_token: &amp;#34;&amp;#34;
                    http_client_timeout: 20s
                    consistent_reads: false
                    watch_rate_limit: 1
                    watch_burst_size: 1
                    cas_retry_delay: 1s
                etcd:
                    endpoints: []
                    dial_timeout: 10s
                    max_retries: 10
                    tls_enabled: false
                    tls_cert_path: &amp;#34;&amp;#34;
                    tls_key_path: &amp;#34;&amp;#34;
                    tls_ca_path: &amp;#34;&amp;#34;
                    tls_server_name: &amp;#34;&amp;#34;
                    tls_insecure_skip_verify: false
                    tls_cipher_suites: &amp;#34;&amp;#34;
                    tls_min_version: &amp;#34;&amp;#34;
                    username: &amp;#34;&amp;#34;
                    password: &amp;#34;&amp;#34;
                multi:
                    primary: &amp;#34;&amp;#34;
                    secondary: &amp;#34;&amp;#34;
                    mirror_enabled: false
                    mirror_timeout: 2s
            heartbeat_timeout: 5m0s
            replication_factor: 1
            zone_awareness_enabled: false
            excluded_zones: &amp;#34;&amp;#34;
        num_tokens: 128
        heartbeat_period: 5s
        heartbeat_timeout: 1m0s
        observe_period: 0s
        join_after: 0s
        min_ready_duration: 15s
        interface_names:
            - en0
        enable_inet6: false
        final_sleep: 0s
        tokens_file_path: &amp;#34;&amp;#34;
        availability_zone: &amp;#34;&amp;#34;
        unregister_on_shutdown: true
        readiness_check_ring_health: true
        address: 127.0.0.1
        port: 0
        id: local-instance
    concurrent_flushes: 4
    flush_check_period: 10s
    flush_op_timeout: 5m0s
    trace_idle_period: 10s
    max_block_duration: 30m0s
    max_block_bytes: 524288000
    complete_block_timeout: 15m0s
    override_ring_key: ring
metrics_generator:
    ring:
        kvstore:
            store: inmemory
            prefix: collectors/
            consul:
                host: localhost:8500
                acl_token: &amp;#34;&amp;#34;
                http_client_timeout: 20s
                consistent_reads: false
                watch_rate_limit: 1
                watch_burst_size: 1
                cas_retry_delay: 1s
            etcd:
                endpoints: []
                dial_timeout: 10s
                max_retries: 10
                tls_enabled: false
                tls_cert_path: &amp;#34;&amp;#34;
                tls_key_path: &amp;#34;&amp;#34;
                tls_ca_path: &amp;#34;&amp;#34;
                tls_server_name: &amp;#34;&amp;#34;
                tls_insecure_skip_verify: false
                tls_cipher_suites: &amp;#34;&amp;#34;
                tls_min_version: &amp;#34;&amp;#34;
                username: &amp;#34;&amp;#34;
                password: &amp;#34;&amp;#34;
            multi:
                primary: &amp;#34;&amp;#34;
                secondary: &amp;#34;&amp;#34;
                mirror_enabled: false
                mirror_timeout: 2s
        heartbeat_period: 5s
        heartbeat_timeout: 1m0s
        instance_id: local-instance
        instance_interface_names:
            - eth0
            - en0
        instance_addr: 127.0.0.1
        instance_port: 0
        enable_inet6: false
    processor:
        service_graphs:
            wait: 10s
            max_items: 10000
            workers: 10
            histogram_buckets:
                - 0.1
                - 0.2
                - 0.4
                - 0.8
                - 1.6
                - 3.2
                - 6.4
                - 12.8
            dimensions: []
            peer_attributes:
                - peer.service
                - db.name
                - db.system
            span_multiplier_key: &amp;#34;&amp;#34;
        span_metrics:
            histogram_buckets:
                - 0.002
                - 0.004
                - 0.008
                - 0.016
                - 0.032
                - 0.064
                - 0.128
                - 0.256
                - 0.512
                - 1.024
                - 2.048
                - 4.096
                - 8.192
                - 16.384
            intrinsic_dimensions:
                service: true
                span_name: true
                span_kind: true
                status_code: true
            dimensions: []
            dimension_mappings: []
            enable_target_info: false
            span_multiplier_key: &amp;#34;&amp;#34;
            subprocessors:
                0: true
                1: true
                2: true
            filter_policies: []
            target_info_excluded_dimensions: []
        local_blocks:
            block:
                bloom_filter_false_positive: 0.01
                bloom_filter_shard_size_bytes: 102400
                version: vParquet2
                search_encoding: snappy
                search_page_size_bytes: 1048576
                v2_index_downsample_bytes: 1048576
                v2_index_page_size_bytes: 256000
                v2_encoding: zstd
                parquet_row_group_size_bytes: 100000000
                parquet_dedicated_columns: []
            search:
                chunk_size_bytes: 1000000
                prefetch_trace_count: 1000
                read_buffer_count: 32
                read_buffer_size_bytes: 1048576
                cache_control:
                    footer: false
                    column_index: false
                    offset_index: false
            flush_check_period: 10s
            trace_idle_period: 10s
            max_block_duration: 1m0s
            max_block_bytes: 500000000
            complete_block_timeout: 1h0m0s
            max_live_traces: 0
    registry:
        collection_interval: 15s
        stale_duration: 15m0s
        max_label_name_length: 1024
        max_label_value_length: 2048
    storage:
        path: &amp;#34;&amp;#34;
        wal:
            wal_segment_size: 134217728
            wal_compression: false
            stripe_size: 16384
            truncate_frequency: 2h0m0s
            min_wal_time: 300000
            max_wal_time: 14400000
            no_lockfile: false
        remote_write_flush_deadline: 1m0s
    traces_storage:
        path: &amp;#34;&amp;#34;
        completedfilepath: &amp;#34;&amp;#34;
        blocksfilepath: &amp;#34;&amp;#34;
        v2_encoding: none
        search_encoding: none
        ingestion_time_range_slack: 0s
        version: vParquet2
    metrics_ingestion_time_range_slack: 30s
    query_timeout: 30s
storage:
    trace:
        pool:
            max_workers: 400
            queue_depth: 20000
        wal:
            path: /tmp/tempo/wal
            completedfilepath: /tmp/tempo/wal/completed
            blocksfilepath: /tmp/tempo/wal/blocks
            v2_encoding: snappy
            search_encoding: none
            ingestion_time_range_slack: 2m0s
            version: vParquet2
        block:
            bloom_filter_false_positive: 0.01
            bloom_filter_shard_size_bytes: 102400
            version: vParquet2
            search_encoding: snappy
            search_page_size_bytes: 1048576
            v2_index_downsample_bytes: 1048576
            v2_index_page_size_bytes: 256000
            v2_encoding: zstd
            parquet_row_group_size_bytes: 100000000
            parquet_dedicated_columns: []
        search:
            chunk_size_bytes: 1000000
            prefetch_trace_count: 1000
            read_buffer_count: 32
            read_buffer_size_bytes: 1048576
            cache_control:
                footer: false
                column_index: false
                offset_index: false
        blocklist_poll: 5m0s
        blocklist_poll_concurrency: 50
        blocklist_poll_fallback: true
        blocklist_poll_tenant_index_builders: 2
        blocklist_poll_stale_tenant_index: 0s
        blocklist_poll_jitter_ms: 0
        blocklist_poll_tolerate_consecutive_errors: 1
        backend: local
        local:
            path: /tmp/tempo/traces
        gcs:
            bucket_name: &amp;#34;&amp;#34;
            prefix: &amp;#34;&amp;#34;
            chunk_buffer_size: 10485760
            endpoint: &amp;#34;&amp;#34;
            hedge_requests_at: 0s
            hedge_requests_up_to: 2
            insecure: false
            object_cache_control: &amp;#34;&amp;#34;
            object_metadata: {}
        s3:
            tls_cert_path: &amp;#34;&amp;#34;
            tls_key_path: &amp;#34;&amp;#34;
            tls_ca_path: &amp;#34;&amp;#34;
            tls_server_name: &amp;#34;&amp;#34;
            tls_insecure_skip_verify: false
            tls_cipher_suites: &amp;#34;&amp;#34;
            tls_min_version: VersionTLS12
            bucket: &amp;#34;&amp;#34;
            prefix: &amp;#34;&amp;#34;
            endpoint: &amp;#34;&amp;#34;
            region: &amp;#34;&amp;#34;
            access_key: &amp;#34;&amp;#34;
            secret_key: &amp;#34;&amp;#34;
            session_token: &amp;#34;&amp;#34;
            insecure: false
            part_size: 0
            hedge_requests_at: 0s
            hedge_requests_up_to: 2
            signature_v2: false
            forcepathstyle: false
            bucket_lookup_type: 0
            tags: {}
            storage_class: &amp;#34;&amp;#34;
            metadata: {}
        azure:
            storage_account_name: &amp;#34;&amp;#34;
            storage_account_key: &amp;#34;&amp;#34;
            use_managed_identity: false
            use_federated_token: false
            user_assigned_id: &amp;#34;&amp;#34;
            container_name: &amp;#34;&amp;#34;
            prefix: &amp;#34;&amp;#34;
            endpoint_suffix: blob.core.windows.net
            max_buffers: 4
            buffer_size: 3145728
            hedge_requests_at: 0s
            hedge_requests_up_to: 2
        cache: &amp;#34;&amp;#34;
        cache_min_compaction_level: 0
        cache_max_block_age: 0s
        background_cache:
            writeback_goroutines: 10
            writeback_buffer: 10000
        memcached: null
        redis: null
overrides:
    ingestion_rate_strategy: local
    ingestion_rate_limit_bytes: 15000000
    ingestion_burst_size_bytes: 20000000
    max_traces_per_user: 10000
    max_global_traces_per_user: 0
    forwarders: []
    metrics_generator_ring_size: 0
    metrics_generator_processors: null
    metrics_generator_max_active_series: 0
    metrics_generator_collection_interval: 0s
    metrics_generator_disable_collection: false
    metrics_generator_forwarder_queue_size: 0
    metrics_generator_forwarder_workers: 0
    metrics_generator_processor_service_graphs_histogram_buckets: []
    metrics_generator_processor_service_graphs_dimensions: []
    metrics_generator_processor_service_graphs_peer_attributes: []
    metrics_generator_processor_span_metrics_histogram_buckets: []
    metrics_generator_processor_span_metrics_dimensions: []
    metrics_generator_processor_span_metrics_intrinsic_dimensions: {}
    metrics_generator_processor_span_metrics_filter_policies: []
    metrics_generator_processor_span_metrics_dimension_mappings: []
    metrics_generator_processor_span_metrics_enable_target_info: false
    metrics_generator_processor_span_metrics_target_info_excluded_dimensions: []
    metrics_generator_processor_local_blocks_max_live_traces: 0
    metrics_generator_processor_local_blocks_max_block_duration: 0s
    metrics_generator_processor_local_blocks_max_block_bytes: 0
    metrics_generator_processor_local_blocks_flush_check_period: 0s
    metrics_generator_processor_local_blocks_trace_idle_period: 0s
    metrics_generator_processor_local_blocks_complete_block_timeout: 0s
    block_retention: 0s
    max_bytes_per_tag_values_query: 5000000
    max_blocks_per_tag_values_query: 0
    max_search_duration: 0s
    max_bytes_per_trace: 5000000
    parquet_dedicated_columns: []
    per_tenant_override_config: &amp;#34;&amp;#34;
    per_tenant_override_period: 10s
    user_configurable_overrides:
        enabled: false
        poll_interval: 1m0s
        client:
            backend: &amp;#34;&amp;#34;
            confirm_versioning: true
            local:
                path: &amp;#34;&amp;#34;
            gcs:
                bucket_name: &amp;#34;&amp;#34;
                prefix: &amp;#34;&amp;#34;
                chunk_buffer_size: 0
                endpoint: &amp;#34;&amp;#34;
                hedge_requests_at: 0s
                hedge_requests_up_to: 0
                insecure: false
                object_cache_control: &amp;#34;&amp;#34;
                object_metadata: {}
            s3:
                tls_cert_path: &amp;#34;&amp;#34;
                tls_key_path: &amp;#34;&amp;#34;
                tls_ca_path: &amp;#34;&amp;#34;
                tls_server_name: &amp;#34;&amp;#34;
                tls_insecure_skip_verify: false
                tls_cipher_suites: &amp;#34;&amp;#34;
                tls_min_version: &amp;#34;&amp;#34;
                bucket: &amp;#34;&amp;#34;
                prefix: &amp;#34;&amp;#34;
                endpoint: &amp;#34;&amp;#34;
                region: &amp;#34;&amp;#34;
                access_key: &amp;#34;&amp;#34;
                secret_key: &amp;#34;&amp;#34;
                session_token: &amp;#34;&amp;#34;
                insecure: false
                part_size: 0
                hedge_requests_at: 0s
                hedge_requests_up_to: 0
                signature_v2: false
                forcepathstyle: false
                bucket_lookup_type: 0
                tags: {}
                storage_class: &amp;#34;&amp;#34;
                metadata: {}
            azure:
                storage_account_name: &amp;#34;&amp;#34;
                storage_account_key: &amp;#34;&amp;#34;
                use_managed_identity: false
                use_federated_token: false
                user_assigned_id: &amp;#34;&amp;#34;
                container_name: &amp;#34;&amp;#34;
                prefix: &amp;#34;&amp;#34;
                endpoint_suffix: &amp;#34;&amp;#34;
                max_buffers: 0
                buffer_size: 0
                hedge_requests_at: 0s
                hedge_requests_up_to: 0
memberlist:
    node_name: &amp;#34;&amp;#34;
    randomize_node_name: true
    stream_timeout: 10s
    retransmit_factor: 2
    pull_push_interval: 30s
    gossip_interval: 1s
    gossip_nodes: 2
    gossip_to_dead_nodes_time: 30s
    dead_node_reclaim_time: 0s
    compression_enabled: false
    advertise_addr: &amp;#34;&amp;#34;
    advertise_port: 7946
    cluster_label: &amp;#34;&amp;#34;
    cluster_label_verification_disabled: false
    join_members: []
    min_join_backoff: 1s
    max_join_backoff: 1m0s
    max_join_retries: 10
    abort_if_cluster_join_fails: false
    rejoin_interval: 0s
    left_ingesters_timeout: 5m0s
    leave_timeout: 20s
    message_history_buffer_bytes: 0
    bind_addr: []
    bind_port: 7946
    packet_dial_timeout: 2s
    packet_write_timeout: 5s
    tls_enabled: false
    tls_cert_path: &amp;#34;&amp;#34;
    tls_key_path: &amp;#34;&amp;#34;
    tls_ca_path: &amp;#34;&amp;#34;
    tls_server_name: &amp;#34;&amp;#34;
    tls_insecure_skip_verify: false
    tls_cipher_suites: &amp;#34;&amp;#34;
    tls_min_version: &amp;#34;&amp;#34;
usage_report:
    reporting_enabled: true
    backoff:
        min_period: 100ms
        max_period: 10s
        max_retries: 0&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="manifest">Manifest&lt;/h1>
&lt;p>This document is a reference for all Tempo options and their defaults. If you are just getting
started with Tempo, refer to &lt;a href="https://github.com/grafana/tempo/tree/main/example/docker-compose" target="_blank" rel="noopener noreferrer">Tempo examples&lt;/a>
and other &lt;a href="../">configuration documentation&lt;/a>. Most installations will require only setting 10 to 20 of these options.&lt;/p></description></item><item><title>Apache Parquet block format</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/parquet/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/parquet/</guid><content><![CDATA[&lt;h1 id=&#34;apache-parquet-block-format&#34;&gt;Apache Parquet block format&lt;/h1&gt;
&lt;p&gt;Tempo has a default columnar block format based on Apache Parquet. This format is required for tags-based search as well as &lt;a href=&#34;../../traceql/&#34;&gt;TraceQL&lt;/a&gt;, the query language for traces. The columnar block format improves search performance and enables a large ecosystem of tools to access the underlying trace data.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/blob/main/docs/design-proposals/2022-04%20Parquet.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Parquet design document&lt;/a&gt; and &lt;a href=&#34;https://github.com/grafana/tempo/issues/1480&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Issue 1480&lt;/a&gt;.
Additionally, there is now a &lt;a href=&#34;https://github.com/grafana/tempo/blob/main/docs/design-proposals/2023-05%20vParquet3.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Parquet v3 design document&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you install using the new Helm charts, then Parquet is enabled by default.&lt;/p&gt;
&lt;h2 id=&#34;considerations&#34;&gt;Considerations&lt;/h2&gt;
&lt;p&gt;The Parquet block format is enabled by default in Tempo 2.0. No data conversion or upgrade process is necessary. As soon as the format is enabled, Tempo starts writing data in that format, leaving existing data as-is.&lt;/p&gt;
&lt;p&gt;Block formats based on Parquet require more CPU and memory resources than the previous &lt;code&gt;v2&lt;/code&gt; format but provide search and TraceQL functionality.&lt;/p&gt;
&lt;h2 id=&#34;choose-a-different-block-format&#34;&gt;Choose a different block format&lt;/h2&gt;
&lt;p&gt;The default block format is &lt;code&gt;vParquet2&lt;/code&gt; which is the latest iteration of Tempo&amp;rsquo;s Parquet based columnar block format. It is still possible to use the previous format &lt;code&gt;vParquet&lt;/code&gt;. To enable it, set the block version option to &lt;code&gt;vParquet&lt;/code&gt; in the Storage section of the configuration 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;# block format version. options: v2, vParquet, vParquet2
[version: vParquet]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It is possible to disable Parquet and use the previous &lt;code&gt;v2&lt;/code&gt; block format. This disables all forms of search, but also reduces resource consumption, and may be desired for a high-throughput cluster that does not need these capabilities. Set the block version option to &lt;code&gt;v2&lt;/code&gt; in the Storage section of the configuration 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;# block format version. options: v2, vParquet, vParquet2
[version: v2]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To re-enable the default &lt;code&gt;vParquet2&lt;/code&gt; format, remove the block version option from the Storage section of the configuration file or set the option to &lt;code&gt;vParquet2&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;parquet-configuration-parameters&#34;&gt;Parquet configuration parameters&lt;/h2&gt;
&lt;p&gt;Some parameters in the Tempo configuration are specific to Parquet.
For more information, refer to the &lt;a href=&#34;../#storage&#34;&gt;storage configuration documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;trace-search-parameters&#34;&gt;Trace search parameters&lt;/h3&gt;
&lt;p&gt;These configuration options impact trace search.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Default value&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;[read_buffer_size_bytes: &amp;lt;int&amp;gt;]&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;10485676&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Size of read buffers used when performing search on a vParquet block. This value times the &lt;code&gt;read_buffer_count&lt;/code&gt;  is the total amount of bytes used for buffering when performing search on a Parquet block.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;[read_buffer_count: &amp;lt;int&amp;gt;]&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;32&lt;/td&gt;
              &lt;td&gt;Number of read buffers used when performing search on a vParquet block. This value times the &lt;code&gt;read_buffer_size_bytes&lt;/code&gt; is the total amount of bytes used for buffering when performing search on a Parquet block.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;The &lt;code&gt;cache_control&lt;/code&gt; section contains the follow parameters for Parquet metadata objects:&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Default value&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;[footer: &lt;bool&gt; | default = false]&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Specifies if the footer should be cached&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;[column_index: &amp;lt;bool&amp;gt; | default = false]&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Specifies if the column index should be cached&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;[offset_index: &amp;lt;bool&amp;gt; | default = false]&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Specifies if the offset index should be cached&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;convert-to-parquet&#34;&gt;Convert to Parquet&lt;/h2&gt;
&lt;p&gt;If you have used an earlier version of the Parquet format, you can use &lt;code&gt;tempo-cli&lt;/code&gt; to convert a Parquet file from its existing schema to the one used in Tempo 2.0.&lt;/p&gt;
&lt;p&gt;For instructions, refer to the &lt;a href=&#34;../../operations/tempo_cli/#parquet-convert-command&#34;&gt;Parquet convert command documentation&lt;/a&gt;.&lt;/p&gt;
]]></content><description>&lt;h1 id="apache-parquet-block-format">Apache Parquet block format&lt;/h1>
&lt;p>Tempo has a default columnar block format based on Apache Parquet. This format is required for tags-based search as well as &lt;a href="../../traceql/">TraceQL&lt;/a>, the query language for traces. The columnar block format improves search performance and enables a large ecosystem of tools to access the underlying trace data.&lt;/p></description></item><item><title>Polling</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/polling/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/polling/</guid><content><![CDATA[&lt;h1 id=&#34;polling&#34;&gt;Polling&lt;/h1&gt;
&lt;p&gt;The polling cycle is controlled by a number of configuration options detailed here.&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;storage:
    trace:
        # How often to repoll the backend for new blocks. Default is 5m
        [blocklist_poll: &amp;lt;duration&amp;gt;]

        # Number of blocks to process in parallel during polling. Default is 50.
        [blocklist_poll_concurrency: &amp;lt;int&amp;gt;]

        # By default components will pull the blocklist from the tenant index. If that fails the component can
        # fallback to scanning the entire bucket. Set to false to disable this behavior. Default is true.
        [blocklist_poll_fallback: &amp;lt;bool&amp;gt;]

        # Maximum number of compactors that should build the tenant index. All other components will download
        # the index.  Default 2.
        [blocklist_poll_tenant_index_builders: &amp;lt;int&amp;gt;]

        # The oldest allowable tenant index. If an index is pulled that is older than this duration,
        # the polling will consider this an error. Note that `blocklist_poll_fallback` applies here.
        # If fallback is true and a tenant index exceeds this duration, it will fall back to listing
        # the bucket contents.
        # Default 0 (disabled).
        [blocklist_poll_stale_tenant_index: &amp;lt;duration&amp;gt;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Due to the mechanics of the &lt;a href=&#34;../../operations/polling/&#34;&gt;tenant index&lt;/a&gt;, the blocklist will be stale by
at most 2 times the configured &lt;code&gt;blocklist_poll&lt;/code&gt; duration. There are two configuration options that need to be balanced
against the &lt;code&gt;blockist_poll&lt;/code&gt; to handle this:&lt;/p&gt;
&lt;p&gt;The ingester &lt;code&gt;complete_block_timeout&lt;/code&gt; is used to hold a block in the ingester for a given period of time after
it has been flushed. This allows the ingester to return traces to the queriers while they are still unaware
of the newly flushed blocks.&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;ingester:
  # How long to hold a complete block in the ingester after it has been flushed to the backend.  Default is 15m
  [complete_block_timeout: &amp;lt;duration&amp;gt;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The compactor &lt;code&gt;compacted_block_retention&lt;/code&gt; is used to keep a block in the backend for a given period of time
after it has been compacted and the data is no longer needed. This allows queriers with a stale blocklist to access
these blocks successfully until they complete their polling cycles and have up to date blocklists. Like the
&lt;code&gt;complete_block_timeout&lt;/code&gt;, this should be at a minimum 2x the configured &lt;code&gt;blocklist_poll&lt;/code&gt; duration.&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;compactor:
  compaction:
    # How long to leave a block in the backend after it has been compacted successfully.  Default is 1h
    [compacted_block_retention: &amp;lt;duration&amp;gt;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Additionally, the querier &lt;code&gt;blocklist_poll&lt;/code&gt; duration needs to be greater than or equal to the compactor
&lt;code&gt;blocklist_poll&lt;/code&gt; duration. Otherwise, a querier may not correctly check all assigned blocks and incorrectly return 404.
It is recommended to simply set both components to use the same poll duration.&lt;/p&gt;
]]></content><description>&lt;h1 id="polling">Polling&lt;/h1>
&lt;p>The polling cycle is controlled by a number of configuration options detailed here.&lt;/p>
&lt;div class="code-snippet code-snippet__mini">&lt;div class="lang-toolbar__mini">
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;/div>&lt;div class="code-snippet code-snippet__border">
&lt;pre data-expanded="false">&lt;code class="language-none">storage:
trace:
# How often to repoll the backend for new blocks. Default is 5m
[blocklist_poll: &amp;lt;duration&amp;gt;]
# Number of blocks to process in parallel during polling. Default is 50.
[blocklist_poll_concurrency: &amp;lt;int&amp;gt;]
# By default components will pull the blocklist from the tenant index. If that fails the component can
# fallback to scanning the entire bucket. Set to false to disable this behavior. Default is true.
[blocklist_poll_fallback: &amp;lt;bool&amp;gt;]
# Maximum number of compactors that should build the tenant index. All other components will download
# the index. Default 2.
[blocklist_poll_tenant_index_builders: &amp;lt;int&amp;gt;]
# The oldest allowable tenant index. If an index is pulled that is older than this duration,
# the polling will consider this an error. Note that `blocklist_poll_fallback` applies here.
# If fallback is true and a tenant index exceeds this duration, it will fall back to listing
# the bucket contents.
# Default 0 (disabled).
[blocklist_poll_stale_tenant_index: &amp;lt;duration&amp;gt;]&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;p>Due to the mechanics of the &lt;a href="../../operations/polling/">tenant index&lt;/a>, the blocklist will be stale by
at most 2 times the configured &lt;code>blocklist_poll&lt;/code> duration. There are two configuration options that need to be balanced
against the &lt;code>blockist_poll&lt;/code> to handle this:&lt;/p></description></item><item><title>Grafana Agent</title><link>https://grafana.com/docs/tempo/v2.2.x/configuration/grafana-agent/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/configuration/grafana-agent/</guid><content><![CDATA[&lt;h1 id=&#34;grafana-agent&#34;&gt;Grafana Agent&lt;/h1&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/grafana/agent&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Agent&lt;/a&gt; is a telemetry
collector for sending metrics, logs, and trace data to the opinionated
Grafana observability stack.&lt;/p&gt;
&lt;p&gt;It is commonly used as a tracing pipeline, offloading traces from the
application and forwarding them to a storage backend.
The Grafana Agent tracing stack is built using OpenTelemetry.&lt;/p&gt;
&lt;p&gt;The Grafana Agent supports receiving traces in multiple formats:
OTLP (OpenTelemetry), Jaeger, Zipkin, and OpenCensus.&lt;/p&gt;
&lt;p&gt;On top of receiving and exporting traces, the Grafana Agent contains many
features that make your distributed tracing system more robust, and
leverages all the data that is processed in the pipeline.&lt;/p&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;
&lt;p&gt;The Grafana Agent can be configured to run a set of tracing pipelines to collect data from your applications and write it to Tempo.
Pipelines are built using OpenTelemetry,
and consist of &lt;code&gt;receivers&lt;/code&gt;, &lt;code&gt;processors&lt;/code&gt; and &lt;code&gt;exporters&lt;/code&gt;. The architecture mirrors that of the OTel Collector&amp;rsquo;s &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector/blob/846b971758c92b833a9efaf742ec5b3e2fbd0c89/docs/design.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;design&lt;/a&gt;.
See the &lt;a href=&#34;/docs/agent/latest/configuration/traces-config/&#34;&gt;configuration reference&lt;/a&gt; for all available configuration options.
For a quick start, refer to this &lt;a href=&#34;/blog/2020/11/17/tracing-with-the-grafana-cloud-agent-and-grafana-tempo/&#34;&gt;blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;&lt;img src=&#34;https://raw.githubusercontent.com/open-telemetry/opentelemetry-collector/846b971758c92b833a9efaf742ec5b3e2fbd0c89/docs/images/design-pipelines.png&#34; alt=&#34;Tracing pipeline architecture&#34;&gt;&lt;/p&gt;
&lt;p&gt;This allows you to configure multiple distinct tracing
pipelines, each of which collects separate spans and sends them to different
backends.&lt;/p&gt;
&lt;h3 id=&#34;receiving-traces&#34;&gt;Receiving traces&lt;/h3&gt;
&lt;p&gt;The Grafana Agent supports multiple ingestion receivers:
OTLP (OpenTelemetry), Jaeger, Zipkin, OpenCensus and Kafka.&lt;/p&gt;
&lt;p&gt;Each tracing pipeline can be configured to receive traces in all these formats.
Traces that arrive to a pipeline will go through the receivers/processors/exporters defined in it.&lt;/p&gt;
&lt;h3 id=&#34;pipeline-processing&#34;&gt;Pipeline processing&lt;/h3&gt;
&lt;p&gt;The Grafana Agent processes tracing data as it flows through the pipeline to make the distributed tracing system more reliable and leverage the data for other purposes such as trace discovery, tail-based sampling, and generating metrics.&lt;/p&gt;
&lt;h4 id=&#34;batching&#34;&gt;Batching&lt;/h4&gt;
&lt;p&gt;The Agent supports batching of traces.
Batching helps better compress the data, reduces the number of outgoing connections, and is a recommended best practice.
To configure it, refer to the &lt;code&gt;batch&lt;/code&gt; block in the &lt;a href=&#34;/docs/agent/latest/configuration/traces-config/&#34;&gt;configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;attributes-manipulation&#34;&gt;Attributes manipulation&lt;/h4&gt;
&lt;p&gt;The Grafana Agent allows for general manipulation of attributes on spans that pass through this agent.
A common use may be to add an environment or cluster variable.
To configure it, refer to the &lt;code&gt;attributes&lt;/code&gt; block in the &lt;a href=&#34;/docs/agent/latest/configuration/traces-config/&#34;&gt;configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;attaching-metadata-with-prometheus-service-discovery&#34;&gt;Attaching metadata with Prometheus Service Discovery&lt;/h4&gt;
&lt;p&gt;Prometheus Service Discovery mechanisms enable you to attach the same metadata to your traces as your metrics.
For example, for Kubernetes users this means that you can dynamically attach metadata for namespace, pod, and name of the container sending spans.&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;traces:
  ...
  scrape_configs:
  - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    job_name: kubernetes-pods
    kubernetes_sd_configs:
    - role: pod
    relabel_configs:
    - source_labels: [__meta_kubernetes_namespace]
      target_label: namespace
    - source_labels: [__meta_kubernetes_pod_name]
      target_label: pod
    - source_labels: [__meta_kubernetes_pod_container_name]
      target_label: container
    tls_config:
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      insecure_skip_verify: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This feature isn’t just useful for Kubernetes users, however.
All of Prometheus&amp;rsquo; &lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/configuration/configuration/#configuration-file&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;various service discovery mechanisms&lt;/a&gt; are supported here.
This means you can use the same scrape_configs between your metrics, logs, and traces to get the same set of labels,
and easily transition between your observability data when moving from your metrics, logs, and traces.&lt;/p&gt;
&lt;p&gt;To configure it, refer to the &lt;code&gt;scrape_configs&lt;/code&gt; block in the &lt;a href=&#34;/docs/agent/latest/configuration/traces-config/&#34;&gt;configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;trace-discovery-through-automatic-logging&#34;&gt;Trace discovery through automatic logging&lt;/h4&gt;
&lt;p&gt;Automatic logging writes well formatted log lines to help with trace discovery.&lt;/p&gt;
&lt;p&gt;For a closer look into the feature, visit &lt;a href=&#34;automatic-logging/&#34;&gt;Automatic logging&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;tail-based-sampling&#34;&gt;Tail-based sampling&lt;/h4&gt;
&lt;p&gt;The Agent implements tail-based sampling for distributed tracing systems and multi-instance Agent deployments.
With this feature, sampling decisions can be made based on data from a trace, rather than exclusively with probabilistic methods.&lt;/p&gt;
&lt;p&gt;For a detailed description, go to &lt;a href=&#34;tail-based-sampling/&#34;&gt;Tail-based sampling&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;generating-metrics-from-spans&#34;&gt;Generating metrics from spans&lt;/h4&gt;
&lt;p&gt;The Agent can take advantage of the span data flowing through the pipeline to generate Prometheus metrics.&lt;/p&gt;
&lt;p&gt;Go to &lt;a href=&#34;span-metrics/&#34;&gt;Span metrics&lt;/a&gt; for a more detailed explanation of the feature.&lt;/p&gt;
&lt;h4 id=&#34;service-graph-metrics&#34;&gt;Service graph metrics&lt;/h4&gt;
&lt;p&gt;Service graph metrics represent the relationships between services within a distributed system.&lt;/p&gt;
&lt;p&gt;This service graphs processor builds a map of services by analyzing traces, with the objective to find &lt;em&gt;edges&lt;/em&gt;.
Edges are spans with a parent-child relationship, that represent a jump (e.g. a request) between two services.
The amount of requests and their duration are recorded as metrics, which are used to represent the graph.&lt;/p&gt;
&lt;p&gt;To read more about this processor, go to its &lt;a href=&#34;service-graphs/&#34;&gt;section&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;exporting-spans&#34;&gt;Exporting spans&lt;/h3&gt;
&lt;p&gt;The Grafana Agent can export traces to multiple different backends for every tracing pipeline.
Exporting is built using OpenTelemetry Collector&amp;rsquo;s &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector/blob/846b971758c92b833a9efaf742ec5b3e2fbd0c89/exporter/otlpexporter/README.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OTLP exporter&lt;/a&gt;.
The Agent supports exporting tracing in OTLP format.&lt;/p&gt;
&lt;p&gt;Aside from endpoint and authentication, the exporter also provides mechanisms for retrying on failure,
and implements a queue buffering mechanism for transient failures, such as networking issues.&lt;/p&gt;
&lt;p&gt;To see all available options,
refer to the &lt;code&gt;remote_write&lt;/code&gt; block in the &lt;a href=&#34;/docs/agent/latest/configuration/traces-config/&#34;&gt;Agent configuration reference&lt;/a&gt;.&lt;/p&gt;
]]></content><description>&lt;h1 id="grafana-agent">Grafana Agent&lt;/h1>
&lt;p>The &lt;a href="https://github.com/grafana/agent" target="_blank" rel="noopener noreferrer">Grafana Agent&lt;/a> is a telemetry
collector for sending metrics, logs, and trace data to the opinionated
Grafana observability stack.&lt;/p>
&lt;p>It is commonly used as a tracing pipeline, offloading traces from the
application and forwarding them to a storage backend.
The Grafana Agent tracing stack is built using OpenTelemetry.&lt;/p></description></item></channel></rss>