<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Set up Tempo on Grafana Labs</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/</link><description>Recent content in Set up Tempo on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/index.xml" rel="self" type="application/rss+xml"/><item><title>Plan your Tempo deployment</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/plan/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/plan/</guid><content><![CDATA[&lt;h1 id=&#34;plan-your-tempo-deployment&#34;&gt;Plan your Tempo deployment&lt;/h1&gt;
&lt;p&gt;Before you deploy Tempo, you should consider how you plan to use traces and Tempo as well as any special requirements for Tempo 3.0.&lt;/p&gt;
&lt;h2 id=&#34;considerations-for-tempo-30&#34;&gt;Considerations for Tempo 3.0&lt;/h2&gt;
&lt;p&gt;Before planning your Tempo deployment, be aware of the following infrastructure requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Object storage: Tempo stores trace data in object storage such as S3, GCS, or Azure Storage. Object storage is required for microservices deployments and recommended for production. Monolithic deployments can use local filesystem storage for development and test environments.&lt;/li&gt;
&lt;li&gt;Kafka-compatible system: Microservices mode requires a Kafka-compatible system, such as Apache Kafka, Redpanda, or WarpStream, as the durable queue that decouples the write and read paths. Monolithic mode doesn&amp;rsquo;t use Kafka.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Include these infrastructure components in your deployment planning and resource estimation.&lt;/p&gt;
&lt;h2 id=&#34;develop-a-deployment-plan&#34;&gt;Develop a deployment plan&lt;/h2&gt;
&lt;p&gt;To plan your Grafana Tempo deployment, you should:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Identify your use case
Decide what you need from Tempo. For example, consider if you want a basic installation, horizontal scalability, multi-tenancy, or advanced data storage. Your use case determines the deployment architecture and resource requirements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Estimate tracing data volume
Assess the amount of tracing data your environment will generate. This helps you size your cluster and storage.
Refer to the &lt;a href=&#34;./size/&#34;&gt;Size your cluster&lt;/a&gt; section for guidance on calculating storage and performance needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose a deployment mode.
Tempo supports monolithic and microservices deployment modes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use monolithic mode for getting started, development, or smaller workloads. No Kafka is required.&lt;/li&gt;
&lt;li&gt;Use microservices mode for production, high-volume, or highly available deployments. Requires a Kafka-compatible system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Review the &lt;a href=&#34;./deployment-modes/&#34;&gt;Deployment modes&lt;/a&gt; documentation to compare options and select the best fit for your use case.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By following these recommendations, you can plan a Tempo deployment that matches your operational requirements and scales with your tracing data.&lt;/p&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve planned your deployment, you can 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/&#34;&gt;Deploy your Tempo instance&lt;/a&gt; using the deployment mode you selected.&lt;/p&gt;
]]></content><description>&lt;h1 id="plan-your-tempo-deployment">Plan your Tempo deployment&lt;/h1>
&lt;p>Before you deploy Tempo, you should consider how you plan to use traces and Tempo as well as any special requirements for Tempo 3.0.&lt;/p></description></item><item><title>Deploy Tempo</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-tempo&#34;&gt;Deploy Tempo&lt;/h1&gt;
&lt;p&gt;Tempo can be easily deployed through a number of tools, including Helm, Tanka, Kubernetes, and Docker.&lt;/p&gt;
&lt;p&gt;The following procedures provide example Tempo deployments that you can use as a starting point.&lt;/p&gt;
&lt;p&gt;Tempo can be deployed in a number of ways, depending on your needs and environment. You can deploy Tempo in a monolithic mode or in a microservices mode.&lt;/p&gt;
&lt;p&gt;You can also use Docker to deploy Tempo using &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;the Docker examples&lt;/a&gt;.&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;Grafana Tempo does not come with any included authentication layer. You must run an authenticating reverse proxy in front of your services to prevent unauthorized access to Tempo (for example, nginx). 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/authentication/&#34;&gt;Manage authentication&lt;/a&gt; for more details&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;kafka-requirement&#34;&gt;Kafka requirement&lt;/h2&gt;
&lt;p&gt;Tempo 3.0 requires a Kafka-compatible message queue as part of its architecture.
Distributors write incoming trace data to Kafka, and downstream components such as block-builders and live-stores consume from it.
Any Kafka-compatible system works.&lt;/p&gt;
&lt;h2 id=&#34;deploy-locally&#34;&gt;Deploy locally&lt;/h2&gt;
&lt;p&gt;Monolithic mode (single binary) is commonly used for a local installation, testing, or small-scale deployments.
This mode can be deployed using a pre-compiled binary, OS-specific packaging, or Docker image.
While it&amp;rsquo;s possible to deploy monolithic mode in a Kubernetes cluster, it is not recommended for production use.&lt;/p&gt;
&lt;p&gt;Check out the &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;Docker examples&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id=&#34;deploy-using-kubernetes&#34;&gt;Deploy using Kubernetes&lt;/h2&gt;
&lt;p&gt;Kubernetes deployment examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/helm-chart/&#34;&gt;Deploy with Helm&lt;/a&gt; (microservices and monolithic)&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/&#34;&gt;Deploy with Tempo Operator&lt;/a&gt; (microservices)&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/tanka/&#34;&gt;Deploy on Kubernetes using Tanka&lt;/a&gt; (microservices)&lt;/li&gt;
&lt;/ul&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 Tanka and Helm examples are equivalent.
They are both provided for people who prefer different configuration mechanisms.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;For more information, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/&#34;&gt;Deploy Tempo on Kubernetes&lt;/a&gt;.&lt;/p&gt;
]]></content><description>&lt;h1 id="deploy-tempo">Deploy Tempo&lt;/h1>
&lt;p>Tempo can be easily deployed through a number of tools, including Helm, Tanka, Kubernetes, and Docker.&lt;/p>
&lt;p>The following procedures provide example Tempo deployments that you can use as a starting point.&lt;/p></description></item><item><title>Example setups</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/example-demo-app/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/example-demo-app/</guid><content><![CDATA[&lt;h1 id=&#34;example-setups&#34;&gt;Example setups&lt;/h1&gt;
&lt;p&gt;The following examples show various deployment and configuration options using trace generators so you can get started experimenting with Tempo without an existing application.&lt;/p&gt;
&lt;p&gt;For more information about Tempo setup and configuration, see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/&#34;&gt;Set up Tempo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/&#34;&gt;Tempo configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are interested in instrumentation, refer to &lt;a href=&#34;../../instrument-send/&#34;&gt;Tempo instrumentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;docker-compose&#34;&gt;Docker Compose&lt;/h2&gt;
&lt;p&gt;The &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;docker-compose examples&lt;/a&gt; are simpler and designed to show minimal configuration.&lt;/p&gt;
&lt;p&gt;Some of the examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trace discovery with Loki&lt;/li&gt;
&lt;li&gt;Basic Grafana Alloy/OpenTelemetry Setup&lt;/li&gt;
&lt;li&gt;Various Backends (S3/GCS/Azure)&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/docker-example/&#34;&gt;K6 with Traces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a great place to get started with Tempo and learn about various trace discovery flows.&lt;/p&gt;
&lt;h2 id=&#34;helm&#34;&gt;Helm&lt;/h2&gt;
&lt;p&gt;The Helm &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/helm&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;example&lt;/a&gt; shows a complete microservice based deployment.
There are monolithic mode and microservices examples.&lt;/p&gt;
&lt;p&gt;To install Tempo on Kubernetes, use the &lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/&#34;&gt;Deploy on Kubernetes using Helm&lt;/a&gt; procedure.&lt;/p&gt;
&lt;h2 id=&#34;tanka&#34;&gt;Tanka&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/tk&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jsonnet based examples&lt;/a&gt; include complete monolithic mode and microservices deployments.&lt;/p&gt;
&lt;p&gt;To learn how to set up a Tempo cluster, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/tanka/&#34;&gt;Deploy on Kubernetes with Tanka&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;introduction-to-metrics-logs-traces-and-profiles-example&#34;&gt;Introduction to Metrics, Logs, Traces, and Profiles example&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/grafana/intro-to-mltp&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Introduction to Metrics, Logs, Traces, and Profiles in Grafana&lt;/a&gt; provides a self-contained environment for learning about Mimir, Loki, Tempo, Pyroscope, and Grafana.
It includes detailed explanations of each component and annotated configurations for each component.&lt;/p&gt;
&lt;p&gt;The README.md file explains how to download and &lt;a href=&#34;https://github.com/grafana/intro-to-mltp#running-the-demonstration-environment&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;start the environment&lt;/a&gt;, including instructions for using Grafana Cloud and Grafana Alloy collector.&lt;/p&gt;
]]></content><description>&lt;h1 id="example-setups">Example setups&lt;/h1>
&lt;p>The following examples show various deployment and configuration options using trace generators so you can get started experimenting with Tempo without an existing application.&lt;/p></description></item><item><title>Validate deployment</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/test/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/test/</guid><content><![CDATA[&lt;!-- This page is not finished. It&#39;s hidden from the published doc site by draft: true. --&gt;
&lt;h1 id=&#34;validate-your-tempo-deployment&#34;&gt;Validate your Tempo deployment&lt;/h1&gt;
&lt;p&gt;To test your Tempo deployment, select one of the procedures below to test your Tempo deployment:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/test/test-monolithic-local/&#34;&gt;Validate your local Tempo deployment&lt;/a&gt;&lt;br&gt;Validate your local Grafana Tempo deployment by sending traces and verifying they are stored and queryable.&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/test/set-up-test-app/&#34;&gt;Validate Kubernetes deployment using a test application&lt;/a&gt;&lt;br&gt;Validate your Tempo deployment on Kubernetes.&lt;/li&gt;&lt;/ul&gt;
&lt;!-- Update these steps before publishing. They aren&#39;t complete.
Follow these steps to ensure that traces are being sent and received correctly.
This guide assumes you have already set up a Tempo instance and have Grafana configured to query it.

For additional information, refer to [Push spans with HTTP](https://grafana.com/docs/tempo/&lt;TEMPO_VERSION&gt;/operations/push-spans-with-http/).

If you are using Cloud Traces, refer to [Set up Cloud Traces](https://grafana.com/docs/grafana-cloud/send-data/traces/set-up/).

## Before you begin


## Test using the Tempo CLI
To test your Tempo deployment, you can use the Tempo CLI to push traces to your Tempo instance.
The Tempo CLI is a command-line tool that allows you to interact with your Tempo instance and perform various operations, such as pushing traces, querying traces, and more.

### Install the Tempo CLI
You can install the Tempo CLI by following the instructions in the [Tempo CLI documentation](https://grafana.com/docs/tempo/latest/operations/cli/).

### Push traces to Tempo

To push traces to your Tempo instance, you can use the `tempo push` command. For example, to push a trace with a specific trace ID and span ID, you can use the following command:
```bash
tempo push --trace-id &lt;TRACE_ID&gt; --span-id &lt;SPAN_ID&gt; --endpoint http://&lt;TEMPO-DISTRIBUTOR-SERVICE&gt;:&lt;HTTP-LISTEN-PORT&gt;
```
Replace `&lt;TRACE_ID&gt;` and `&lt;SPAN_ID&gt;` with the actual trace ID and span ID you want to push, and `&lt;TEMPO-DISTRIBUTOR-SERVICE&gt;` and `&lt;HTTP-LISTEN-PORT&gt;` with the appropriate values for your Tempo instance.


1. **Use `curl` to Query Tempo**: You can use `curl` to query the Tempo API and check if traces are being received. For example:
   ```bash
   curl -G http://&lt;TEMPO-QUERY-FRONTEND-SERVICE&gt;:&lt;HTTP-LISTEN-PORT&gt;/api/traces
   ```


## Test using Grafana

You can use Grafana to check if traces are sent and received.

### Test if traces are sent

To test if traces are being sent to Tempo, you can use the following methods:


2. **Use OpenTelemetry Collector**: If you have an OpenTelemetry Collector configured, you can check its logs to see if it is successfully exporting traces to Tempo. Ensure that the collector is configured with the correct endpoint for Tempo.

3. **Use Grafana Explore**: Navigate to the **Explore** section in Grafana and select the Tempo data source. You can run a query to see if traces are being returned.


### Test if traces are received

To test if traces are being received by Tempo, you can use the following methods:

1. **Grafana Explore**: Navigate to the **Explore** section in Grafana and select the Tempo data source. You can run a query to see if traces are being returned.
2. **Use `curl` to Query Tempo**: You can use `curl` to query the Tempo API and check if traces are being returned. For example:
   ```bash
   curl -G http://&lt;TEMPO-QUERY-FRONTEND-SERVICE&gt;:&lt;HTTP-LISTEN-PORT&gt;/api/traces
   ```
4. **Use OpenTelemetry Collector**: If you have an OpenTelemetry Collector configured, you can check its logs to see if it is successfully exporting traces to Tempo. Ensure that the collector is configured with the correct endpoint for Tempo.
5. **Check Grafana Logs**: Look for logs in the Grafana instance that indicate traces are being returned from Tempo. You can find these logs in the Grafana UI under **Configuration** &gt; **Logs**.

--&gt;
]]></content><description>&lt;!-- This page is not finished. It's hidden from the published doc site by draft: true. -->
&lt;h1 id="validate-your-tempo-deployment">Validate your Tempo deployment&lt;/h1>
&lt;p>To test your Tempo deployment, select one of the procedures below to test your Tempo deployment:&lt;/p></description></item><item><title>Upgrade your Tempo installation</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/upgrade/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/upgrade/</guid><content><![CDATA[&lt;h1 id=&#34;upgrade-your-tempo-installation&#34;&gt;Upgrade your Tempo installation&lt;/h1&gt;
&lt;!-- vale Grafana.We = NO --&gt;
&lt;!-- vale Grafana.Will = NO --&gt;
&lt;!-- vale Grafana.Timeless = NO --&gt;
&lt;p&gt;You can upgrade a Tempo installation to the next version.
However, any release has the potential to have breaking changes.
Before promoting an upgrade to production, test in a non-production environment.&lt;/p&gt;
&lt;p&gt;The upgrade process changes for each version, depending upon the changes made for the subsequent release.&lt;/p&gt;
&lt;p&gt;This upgrade guide applies to self-managed installations and not for Grafana Cloud.&lt;/p&gt;
&lt;p&gt;For information about updating to Tempo 2.x, refer to &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;Upgrade to Tempo 2.x&lt;/a&gt; in the Tempo 2.10 documentation.&lt;/p&gt;
&lt;p&gt;For detailed information about any release, refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/release-notes/&#34;&gt;Release notes&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-tip&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Tip&lt;/p&gt;&lt;p&gt;You can check your configuration options using the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/api_docs/#status&#34;&gt;&lt;code&gt;status&lt;/code&gt; API endpoint&lt;/a&gt; in your Tempo installation.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;upgrade-to-tempo-30&#34;&gt;Upgrade to Tempo 3.0&lt;/h2&gt;
&lt;p&gt;Tempo 3.0 is a major release that replaces the ingester-based architecture with a new design that separates the read and write paths.
Block-builders, live-stores, and a backend scheduler replace ingesters and the compactor. For a detailed description of the new architecture, refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/&#34;&gt;Tempo architecture reference&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-warning&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Tempo 3.0 requires vParquet4 or later as the block format. If your storage configuration specifies vParquet3 or earlier, upgrade the block format before migrating. Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/parquet/#change-the-block-format-version&#34;&gt;Change the block format version&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;The migration path depends on your deployment mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Monolithic mode: Update your configuration (remove &lt;code&gt;ingester&lt;/code&gt;, &lt;code&gt;ingester_client&lt;/code&gt;, &lt;code&gt;compactor&lt;/code&gt;, and &lt;code&gt;metrics_generator_client&lt;/code&gt; blocks), then upgrade the binary. No Kafka is required. For step-by-step instructions, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/migrate-to-3/#migrate-a-monolithic-deployment&#34;&gt;Migrate a monolithic deployment&lt;/a&gt;. For a reference monolithic configuration, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/locally/&#34;&gt;Deploy Tempo locally&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Microservices mode: Requires a Kafka-compatible system. Deploy Tempo 3.0 alongside your existing 2.x deployment, switch traffic, then decommission 2.x. Refer to the full 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/migrate-to-3/&#34;&gt;Migrate from Tempo 2.x to 3.0&lt;/a&gt; guide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can automate configuration migration using the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo_cli/#migrate-config-command&#34;&gt;&lt;code&gt;tempo-cli migrate config&lt;/code&gt;&lt;/a&gt; command, which removes obsolete blocks and adds the required &lt;code&gt;ingest&lt;/code&gt; configuration for microservices mode.&lt;/p&gt;
&lt;p&gt;When upgrading to Tempo 3.0, also be aware of these breaking changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No downgrade path: There is no supported downgrade path from 3.0 to 2.x.&lt;/li&gt;
&lt;li&gt;Scalable monolithic mode (SSB) removed: The &lt;code&gt;scalable-single-binary&lt;/code&gt; target is no longer available. Use either microservices or monolithic (&lt;code&gt;target: all&lt;/code&gt;) instead. Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/deployment-modes/&#34;&gt;Deployment modes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Deployment manifests: Update Helm, Tanka, and other deployment manifests to include the new components and Kafka infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;legacy-overrides-disabled-by-default&#34;&gt;Legacy overrides disabled by default&lt;/h3&gt;
&lt;p&gt;Tempo now refuses to start if it detects legacy (flat, &lt;code&gt;unscoped&lt;/code&gt;) overrides in the main configuration or the per-tenant overrides file. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6741&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6741&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;To resolve this, either migrate to the scoped &lt;code&gt;defaults&lt;/code&gt; format (recommended) or temporarily opt back in.&lt;/p&gt;
&lt;h4 id=&#34;option-1-migrate-to-the-scoped-format&#34;&gt;Option 1: Migrate to the scoped format&lt;/h4&gt;
&lt;p&gt;Convert your overrides from the legacy flat format to the scoped &lt;code&gt;defaults&lt;/code&gt; format. For example:&lt;/p&gt;
&lt;p&gt;Before (legacy):&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;overrides:
  ingestion_rate_limit_bytes: 20000000
  ingestion_burst_size_bytes: 20000000
  max_bytes_per_trace: 30000000
  max_traces_per_user: 100000&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After (scoped):&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;overrides:
  defaults:
    ingestion:
      rate_limit_bytes: 20000000
      burst_size_bytes: 20000000
      max_traces_per_user: 100000
    global:
      max_bytes_per_trace: 30000000&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can automate the migration using the Tempo CLI. Refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo_cli/#migrate-overrides-config-command&#34;&gt;&lt;code&gt;tempo-cli migrate overrides-config&lt;/code&gt; command&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the full field mapping between legacy and scoped formats, refer to the &lt;a href=&#34;#new-defaults-block-in-overrides-module-configuration&#34;&gt;Upgrade to Tempo 2.3&lt;/a&gt; section.&lt;/p&gt;
&lt;h4 id=&#34;option-2-temporarily-opt-back-in&#34;&gt;Option 2: Temporarily opt back in&lt;/h4&gt;
&lt;p&gt;Set &lt;code&gt;enable_legacy_overrides: true&lt;/code&gt; in the overrides configuration block or pass &lt;code&gt;-config.enable-legacy-overrides=true&lt;/code&gt; on the CLI. A deprecation warning is logged on startup and each time per-tenant overrides are loaded. This is a temporary escape hatch. Legacy overrides are removed in a future release.&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;overrides:
  enable_legacy_overrides: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;mem-ballast-size-mbs-flag-removed&#34;&gt;&lt;code&gt;mem-ballast-size-mbs&lt;/code&gt; flag removed&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;-mem-ballast-size-mbs&lt;/code&gt; command-line flag has been removed. This flag is no longer needed in Go 1.19 and later, which use &lt;code&gt;GOMEMLIMIT&lt;/code&gt; instead. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6403&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6403&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If your deployment scripts, Helm values, or Tanka/Jsonnet configurations pass &lt;code&gt;-mem-ballast-size-mbs&lt;/code&gt;, remove it. Tempo fails to start with an unrecognized flag error.&lt;/p&gt;
&lt;h3 id=&#34;metrics-generator-configuration-changes&#34;&gt;Metrics-generator configuration changes&lt;/h3&gt;
&lt;p&gt;The metrics-generator gRPC endpoint and push path have been removed. In Tempo 3.0, the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/metrics-generator/&#34;&gt;metrics-generator&lt;/a&gt; consumes directly from Kafka rather than receiving spans through gRPC from the distributor. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6618&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6618&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If your configuration includes a top-level &lt;code&gt;metrics_generator_client&lt;/code&gt; block, you can safely remove it. Tempo 3.0 ignores this block, and it is deprecated. It is removed in a future release.&lt;/p&gt;
&lt;h3 id=&#34;block-configuration-centralized-to-storagetraceblock&#34;&gt;Block configuration centralized to &lt;code&gt;storage.trace.block&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Block and WAL configuration for the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/block-builder/&#34;&gt;block-builder&lt;/a&gt; and 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/live-store/&#34;&gt;live-store&lt;/a&gt; is now always sourced from &lt;code&gt;storage.trace.block&lt;/code&gt;. Per-module block configuration fields have been removed. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6647&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6647&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If your configuration sets block-level options such as &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;parquet_dedicated_columns&lt;/code&gt;, or &lt;code&gt;parquet_row_group_size_bytes&lt;/code&gt; under &lt;code&gt;block_builder.block&lt;/code&gt; or &lt;code&gt;live_store.block_config&lt;/code&gt;, move them to &lt;code&gt;storage.trace.block&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Before:&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_builder:
  block:
    version: &amp;#34;vParquet5&amp;#34;
    parquet_dedicated_columns:
      - { scope: resource, name: service.name, type: string }

live_store:
  block_config:
    version: &amp;#34;vParquet5&amp;#34;
    parquet_dedicated_columns:
      - { scope: resource, name: service.name, type: string }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After:&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:
      version: &amp;#34;vParquet5&amp;#34;
      parquet_dedicated_columns:
        - { scope: resource, name: service.name, type: string }&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;partition_ring_live_store-removed&#34;&gt;&lt;code&gt;partition_ring_live_store&lt;/code&gt; removed&lt;/h3&gt;
&lt;p&gt;Tempo 3.0 removes the top-level &lt;code&gt;partition_ring_live_store&lt;/code&gt; setting. Tempo now uses a single 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/partition-ring/&#34;&gt;partition ring&lt;/a&gt;, so this configuration toggle is no longer needed. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6981&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6981&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If your 2.x configuration still includes this field, remove it before or during your 3.0 upgrade.&lt;/p&gt;
&lt;p&gt;Before:&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;partition_ring_live_store: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After:&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;# Remove partition_ring_live_store&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;live-store-and-query-defaults-reduced&#34;&gt;Live-store and query defaults reduced&lt;/h3&gt;
&lt;p&gt;The default values for several 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/live-store/&#34;&gt;live-store&lt;/a&gt; and query-frontend settings have been reduced to produce smaller WAL blocks, release completed blocks sooner, and align the metrics query backend boundary with 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;Setting&lt;/th&gt;
              &lt;th&gt;Previous default&lt;/th&gt;
              &lt;th&gt;New default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;live_store.flush_check_period&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;10s&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;5s&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;live_store.max_block_duration&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30m&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30s&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;live_store.max_block_bytes&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;100 MiB&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;50 MiB&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;live_store.complete_block_timeout&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;1h&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;20m&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;query_frontend.metrics.query_backend_after&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;30m&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;15m&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;If you explicitly set these values in your configuration, no action is needed.&lt;/p&gt;
&lt;h3 id=&#34;ingester-removal&#34;&gt;Ingester removal&lt;/h3&gt;
&lt;p&gt;The ingester module is removed entirely. All ingester-related configuration fields, CLI flags, alerts, and dashboard panels must be removed from your deployment. The write path is now handled by the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/block-builder/&#34;&gt;block-builder&lt;/a&gt; and 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/live-store/&#34;&gt;live-store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Removed configuration sections: &lt;code&gt;ingester&lt;/code&gt;, &lt;code&gt;ingester_client&lt;/code&gt;, &lt;code&gt;compactor&lt;/code&gt;, &lt;code&gt;metrics_generator_client&lt;/code&gt;.
The &lt;code&gt;ingest.enabled&lt;/code&gt; field is also removed, but the &lt;code&gt;ingest&lt;/code&gt; block itself is still required for microservices mode (for example, &lt;code&gt;ingest.kafka&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For step-by-step migration instructions, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/migrate-to-3/&#34;&gt;Migrate from Tempo 2.x to 3.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/6959&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6959&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6504&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6504&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6667&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6667&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6873&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6873&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;compactor-removal-and-cli-flag-changes&#34;&gt;Compactor removal and CLI flag changes&lt;/h3&gt;
&lt;p&gt;The compactor component and the &lt;code&gt;v2&lt;/code&gt; block encoding are removed. Compaction is now handled by the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/compaction/&#34;&gt;backend scheduler and worker&lt;/a&gt;, which track job progress centrally and automatically reschedule failed jobs.&lt;/p&gt;
&lt;p&gt;Remove all compactor-related configuration, alerts, and dashboard panels from your deployment. The following &lt;code&gt;tempo-cli&lt;/code&gt; commands are also removed because they were specific to the &lt;code&gt;v2&lt;/code&gt; format: &lt;code&gt;list block&lt;/code&gt;, &lt;code&gt;list index&lt;/code&gt;, &lt;code&gt;view index&lt;/code&gt;, &lt;code&gt;gen index&lt;/code&gt;, and &lt;code&gt;gen bloom&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The compaction CLI flags drop their duplicate &lt;code&gt;compaction.&lt;/code&gt; prefix. Update these flags in your configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compaction.compaction.block-retention&lt;/code&gt; → &lt;code&gt;compaction.block-retention&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compaction.compaction.max-objects-per-block&lt;/code&gt; → &lt;code&gt;compaction.max-objects-per-block&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compaction.compaction.max-block-bytes&lt;/code&gt; → &lt;code&gt;compaction.max-block-bytes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compaction.compaction.compaction-window&lt;/code&gt; → &lt;code&gt;compaction.compaction-window&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/6273&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6273&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6369&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6369&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6909&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6909&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&#34;retryinfo-enabled-by-default&#34;&gt;&lt;code&gt;RetryInfo&lt;/code&gt; enabled by default&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;distributor.retry_after_on_resource_exhausted&lt;/code&gt; setting now defaults to &lt;code&gt;5s&lt;/code&gt; (previously &lt;code&gt;0&lt;/code&gt;). OTLP clients receive a retry hint on &lt;code&gt;ResourceExhausted&lt;/code&gt; errors from the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/distributor/&#34;&gt;distributor&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/7088&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 7088&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;To disable cluster-wide, set the value to &lt;code&gt;0&lt;/code&gt;. To disable for a single tenant, set the per-tenant override &lt;code&gt;ingestion.retry_info_enabled: false&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;traceql-array-matching-changes&#34;&gt;TraceQL array matching changes&lt;/h3&gt;
&lt;p&gt;The TraceQL AST optimization changes the semantics of &lt;code&gt;!=&lt;/code&gt; and &lt;code&gt;!~&lt;/code&gt; operators when used with array attributes. &lt;code&gt;!=&lt;/code&gt; now means &lt;code&gt;NOT IN&lt;/code&gt; (previously &lt;code&gt;CONTAINS NOT EQUAL&lt;/code&gt;) and &lt;code&gt;!~&lt;/code&gt; now means &lt;code&gt;MATCH NONE&lt;/code&gt; (previously &lt;code&gt;CONTAINS NON-MATCH&lt;/code&gt;). Regex operands must be of type string or string array. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6353&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6353&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;If you have queries that depend on the previous behavior, disable the optimization with the query hint &lt;code&gt;skip_optimization=true&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;other-breaking-changes&#34;&gt;Other breaking changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;all&lt;/code&gt; target is now 3.0-compatible and the &lt;code&gt;scalable-single-binary&lt;/code&gt; target is removed. Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/deployment-modes/&#34;&gt;Deployment modes&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6283&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6283&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;The OpenCensus receiver is removed. Migrate to OTLP. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6523&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6523&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SpanMetricsSummary&lt;/code&gt; is removed and querier code simplified. (PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/6496&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6496&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/6510&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#6510&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;querier.query_live_store&lt;/code&gt; configuration is removed. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/7048&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 7048&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;code&gt;query_frontend.search.query_ingesters_until&lt;/code&gt; is removed in favor of &lt;code&gt;query_frontend.search.query_backend_after&lt;/code&gt;. Refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/reference-tempo-architecture/components/query-frontend/&#34;&gt;query-frontend&lt;/a&gt; component reference. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6507&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6507&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;tempo-cli query search&lt;/code&gt; command no longer accepts timestamps without a timezone (for example, &lt;code&gt;2024-01-01T00:00:00&lt;/code&gt;). Use RFC3339 format (for example, &lt;code&gt;2024-01-01T00:00:00Z&lt;/code&gt;) or relative time (for example, &lt;code&gt;now-1h&lt;/code&gt;). Refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo_cli/&#34;&gt;Tempo CLI documentation&lt;/a&gt;. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6458&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6458&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Tempo 3.0 upgrades to Go 1.26.2. [&lt;a href=&#34;https://github.com/grafana/tempo/pull/6443&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 6443&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- vale Grafana.We = YES --&gt;
&lt;!-- vale Grafana.Will = YES --&gt;
&lt;!-- vale Grafana.Timeless = YES --&gt;
]]></content><description>&lt;h1 id="upgrade-your-tempo-installation">Upgrade your Tempo installation&lt;/h1>
&lt;!-- vale Grafana.We = NO -->
&lt;!-- vale Grafana.Will = NO -->
&lt;!-- vale Grafana.Timeless = NO -->
&lt;p>You can upgrade a Tempo installation to the next version.
However, any release has the potential to have breaking changes.
Before promoting an upgrade to production, test in a non-production environment.&lt;/p></description></item><item><title>Migrate from Tempo 2.x to 3.0</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/migrate-to-3/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/migrate-to-3/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-from-tempo-2x-to-30&#34;&gt;Migrate from Tempo 2.x to 3.0&lt;/h1&gt;
&lt;p&gt;Grafana Tempo 3.0 introduces a new architecture that replaces ingesters with a Kafka-based ingest path.
Distributors write trace data to Kafka, and two new components consume from it: block-builders create blocks for long-term object storage, and live-stores serve recent-data queries. A backend-scheduler and backend-worker replace the compactor for block maintenance.&lt;/p&gt;
&lt;p&gt;This guide walks you through migrating a self-managed Grafana Tempo deployment from 2.x to 3.0.
The migration path depends on your deployment mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monolithic mode&lt;/strong&gt; users have a simpler path: update the configuration and upgrade the binary. See &lt;a href=&#34;#migrate-a-monolithic-deployment&#34;&gt;Migrate a monolithic deployment&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microservices mode&lt;/strong&gt; users follow a parallel-deployment migration: deploy 3.0 alongside 2.x, switch traffic, then decommission. The bulk of this guide covers that path.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class=&#34;admonition admonition-warning&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;There&amp;rsquo;s no in-place downgrade from 3.0 to 2.x. During the migration you can route traffic back to 2.x (see &lt;a href=&#34;#roll-back&#34;&gt;Roll back&lt;/a&gt;), but once you decommission the 2.x deployment, plan to stay on 3.0.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;



&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Running two Tempo deployments in parallel increases infrastructure costs for the duration of the migration. Plan to complete the migration and decommission the 2.x deployment promptly.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;Confirm the following before you start:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your Tempo 2.x deployment uses &lt;strong&gt;vParquet4 or later&lt;/strong&gt; as the block format. Tempo 3.0 doesn&amp;rsquo;t support vParquet3 or earlier. If you&amp;rsquo;re using an older format, upgrade your block format before migrating. Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/parquet/#choose-a-different-block-format&#34;&gt;Choose a different block format&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microservices mode only&lt;/strong&gt;: You have a running &lt;strong&gt;Kafka-compatible system&lt;/strong&gt; (for example, Apache Kafka or Redpanda). Monolithic mode does not require Kafka.&lt;/li&gt;
&lt;li&gt;You have access to the &lt;strong&gt;same object storage&lt;/strong&gt; bucket or container used by your 2.x deployment.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re running &lt;strong&gt;scalable monolithic mode&lt;/strong&gt; (SSB), plan to switch to either monolithic or microservices mode. SSB has been removed in Tempo 3.0.&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ve reviewed the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;Upgrade your Tempo installation&lt;/a&gt; page for breaking changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;migrate-legacy-overrides-format&#34;&gt;Migrate legacy overrides format&lt;/h3&gt;
&lt;p&gt;Tempo 3.0 disables the legacy (flat, unscoped) overrides format by default. If your main config or per-tenant overrides file uses the legacy format, Tempo refuses to start with an error 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;DEPRECATED: legacy overrides config format detected but legacy overrides are disabled by default.
Migrate your overrides config to the new scoped format, or set -config.enable-legacy-overrides=true
(or enable_legacy_overrides: true in YAML) to continue using legacy overrides temporarily&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As a temporary workaround, set &lt;code&gt;enable_legacy_overrides: true&lt;/code&gt; in the &lt;code&gt;overrides&lt;/code&gt; block or pass &lt;code&gt;-config.enable-legacy-overrides=true&lt;/code&gt; on the CLI. Legacy overrides will be removed in a future release.&lt;/p&gt;
&lt;p&gt;To migrate, use the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo_cli/#migrate-overrides-config-command&#34;&gt;&lt;code&gt;tempo-cli migrate overrides-config&lt;/code&gt;&lt;/a&gt; command, or manually rewrite your overrides to the new scoped format. Refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/#overrides&#34;&gt;overrides configuration reference&lt;/a&gt; for the full schema.&lt;/p&gt;
&lt;h2 id=&#34;architecture-changes&#34;&gt;Architecture changes&lt;/h2&gt;
&lt;p&gt;In Tempo 2.x, distributors forward spans to ingesters and metrics-generators over gRPC. Ingesters batch spans, build blocks, and flush them to object storage. Compactors maintain blocks in storage. For more information, refer to the &lt;a href=&#34;/docs/tempo/v2.10.x/introduction/architecture/&#34;&gt;Tempo 2.x architecture&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In Tempo 3.0, distributors write spans to Kafka instead. &lt;strong&gt;Block-builders&lt;/strong&gt; consume from Kafka and build blocks for object storage. &lt;strong&gt;Live-stores&lt;/strong&gt; consume from Kafka and serve recent-data queries (typically the last 30 minutes to 1 hour). A &lt;strong&gt;backend-scheduler&lt;/strong&gt; and &lt;strong&gt;backend-worker&lt;/strong&gt; replace the compactor for block compaction and retention. Because Kafka provides durability, Tempo 3.0 operates with a replication factor of 1 (RF1), eliminating the need for ingester replication. Ingesters, the scalable single binary (SSB) mode, and the compactor target are removed.&lt;/p&gt;
&lt;p&gt;For a detailed description of the new architecture, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/introduction/architecture/&#34;&gt;Tempo architecture&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;migrate-a-monolithic-deployment&#34;&gt;Migrate a monolithic deployment&lt;/h2&gt;
&lt;p&gt;Monolithic deployments don&amp;rsquo;t require Kafka or any new components beyond the binary upgrade. The distributor pushes spans directly to the in-process metrics-generator (the same as in 2.x), and the live-store handles both serving recent queries and flushing blocks to storage.&lt;/p&gt;
&lt;p&gt;To migrate a monolithic deployment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Migrate your configuration. The simplest way is to use the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo_cli/#migrate-config-command&#34;&gt;&lt;code&gt;tempo-cli migrate config&lt;/code&gt;&lt;/a&gt; command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo-cli migrate config --mode=monolithic old-config.yaml &amp;gt; new-config.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Or update the config manually: remove the &lt;code&gt;ingester:&lt;/code&gt;, &lt;code&gt;ingester_client:&lt;/code&gt;, &lt;code&gt;compactor:&lt;/code&gt;, and &lt;code&gt;metrics_generator_client:&lt;/code&gt; blocks. If your metrics-generator uses the &lt;code&gt;local_blocks&lt;/code&gt; processor, remove it (block building is handled internally by the live-store). All other blocks carry over unchanged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the binary to Tempo 3.0 with the new configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Validate the deployment with 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo-vulture/&#34;&gt;Tempo Vulture&lt;/a&gt;, or by querying historical traces directly to confirm the new deployment can read from your object storage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tempo 3.0 reads both 2.x blocks (RF3) and 3.0 blocks (RF1) automatically, so historical queries work without configuration. TraceQL metrics queries only read RF1 blocks — if your 2.x deployment didn&amp;rsquo;t use the &lt;code&gt;local-blocks&lt;/code&gt; processor, metrics queries only return results for data ingested after the upgrade.&lt;/p&gt;
&lt;p&gt;The rest of this guide covers microservices mode.&lt;/p&gt;
&lt;h2 id=&#34;prepare-for-migration&#34;&gt;Prepare for migration&lt;/h2&gt;
&lt;p&gt;Before deploying Tempo 3.0, configure a Kafka topic and prepare your new configuration.&lt;/p&gt;
&lt;h3 id=&#34;configure-the-kafka-topic&#34;&gt;Configure the Kafka topic&lt;/h3&gt;
&lt;p&gt;Tempo uses a single Kafka topic for all trace data, configured through &lt;code&gt;ingest.kafka.topic&lt;/code&gt;.
You can let Tempo auto-create the topic or create it manually.
For more information, refer to the &lt;a href=&#34;https://kafka.apache.org/documentation/#topicconfigs&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Kafka topic configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To let Tempo create the topic automatically:&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;ingest:
  kafka:
    address: &amp;lt;KAFKA_BROKER_ADDRESS&amp;gt;
    topic: &amp;lt;KAFKA_TOPIC_NAME&amp;gt;
    auto_create_topic_enabled: true
    auto_create_topic_default_partitions: &amp;lt;PARTITION_COUNT&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Your Kafka broker must also have &lt;code&gt;auto.create.topics.enable&lt;/code&gt; set to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-warning&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;&lt;code&gt;auto_create_topic_default_partitions&lt;/code&gt; sets the broker-wide &lt;code&gt;num.partitions&lt;/code&gt; default, which affects all auto-created topics on the broker, not just the Tempo topic. If other services share the same Kafka cluster, consider creating the topic manually instead.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;To create the topic manually, set the partition count based on your expected parallelism. As a starting point, plan for approximately 10 MB/s of peak ingestion throughput per partition.&lt;/p&gt;
&lt;h3 id=&#34;review-configuration-changes&#34;&gt;Review configuration changes&lt;/h3&gt;
&lt;p&gt;Tempo 3.0 removes ingester configuration and adds new configuration blocks. The simplest way to migrate your config is to use the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo_cli/#migrate-config-command&#34;&gt;&lt;code&gt;tempo-cli migrate config&lt;/code&gt;&lt;/a&gt; command, which takes your 2.x config and outputs a valid 3.0 config:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo-cli migrate config --kafka-address=&amp;lt;KAFKA_BROKER_ADDRESS&amp;gt; --kafka-topic=&amp;lt;KAFKA_TOPIC&amp;gt; old-config.yaml &amp;gt; new-config.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The command removes ingester, &lt;code&gt;ingester_client&lt;/code&gt;, compactor, and &lt;code&gt;metrics_generator_client&lt;/code&gt; blocks; adds the &lt;code&gt;ingest:&lt;/code&gt; block in microservices mode; removes &lt;code&gt;local_blocks&lt;/code&gt; processor config; and sets &lt;code&gt;compaction_disabled: true&lt;/code&gt; in the defaults overrides for parallel operation. Review the output before deploying.&lt;/p&gt;
&lt;p&gt;If you prefer to migrate your config manually:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remove&lt;/strong&gt; from your 2.x configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;ingester:&lt;/code&gt; block and all its settings&lt;/li&gt;
&lt;li&gt;Any &lt;code&gt;ingester_client:&lt;/code&gt; configuration&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;compactor:&lt;/code&gt; block (replaced by &lt;code&gt;backend_scheduler:&lt;/code&gt; and &lt;code&gt;backend_worker:&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Any &lt;code&gt;metrics_generator_client:&lt;/code&gt; configuration&lt;/li&gt;
&lt;li&gt;Any &lt;code&gt;local_blocks&lt;/code&gt; processor configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Add&lt;/strong&gt; to your 3.0 configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ingest:&lt;/code&gt; block to connect Tempo to Kafka&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your existing &lt;code&gt;server:&lt;/code&gt;, &lt;code&gt;distributor:&lt;/code&gt;, &lt;code&gt;query_frontend:&lt;/code&gt;, &lt;code&gt;storage:&lt;/code&gt;, &lt;code&gt;memberlist:&lt;/code&gt;, and &lt;code&gt;overrides:&lt;/code&gt; blocks carry over largely unchanged.&lt;/p&gt;
&lt;p&gt;The following example shows the minimum new configuration to add for microservices mode:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;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;ingest:
  kafka:
    address: &amp;lt;KAFKA_BROKER_ADDRESS&amp;gt;
    topic: &amp;lt;KAFKA_TOPIC&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Each block-builder instance consumes from exactly one Kafka partition based on its ordinal: block-builder-0 consumes partition 0, block-builder-1 consumes partition 1, and so on. This means the number of block-builder replicas must equal the number of Kafka partitions.&lt;/p&gt;
&lt;p&gt;To keep block-builder replicas in sync with the partition count, scale them to match the live-store replica count (live-stores also run one replica per partition). You can do this with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;KEDA autoscaler&lt;/strong&gt; that mirrors the live-store pod count. The Tempo Jsonnet library includes this configuration.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://github.com/grafana/rollout-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;strong&gt;Grafana rollout-operator&lt;/strong&gt;&lt;/a&gt; mirroring feature, which keeps one
StatefulSet&amp;rsquo;s replica count in sync with another.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;static replica count&lt;/strong&gt; set to the number of Kafka partitions if your partition count is fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;live_store:&lt;/code&gt; block uses sensible defaults and doesn&amp;rsquo;t require overrides for most deployments.&lt;/p&gt;
&lt;p&gt;If your Kafka cluster requires authentication, add SASL credentials to the &lt;code&gt;ingest&lt;/code&gt; block:&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;ingest:
  kafka:
    address: &amp;lt;KAFKA_BROKER_ADDRESS&amp;gt;
    topic: &amp;lt;KAFKA_TOPIC&amp;gt;
    sasl_username: &amp;lt;USERNAME&amp;gt;
    sasl_password: &amp;lt;PASSWORD&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For the full list of options, refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/#ingest&#34;&gt;Ingest&lt;/a&gt;, 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/#block-builder&#34;&gt;Block-builder&lt;/a&gt;, and 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/#live-store&#34;&gt;Live-store&lt;/a&gt; configuration reference.&lt;/p&gt;
&lt;h4 id=&#34;disable-compaction-during-parallel-operation&#34;&gt;Disable compaction during parallel operation&lt;/h4&gt;
&lt;p&gt;Only one compaction system can safely write to shared storage at a time. Disable compaction in the 3.0 deployment while the 2.x compactors are still running.&lt;/p&gt;
&lt;p&gt;Set &lt;code&gt;compaction_disabled: true&lt;/code&gt; in the defaults and in every per-tenant override in your 3.0 configuration. Overrides don&amp;rsquo;t inherit properties, so each tenant entry must include it explicitly:&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;overrides:
  defaults:
    compaction:
      compaction_disabled: true
  &amp;#34;tenant-a&amp;#34;:
    compaction:
      compaction_disabled: true
  # Repeat for all per-tenant overrides&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You re-enable compaction by removing this override after the 2.x deployment is decommissioned. Refer to &lt;a href=&#34;#clean-up-the-tempo-2x-deployment&#34;&gt;Clean up the Tempo 2.x deployment&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;querying-historical-data&#34;&gt;Querying historical data&lt;/h4&gt;
&lt;p&gt;Tempo 2.x ingesters wrote blocks with replication factor 3 (RF3). Tempo 3.0 block-builders write blocks with replication factor 1 (RF1). After migration, your object storage contains both types. Tempo 3.0 automatically queries the correct blocks based on their replication factor — no additional configuration is needed.&lt;/p&gt;
&lt;p&gt;TraceQL and trace-by-ID queries work across your full history, covering both old RF3 blocks from 2.x and new RF1 blocks from 3.0.&lt;/p&gt;
&lt;p&gt;TraceQL metrics queries only read RF1 blocks. If your 2.x deployment used the &lt;code&gt;local-blocks&lt;/code&gt; processor in the metrics-generator, those RF1 blocks are already in storage and metrics queries cover your full history. If you didn&amp;rsquo;t use the &lt;code&gt;local-blocks&lt;/code&gt; processor, metrics queries only return results for data ingested after the switch to 3.0.&lt;/p&gt;
&lt;h4 id=&#34;metrics-generator&#34;&gt;Metrics-generator&lt;/h4&gt;
&lt;p&gt;In Tempo 3.0, the metrics-generator consumes spans from Kafka in microservices mode. It automatically uses the top-level &lt;code&gt;ingest:&lt;/code&gt; block — no additional Kafka configuration is needed for it.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;local-blocks&lt;/code&gt; processor has been removed — block building is now handled by the block-builder component. Remove any &lt;code&gt;local_blocks&lt;/code&gt; configuration from your metrics-generator settings.&lt;/p&gt;
&lt;p&gt;For more information, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/metrics-from-traces/metrics-generator/&#34;&gt;Metrics-generator&lt;/a&gt;.&lt;/p&gt;
&lt;h5 id=&#34;user-configurable-overrides-config-metrics_generatorprocessors-behavior-change&#34;&gt;User-configurable overrides config &lt;code&gt;metrics_generator.processors&lt;/code&gt; behavior change&lt;/h5&gt;
&lt;p&gt;In Tempo 2.x, &lt;code&gt;metrics_generator.processors&lt;/code&gt; was the only user-configurable override field that OR-merged with the runtime overrides list. In Tempo 3.0, if &lt;code&gt;processors&lt;/code&gt; is set in user-configurable overrides, that will override the runtime &lt;code&gt;metrics_generator.processors&lt;/code&gt; config.&lt;/p&gt;
&lt;p&gt;If you previously relied on runtime override&amp;rsquo;s merge behavior to force-enable a processor (&lt;em&gt;e.g. local-blocks&lt;/em&gt;) for tenants that also use user-configurable overrides, you need to move that processor into each tenant&amp;rsquo;s user-configurable overrides &lt;code&gt;metrics_generator.processors&lt;/code&gt; config.&lt;/p&gt;
&lt;p&gt;Setting &lt;code&gt;processors: []&lt;/code&gt; in user-configurable overrides disables all processors for the tenant.&lt;/p&gt;
&lt;h2 id=&#34;deploy-tempo-30&#34;&gt;Deploy Tempo 3.0&lt;/h2&gt;
&lt;p&gt;Deploy a new Tempo 3.0 instance alongside your existing 2.x deployment. Both deployments must point at the same object storage bucket so the new deployment can query historical blocks.&lt;/p&gt;
&lt;p&gt;For deployment instructions, refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/deploy/&#34;&gt;Deploy Tempo&lt;/a&gt;. For a complete example microservices configuration, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/distributed&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;distributed docker-compose example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To validate the deployment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Deploy Tempo 3.0 using your preferred method with the updated configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm that compaction is disabled in the 3.0 deployment, as described in &lt;a href=&#34;#disable-compaction-during-parallel-operation&#34;&gt;Disable compaction during parallel operation&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that all components start successfully and connect to Kafka. Check that &lt;code&gt;tempo_live_store_ready&lt;/code&gt; equals &lt;code&gt;1&lt;/code&gt;. The log message &lt;code&gt;&amp;quot;live-store ready to serve queries&amp;quot;&lt;/code&gt; confirms the live-store is ready. At this point, no traffic is flowing through the 3.0 distributors yet, so write metrics will be at zero.&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;On a fresh deployment with no traffic flowing yet, the live-store can take up to &lt;code&gt;live_store.readiness_max_wait&lt;/code&gt; (default 30 minutes) to become ready, because there&amp;rsquo;s no Kafka high-water mark to compare against. This is normal. Once traffic starts flowing in the next step, restarts are near-instant.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Validate the deployment end-to-end using 
    &lt;a href=&#34;/docs/tempo/v3.0.x/operations/tempo-vulture/&#34;&gt;Tempo Vulture&lt;/a&gt;, Tempo&amp;rsquo;s built-in testing tool. Vulture writes traces to the distributor and reads them back through the query frontend, validating the full write and read path. Point it at the 3.0 deployment and let it run for 10–15 minutes. Confirm that &lt;code&gt;tempo_vulture_trace_error_total&lt;/code&gt; stays at zero and &lt;code&gt;tempo_vulture_trace_total&lt;/code&gt; is increasing.&lt;/p&gt;
&lt;p&gt;You can also validate manually by querying the 3.0 deployment directly — for example, using &lt;code&gt;curl&lt;/code&gt; against the query frontend API or querying from Grafana:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl http://&amp;lt;TEMPO_3_QUERY_FRONTEND&amp;gt;:3200/api/traces/&amp;lt;TRACE_ID&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Use a trace ID that you know exists in your 2.x deployment. If the query returns trace data, the new deployment is reading from storage correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Before proceeding to the cutover, confirm all of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tempo_live_store_ready&lt;/code&gt; equals &lt;code&gt;1&lt;/code&gt; on every live-store replica.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rate(tempo_block_builder_fetch_errors_total[5m])&lt;/code&gt; is at or near zero on every block-builder.&lt;/li&gt;
&lt;li&gt;Vulture has been running for 10–15 minutes with &lt;code&gt;tempo_vulture_trace_error_total&lt;/code&gt; at zero and &lt;code&gt;tempo_vulture_trace_total&lt;/code&gt; increasing.&lt;/li&gt;
&lt;li&gt;At least one trace-by-ID query for a trace that exists in your 2.x deployment returns data when sent to the 3.0 query frontend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Resolve any issues so all of these conditions are satisfied. Switching traffic with an unhealthy 3.0 deployment risks data loss for newly ingested traces.&lt;/p&gt;
&lt;h2 id=&#34;switch-traffic-to-tempo-30&#34;&gt;Switch traffic to Tempo 3.0&lt;/h2&gt;
&lt;p&gt;Redirect your trace clients to send data to the Tempo 3.0 deployment. Trace clients include OpenTelemetry Collectors, Grafana Alloy instances, or other exporters configured to send spans to Tempo.&lt;/p&gt;
&lt;p&gt;To switch traffic to the 3.0 deployment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If your routing layer supports gradual traffic shifting, start by sending a small percentage of traffic to the 3.0 deployment and monitor for errors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once canary traffic is stable, update your routing to send all traffic to the 3.0 deployment. This is typically a DNS record change, load balancer update, or collector configuration change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Monitor the 3.0 deployment. Confirm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tempo_distributor_kafka_write_bytes_total&lt;/code&gt; is increasing steadily.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tempo_block_builder_fetch_records_total&lt;/code&gt; is increasing and &lt;code&gt;tempo_block_builder_fetch_errors_total&lt;/code&gt; is at zero.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tempo_live_store_ready&lt;/code&gt; equals &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;tempo_live_store_records_processed_total&lt;/code&gt; is increasing.&lt;/li&gt;
&lt;li&gt;Queries return results for newly ingested traces.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm traffic has drained from the 2.x deployment. Check the 2.x distributor metrics to verify it&amp;rsquo;s no longer receiving requests.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Before proceeding to cleanup, confirm that the 3.0 deployment is handling all traffic and the 2.x deployment shows zero active requests.&lt;/p&gt;
&lt;h2 id=&#34;clean-up-the-tempo-2x-deployment&#34;&gt;Clean up the Tempo 2.x deployment&lt;/h2&gt;
&lt;p&gt;After traffic has fully moved to the 3.0 deployment, decommission the old deployment.&lt;/p&gt;
&lt;p&gt;To clean up the 2.x deployment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Wait for the 2.x ingesters to flush all in-memory traces to object storage. With default settings (&lt;code&gt;max_block_duration&lt;/code&gt; of 30 minutes and &lt;code&gt;complete_block_timeout&lt;/code&gt; of 15 minutes), this takes up to approximately 45 minutes. If you&amp;rsquo;ve customized these values, add your &lt;code&gt;max_block_duration&lt;/code&gt; and &lt;code&gt;complete_block_timeout&lt;/code&gt; together to estimate the wait.&lt;/p&gt;
&lt;p&gt;To confirm the ingesters are drained, check these metrics on the 2.x deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tempo_ingester_live_traces&lt;/code&gt; should drop to zero (or near zero) — no traces remain in memory.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tempo_ingester_flush_queue_length&lt;/code&gt; should be zero — no pending flushes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scale the 2.x compactors to zero and remove the &lt;code&gt;compaction_disabled&lt;/code&gt; override from the 3.0 deployment to re-enable compaction. Running without compaction for extended periods can cause the blocklist to grow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once you&amp;rsquo;re confident the 3.0 deployment is stable, scale all 2.x components to zero and decommission the old infrastructure. Don&amp;rsquo;t delete the shared object storage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review your backend-worker replica count. The overlap period may have produced additional blocks that require compaction. Once the backlog clears, reduce backend-workers to your steady-state configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;verify-the-migration&#34;&gt;Verify the migration&lt;/h2&gt;
&lt;p&gt;After completing the migration, confirm the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Distributors are writing to Kafka. Verify that &lt;code&gt;tempo_distributor_kafka_write_bytes_total&lt;/code&gt; is increasing and &lt;code&gt;tempo_distributor_kafka_write_latency_seconds&lt;/code&gt; is within an acceptable range.&lt;/li&gt;
&lt;li&gt;Block-builders are consuming from Kafka and building blocks. Verify that &lt;code&gt;tempo_block_builder_fetch_records_total&lt;/code&gt; is increasing and &lt;code&gt;tempo_block_builder_fetch_errors_total&lt;/code&gt; is at zero.&lt;/li&gt;
&lt;li&gt;Live-stores are serving recent-data queries. Verify that &lt;code&gt;tempo_live_store_ready&lt;/code&gt; equals &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;tempo_live_store_records_processed_total&lt;/code&gt; is increasing. Confirm &lt;code&gt;tempo_live_store_records_dropped_total&lt;/code&gt; is at zero.&lt;/li&gt;
&lt;li&gt;Kafka lag is within an acceptable range. Check &lt;code&gt;tempo_ingest_group_partition_lag_seconds&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Historical queries return results from object storage.&lt;/li&gt;
&lt;li&gt;Backend-workers are running in the 3.0 deployment and compacting blocks.&lt;/li&gt;
&lt;li&gt;If you use the metrics-generator, it&amp;rsquo;s producing metrics from Kafka-sourced trace data.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;roll-back&#34;&gt;Roll back&lt;/h2&gt;
&lt;p&gt;Rolling back depends on how far the migration has progressed.&lt;/p&gt;
&lt;h3 id=&#34;before-switching-traffic&#34;&gt;Before switching traffic&lt;/h3&gt;
&lt;p&gt;The 2.x deployment is still active and serving all traffic. No rollback is needed. Stop the 3.0 deployment.&lt;/p&gt;
&lt;h3 id=&#34;after-switching-traffic-before-decommissioning-2x&#34;&gt;After switching traffic, before decommissioning 2.x&lt;/h3&gt;
&lt;p&gt;Revert the traffic routing change to point clients back to the 2.x deployment. Because the cutover is a routing change (DNS, load balancer, or collector config), this is near-instant. Both deployments share the same object storage, so historical data remains available. Traces ingested by the 3.0 deployment into Kafka may not be queryable from the 2.x deployment if block-builders haven&amp;rsquo;t flushed them to storage yet.&lt;/p&gt;
&lt;h3 id=&#34;after-decommissioning-2x&#34;&gt;After decommissioning 2.x&lt;/h3&gt;
&lt;p&gt;Rolling back requires redeploying the 2.x infrastructure. Blocks written by the 3.0 block-builders remain in object storage and are readable by both versions, assuming they use a compatible block format (vParquet4 or later).&lt;/p&gt;
&lt;h2 id=&#34;troubleshoot-the-migration&#34;&gt;Troubleshoot the migration&lt;/h2&gt;
&lt;p&gt;This section covers common issues you might encounter during the migration.&lt;/p&gt;
&lt;h3 id=&#34;kafka-connection-failure&#34;&gt;Kafka connection failure&lt;/h3&gt;
&lt;p&gt;Tempo logs errors such as &lt;code&gt;&amp;quot;the Kafka address has not been configured&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;ping kafka; will retry&amp;quot;&lt;/code&gt;, or &lt;code&gt;&amp;quot;kafka broker not ready after 10 retries&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To resolve this issue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verify that &lt;code&gt;ingest.kafka.address&lt;/code&gt; in your configuration points to the correct broker address.&lt;/li&gt;
&lt;li&gt;Confirm the broker is reachable from the Tempo deployment. Check network connectivity and firewall rules.&lt;/li&gt;
&lt;li&gt;If you use SASL authentication, verify that both &lt;code&gt;sasl_username&lt;/code&gt; and &lt;code&gt;sasl_password&lt;/code&gt; are set. Setting only one produces the error &lt;code&gt;&amp;quot;the SASL username and password must be both configured to enable SASL authentication&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;block-builder-not-consuming&#34;&gt;Block-builder not consuming&lt;/h3&gt;
&lt;p&gt;Tempo logs errors such as &lt;code&gt;&amp;quot;no partitions assigned&amp;quot;&lt;/code&gt; or &lt;code&gt;&amp;quot;failed to create kafka reader client&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To resolve this issue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verify the Kafka topic exists and contains data.&lt;/li&gt;
&lt;li&gt;Check the &lt;code&gt;tempo_block_builder_owned_partitions&lt;/code&gt; metric to confirm the block-builder has partition assignments.&lt;/li&gt;
&lt;li&gt;Verify the block-builder can reach the Kafka broker.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;live-store-not-ready&#34;&gt;Live-store not ready&lt;/h3&gt;
&lt;p&gt;Queries return errors with &lt;code&gt;&amp;quot;live-store is starting&amp;quot;&lt;/code&gt; or the live-store logs show &lt;code&gt;&amp;quot;failed to catch up&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The live-store needs time to catch up with Kafka after startup. To monitor progress:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check the &lt;code&gt;tempo_live_store_ready&lt;/code&gt; metric. A value of &lt;code&gt;1&lt;/code&gt; indicates the live-store is ready to serve queries.&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;tempo_live_store_catch_up_duration_seconds&lt;/code&gt; to monitor catch-up progress.&lt;/li&gt;
&lt;li&gt;The log message &lt;code&gt;&amp;quot;live-store ready to serve queries&amp;quot;&lt;/code&gt; confirms readiness.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;historical-queries-return-no-results&#34;&gt;Historical queries return no results&lt;/h3&gt;
&lt;p&gt;Queries for traces that existed in your 2.x deployment return empty results from the 3.0 deployment.&lt;/p&gt;
&lt;p&gt;To resolve this issue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verify that the 3.0 deployment uses the same object storage configuration (bucket, endpoint, credentials) as the 2.x deployment.&lt;/li&gt;
&lt;li&gt;Confirm that the storage backend is reachable from the 3.0 deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/upgrade/&#34;&gt;Upgrade your Tempo installation&lt;/a&gt; for version-specific breaking changes and removed configuration parameters.&lt;/li&gt;
&lt;li&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/introduction/architecture/&#34;&gt;Tempo architecture&lt;/a&gt; for details on how block-builders, live-stores, and Kafka interact.&lt;/li&gt;
&lt;li&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/&#34;&gt;Configuration&lt;/a&gt; for the full configuration reference, including all &lt;code&gt;ingest:&lt;/code&gt;, &lt;code&gt;block_builder:&lt;/code&gt;, and &lt;code&gt;live_store:&lt;/code&gt; parameters.&lt;/li&gt;
&lt;li&gt;Refer to 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/plan/&#34;&gt;Plan your deployment&lt;/a&gt; for guidance on deployment modes and sizing in Tempo 3.0.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="migrate-from-tempo-2x-to-30">Migrate from Tempo 2.x to 3.0&lt;/h1>
&lt;p>Grafana Tempo 3.0 introduces a new architecture that replaces ingesters with a Kafka-based ingest path.
Distributors write trace data to Kafka, and two new components consume from it: block-builders create blocks for long-term object storage, and live-stores serve recent-data queries. A backend-scheduler and backend-worker replace the compactor for block maintenance.&lt;/p></description></item><item><title>Command line flags</title><link>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/command-line-flags/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/command-line-flags/</guid><content><![CDATA[&lt;h1 id=&#34;command-line-flags&#34;&gt;Command line flags&lt;/h1&gt;
&lt;p&gt;Tempo provides various command-line flags to configure its behavior when starting the binary. This document serves as a reference for these flags.&lt;/p&gt;
&lt;h2 id=&#34;global-flags&#34;&gt;Global flags&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--version&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Print this build&amp;rsquo;s version information and exit&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--mutex-profile-fraction&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Override default mutex profiling fraction&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--block-profile-threshold&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Override default block profiling threshold&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--config.file&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Configuration file to load&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--config.expand-env&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Whether to expand environment variables in config file&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--config.verify&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Verify configuration and exit&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;target-flag&#34;&gt;Target flag&lt;/h2&gt;
&lt;p&gt;The deployment mode is determined by the runtime configuration &lt;code&gt;target&lt;/code&gt;, or
by using the &lt;code&gt;-target&lt;/code&gt; flag on the command line.
The default target is &lt;code&gt;all&lt;/code&gt;, which runs all components in a single process (monolithic deployment mode).&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--target&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Target module to run&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;Valid target values:&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;Target&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;all&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Monolithic mode. Runs all components in a single process.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;distributor&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Receives and distributes trace data to downstream components.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;metrics-generator&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Generates metrics from ingested trace data.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;querier&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Queries the backend storage for traces and metrics.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;query-frontend&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Provides search API and splits queries for parallelism.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;block-builder&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Consumes data from Kafka and writes blocks to backend storage.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;backend-scheduler&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Schedules and coordinates backend query jobs across workers.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;backend-worker&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Executes query jobs assigned by the backend scheduler.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;live-store&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Serves recently ingested data from Kafka for real-time queries.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&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;In Tempo 3.0, the &lt;code&gt;ingester&lt;/code&gt;, &lt;code&gt;compactor&lt;/code&gt;, and &lt;code&gt;scalable-single-binary&lt;/code&gt; targets were removed as part of the new 
    &lt;a href=&#34;/docs/tempo/v3.0.x/introduction/architecture/&#34;&gt;Tempo architecture&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;Refer to the &lt;a href=&#34;../plan/&#34;&gt;Plan your Tempo deployment&lt;/a&gt; documentation for information on deployment modes.&lt;/p&gt;
&lt;h2 id=&#34;authentication-and-multitenancy&#34;&gt;Authentication and multitenancy&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--multitenancy.enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Set to true to enable multitenancy&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--auth.enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;strong&gt;Deprecated. Use &lt;code&gt;--multitenancy.enabled&lt;/code&gt; instead.&lt;/strong&gt; Set to true to enable auth. This flag will be removed in a future release.&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;http-and-api-settings&#34;&gt;HTTP and API settings&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--http-api-prefix&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;String prefix for all HTTP API endpoints&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--enable-go-runtime-metrics&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Set to true to enable all Go runtime metrics&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--shutdown-delay&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;How long to wait between SIGTERM and shutdown. After receiving SIGTERM, Tempo reports not-ready status via the &lt;code&gt;/ready&lt;/code&gt; endpoint.&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;span-profiling&#34;&gt;Span profiling&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--span-profiling&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Enable span profiling via &lt;code&gt;otelpyroscope&lt;/code&gt;. When enabled, Tempo attaches pprof goroutine labels (&lt;code&gt;span_id&lt;/code&gt;, &lt;code&gt;span_name&lt;/code&gt;) to OTel spans and adds a &lt;code&gt;pyroscope.profile.id&lt;/code&gt; attribute to root spans, enabling profile-to-trace correlation in Pyroscope. Requires an OTLP exporter to be configured through environment variables (&lt;code&gt;OTEL_TRACES_EXPORTER&lt;/code&gt;, &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;, or &lt;code&gt;OTEL_EXPORTER_OTLP_TRACES_ENDPOINT&lt;/code&gt;).&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;You can also set this option in 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;span_profiling: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;health-check&#34;&gt;Health check&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--health&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Run a health check against the &lt;code&gt;/ready&lt;/code&gt; endpoint and exit. Returns exit code &lt;code&gt;0&lt;/code&gt; if healthy, &lt;code&gt;1&lt;/code&gt; if unhealthy.&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--health.url&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;URL to check when running a health check&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;http://localhost:3200/ready&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;The Tempo container image uses a 
    &lt;a href=&#34;/docs/tempo/v3.0.x/set-up-for-tracing/setup-tempo/upgrade/#busybox-removed-from-tempo-image&#34;&gt;distroless base image&lt;/a&gt; that doesn&amp;rsquo;t include a shell, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt;, or other utilities. This means the common Docker health check pattern &lt;code&gt;HEALTHCHECK CMD curl -f http://localhost:3200/ready&lt;/code&gt; doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;--health&lt;/code&gt; flag provides a native alternative. It doesn&amp;rsquo;t require a Tempo configuration file, so it can be used directly in a &lt;code&gt;HEALTHCHECK&lt;/code&gt; instruction:&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;dockerfile&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-dockerfile&#34;&gt;HEALTHCHECK CMD [&amp;#34;/tempo&amp;#34;, &amp;#34;--health&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Kubernetes users typically don&amp;rsquo;t need this flag because they can configure &lt;code&gt;httpGet&lt;/code&gt; readiness and liveness probes directly against the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/api_docs/#readiness-probe&#34;&gt;&lt;code&gt;/ready&lt;/code&gt; endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;logging-settings&#34;&gt;Logging settings&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--log.level&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Only log messages with the given severity or above. Valid levels: &lt;code&gt;debug&lt;/code&gt;, &lt;code&gt;info&lt;/code&gt;, &lt;code&gt;warn&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;info&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--log.format&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Output format for log messages. Valid formats: &lt;code&gt;logfmt&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;logfmt&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;server-settings&#34;&gt;Server settings&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--server.http-listen-port&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;HTTP server listen port&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;3200&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--server.grpc-listen-port&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;gRPC server listen port&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;9095&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;memberlist-settings&#34;&gt;Memberlist settings&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--memberlist.host-port&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Host port to connect to memberlist cluster&lt;/td&gt;
              &lt;td&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--memberlist.bind-port&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Port for memberlist to communicate on&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;7946&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--memberlist.message-history-buffer-bytes&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Size in bytes for the message history buffer&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;mcp-server&#34;&gt;MCP server&lt;/h2&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;Flag&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
              &lt;th&gt;Default&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;--query-frontend.mcp-server.enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Set to true to enable the MCP server&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;Tempo includes an &lt;a href=&#34;https://modelcontextprotocol.io/docs/getting-started/intro&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MCP (Model Context Protocol)&lt;/a&gt; server that provides AI assistants and Large Language Models (LLMs) with direct access to distributed tracing data through TraceQL queries and other endpoints.&lt;/p&gt;
&lt;p&gt;Refer to the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/api_docs/mcp-server/&#34;&gt;Model Context Protocol (MCP) Server documentation&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id=&#34;module-configuration&#34;&gt;Module configuration&lt;/h2&gt;
&lt;p&gt;You can use additional flags to configure individual Tempo modules, such as the distributor, block-builder, live-store, querier, backend-scheduler, backend-worker, and their components.
These flags follow a pattern like &lt;code&gt;--&amp;lt;module&amp;gt;.&amp;lt;setting&amp;gt;&lt;/code&gt; and are documented in the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/&#34;&gt;configuration file format&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use the configuration file approach described in the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/configuration/&#34;&gt;Configuration documentation&lt;/a&gt;.
The documentation has a comprehensive list of all configuration options.&lt;/p&gt;
&lt;h2 id=&#34;usage-examples&#34;&gt;Usage examples&lt;/h2&gt;
&lt;p&gt;Start Tempo with a 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;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --config.file=/etc/tempo/config.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Start Tempo with a specific target:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --target=distributor --config.file=/etc/tempo/config.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Verify configuration without starting Tempo:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --config.file=/etc/tempo/config.yaml --config.verify&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Print version information:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --version&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Start Tempo with debug-level logging for troubleshooting:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --config.file=/etc/tempo/config.yaml --log.level=debug&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Use environment variable expansion in the config file, which lets you inject secrets or environment-specific values at startup:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --config.file=/etc/tempo/config.yaml --config.expand-env&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Start the distributor component on a custom HTTP port with JSON-formatted logs, typical for a microservices deployment behind a load balancer:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --target=distributor \
  --config.file=/etc/tempo/config.yaml \
  --server.http-listen-port=3200 \
  --log.format=json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Start Tempo in monolithic mode with multitenancy enabled and a graceful shutdown delay of 30 seconds, allowing in-flight requests to complete during rolling updates:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --config.file=/etc/tempo/config.yaml \
  --multitenancy.enabled \
  --shutdown-delay=30s&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Run a health check against a custom URL:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;tempo --health --health.url=http://localhost:3200/ready&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="command-line-flags">Command line flags&lt;/h1>
&lt;p>Tempo provides various command-line flags to configure its behavior when starting the binary. This document serves as a reference for these flags.&lt;/p></description></item></channel></rss>