<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/v2.2.x/setup/</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/v2.2.x/setup/index.xml" rel="self" type="application/rss+xml"/><item><title>Plan your Tempo deployment</title><link>https://grafana.com/docs/tempo/v2.2.x/setup/deployment/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/setup/deployment/</guid><content><![CDATA[&lt;h1 id=&#34;plan-your-tempo-deployment&#34;&gt;Plan your Tempo deployment&lt;/h1&gt;
&lt;p&gt;Tempo can be deployed in &lt;em&gt;monolithic&lt;/em&gt; or &lt;em&gt;microservices&lt;/em&gt; modes.&lt;/p&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 is the monolithic deployment mode.&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;&lt;em&gt;Monolithic mode&lt;/em&gt; was previously called &lt;em&gt;single binary mode&lt;/em&gt;. Similarly &lt;em&gt;scalable monolithic mode&lt;/em&gt; was previously called &lt;em&gt;scalable single binary mode&lt;/em&gt;. While the documentation has been updated to reflect this change, some URL names and deployment tooling (for example, Helm charts) do not yet reflect this change.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;monolithic-mode&#34;&gt;Monolithic mode&lt;/h2&gt;
&lt;p&gt;Monolithic mode deployment runs all top-level components in a single
process, forming an instance of Tempo.  The monolithic mode is the simplest
to deploy, but can not horizontally scale out by increasing the quantity of
components.  Refer to &lt;a href=&#34;../../operations/architecture/&#34;&gt;Architecture&lt;/a&gt; for
descriptions of the components.&lt;/p&gt;
&lt;p&gt;To enable this mode, &lt;code&gt;-target=all&lt;/code&gt; is used, which is the default.&lt;/p&gt;
&lt;p&gt;Find docker-compose deployment examples at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/local&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/grafana/tempo/tree/main/example/docker-compose/local&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/s3&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/grafana/tempo/tree/main/example/docker-compose/s3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;scaling-monolithic-mode&#34;&gt;Scaling monolithic mode&lt;/h3&gt;
&lt;p&gt;Monolithic mode can be horizontally scaled out.
This scalable monolithic mode is similar to the monolithic mode in that all components are run within one process.
Horizontal scale out is achieved by instantiating more than one process, with each having &lt;code&gt;-target&lt;/code&gt; set to &lt;code&gt;scalable-single-binary&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This mode offers some flexibility of scaling without the configuration complexity of the full
microservices deployment.&lt;/p&gt;
&lt;p&gt;Each of the &lt;code&gt;queriers&lt;/code&gt; perform a DNS lookup for the &lt;code&gt;frontend_address&lt;/code&gt; and connect to the addresses found within the DNS record.&lt;/p&gt;
&lt;p&gt;Find a docker-compose deployment example at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/scalable-single-binary&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/grafana/tempo/tree/main/example/docker-compose/scalable-single-binary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;microservices-mode&#34;&gt;Microservices mode&lt;/h2&gt;
&lt;p&gt;In microservices mode, components are deployed in distinct processes.
Scaling is per component, which allows for greater flexibility in scaling and more
granular failure domains. This is the preferred method for a production
deployment, but it is also the most complex.&lt;/p&gt;
&lt;p&gt;The configuration associated with each component&amp;rsquo;s deployment specifies a
&lt;code&gt;target&lt;/code&gt;. For example, to deploy a &lt;code&gt;querier&lt;/code&gt;, the configuration would contain
&lt;code&gt;target: querier&lt;/code&gt;.  A command-line deployment may specify the &lt;code&gt;-target=querier&lt;/code&gt;
flag. Each of the components referenced in &lt;a href=&#34;../../operations/architecture/&#34;&gt;Architecture&lt;/a&gt; must be deployed in order to get a working Tempo
instance.&lt;/p&gt;
&lt;p&gt;Find a docker-compose deployment example at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&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;https://github.com/grafana/tempo/tree/main/example/docker-compose/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tools-used-to-deploy-tempo&#34;&gt;Tools used to deploy Tempo&lt;/h2&gt;
&lt;p&gt;Tempo can be easily deployed through a number of tools, including Helm, Tanka, Kubernetes, and Docker.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The 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;h3 id=&#34;helm&#34;&gt;Helm&lt;/h3&gt;
&lt;p&gt;Helm charts are available in the &lt;code&gt;grafana/helm-charts&lt;/code&gt; repository:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/helm-charts/tree/main/charts/tempo&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;monolithic mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/helm-charts/tree/main/charts/tempo-distributed&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;microservices mode&lt;/a&gt; and &lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/&#34;&gt;&lt;code&gt;tempo-distributed&lt;/code&gt; chart documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, several Helm chart examples are available in the Tempo repository.&lt;/p&gt;
&lt;h3 id=&#34;kubernetes-tempo-operator&#34;&gt;Kubernetes Tempo Operator&lt;/h3&gt;
&lt;p&gt;The operator is available in &lt;a href=&#34;https://github.com/grafana/tempo-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;grafana/tempo-operator&lt;/a&gt; repository.
The operator reconciles &lt;code&gt;TempoStack&lt;/code&gt; resource to deploy and manage Tempo microservices installation.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&#34;../operator/&#34;&gt;operator documentation&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h3 id=&#34;tankajsonnet&#34;&gt;Tanka/Jsonnet&lt;/h3&gt;
&lt;p&gt;The Jsonnet files that you need to deploy Tempo with Tanka are available here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/operations/jsonnet/single-binary&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;monolithic mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/operations/jsonnet/microservices&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;microservices mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a few &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/tk&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;examples&lt;/a&gt; that use official Jsonnet files.
They display the full range of configurations available to Tempo.&lt;/p&gt;
&lt;h3 id=&#34;kubernetes-manifests&#34;&gt;Kubernetes manifests&lt;/h3&gt;
&lt;p&gt;You can find a collection of Kubernetes manifests to deploy Tempo in the
&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/operations/jsonnet-compiled&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;operations/jsonnet-compiled&lt;/a&gt;
folder.  These are generated using the Tanka/Jsonnet.&lt;/p&gt;
]]></content><description>&lt;h1 id="plan-your-tempo-deployment">Plan your Tempo deployment&lt;/h1>
&lt;p>Tempo can be deployed in &lt;em>monolithic&lt;/em> or &lt;em>microservices&lt;/em> modes.&lt;/p>
&lt;p>The deployment mode is determined by the runtime configuration &lt;code>target&lt;/code>, or
by using the &lt;code>-target&lt;/code> flag on the command line. The default target is &lt;code>all&lt;/code>,
which is the monolithic deployment mode.&lt;/p></description></item><item><title>Upgrade your Tempo installation</title><link>https://grafana.com/docs/tempo/v2.2.x/setup/upgrade/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/setup/upgrade/</guid><content><![CDATA[&lt;h1 id=&#34;upgrade-your-tempo-installation&#34;&gt;Upgrade your Tempo installation&lt;/h1&gt;
&lt;p&gt;You can upgrade an existing Tempo installation to the next version. However, any new release has the potential to have breaking changes that should be tested in a non-production environment prior to rolling these changes to production.&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 on-premise installations and not for Grafana Cloud.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: You can check your configuration options using the &lt;a href=&#34;../../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;h2 id=&#34;upgrade-to-tempo-22&#34;&gt;Upgrade to Tempo 2.2&lt;/h2&gt;
&lt;p&gt;Tempo 2.2 has several considerations for any upgrade:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vParquet2 is now the default block format&lt;/li&gt;
&lt;li&gt;Several configuration parameters have been renamed or removed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a complete list of changes, enhancements, and bug fixes, refer to the &lt;a href=&#34;https://github.com/grafana/tempo/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo 2.2 changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;default-block-format-changed-to-vparquet2&#34;&gt;Default block format changed to vParquet2&lt;/h3&gt;
&lt;p&gt;While not a breaking change, upgrading to Tempo 2.2 will by default change Tempo’s block format to vParquet2.&lt;/p&gt;
&lt;p&gt;To stay on a previous block format, read the&lt;a href=&#34;../../configuration/parquet/#choose-a-different-block-format&#34;&gt;Parquet configuration documentation&lt;/a&gt;.
We strongly encourage upgrading to vParquet2 as soon as possible as this is required for using structural operators in your TraceQL queries and provides query performance improvements, in particular on queries using the &lt;code&gt;duration&lt;/code&gt; intrinsic.&lt;/p&gt;
&lt;h3 id=&#34;updated-jsonnet-supports-statefulset-for-the-metrics-generator&#34;&gt;Updated JSonnet supports &lt;code&gt;statefulset&lt;/code&gt; for the metrics-generator&lt;/h3&gt;
&lt;p&gt;Tempo 2.2 updates the &lt;code&gt;microservices&lt;/code&gt; JSonnet to support a &lt;code&gt;statefulset&lt;/code&gt; for the &lt;code&gt;metrics_generator&lt;/code&gt; component.&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;This update is important if you use the experimental &lt;code&gt;local-blocks&lt;/code&gt; processor.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;To support a new &lt;code&gt;processor&lt;/code&gt;, the metrics-generator has been converted from a &lt;code&gt;deployment&lt;/code&gt; into a &lt;code&gt;statefulset&lt;/code&gt; with a PVC.
This requires manual intervention to migrate successfully and avoid downtime.
Note that currently both a &lt;code&gt;deployment&lt;/code&gt; and a &lt;code&gt;statefulset&lt;/code&gt; will be managed by the JSonnet for a period of time, after which we will delete the deployment from this repo and you will need to delete user-side references to the &lt;code&gt;tempo_metrics_generator_deployment&lt;/code&gt;, as well as delete the deployment itself.&lt;/p&gt;
&lt;p&gt;Refer to the PR for seamless migration instructions. [PRs &lt;a href=&#34;https://github.com/grafana/tempo/pull/2533&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2533&lt;/a&gt;, &lt;a href=&#34;https://github.com/grafana/tempo/pull/2467&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2467&lt;/a&gt;]&lt;/p&gt;
&lt;h3 id=&#34;removed-or-renamed-configuration-parameters&#34;&gt;Removed or renamed configuration parameters&lt;/h3&gt;
&lt;p&gt;The following fields were removed or renamed.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;query_frontend:&lt;br&gt;  tolerate_failed_blocks: &lt;int&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Remove support for &lt;code&gt;tolerant_failed_blocks&lt;/code&gt; [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2416&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2416&lt;/a&gt;]&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;storage:&lt;br&gt;  trace:&lt;br&gt;  s3:&lt;br&gt;  insecure_skip_verify: true  // renamed to tls_insecure_skip_verify&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed &lt;code&gt;insecure_skip_verify&lt;/code&gt; to &lt;code&gt;tls_insecure_skip_verify&lt;/code&gt; [&lt;a href=&#34;https://github.com/grafana/tempo/pull/2407&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PR 2407&lt;/a&gt;]&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;upgrade-to-tempo-21&#34;&gt;Upgrade to Tempo 2.1&lt;/h2&gt;
&lt;p&gt;Tempo 2.1 has two major considerations for any upgrade:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for search on v2 block is removed&lt;/li&gt;
&lt;li&gt;Breaking changes to metric names&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information on other enhancements, read the &lt;a href=&#34;../../release-notes/v2-1/&#34;&gt;Tempo 2.1 release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;remove-support-for-search-on-v2-blocks&#34;&gt;Remove support for Search on v2 blocks&lt;/h3&gt;
&lt;p&gt;Users can no longer search blocks in v2 format. Only vParquet and vParquet2 formats support search. The following search configuration options were removed from the overrides section:&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;overrides:
  max_search_bytes_per_trace:
  search_tags_allow_list:
  search_tags_deny_list:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following metrics configuration was also removed:&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;tempo_ingester_trace_search_bytes_discarded_total&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;upgrade-path-to-maintain-search-from-tempo-1x-to-21&#34;&gt;Upgrade path to maintain search from Tempo 1.x to 2.1&lt;/h3&gt;
&lt;p&gt;Removing support for search on v2 blocks means that if you upgrade directly from 1.9 to 2.1, you will not be able to search your v2 blocks. To avoid this, upgrade to 2.0 first, since 2.0 supports searching both v2 and vParquet blocks. You can let your old v2 blocks gradually age out while Tempo creates new vParquet blocks from incoming traces. Once all of your v2 blocks have been deleted and you only have vParquet format-blocks, you can upgrade to Tempo 2.1. All of your blocks will be searchable.&lt;/p&gt;
&lt;p&gt;Parquet files are no longer cached when carrying out searches.&lt;/p&gt;
&lt;h3 id=&#34;breaking-changes-to-metric-names-exposed-by-tempo&#34;&gt;Breaking changes to metric names exposed by Tempo&lt;/h3&gt;
&lt;p&gt;All Prometheus metrics exposed by Tempo on its &lt;code&gt;/metrics&lt;/code&gt; endpoint that were previously prefixed  with &lt;code&gt;cortex_&lt;/code&gt; have now been renamed to be prefixed with &lt;code&gt;tempo_&lt;/code&gt; instead. (PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2204&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2204&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Tempo now includes SLO metrics to count where queries are returned within a configurable time range. (PR &lt;a href=&#34;https://github.com/grafana/tempo/pull/2008&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;2008&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;query_frontend_result_metrics_inspected_bytes&lt;/code&gt; metric was removed in favor of ``query_frontend_bytes_processed_per_second&lt;code&gt;.&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;upgrade-from-tempo-15-to-20&#34;&gt;Upgrade from Tempo 1.5 to 2.0&lt;/h2&gt;
&lt;p&gt;Tempo 2.0 marks a major milestone in Tempo’s development. When planning your upgrade, consider these factors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Breaking changes:
&lt;ul&gt;
&lt;li&gt;Renamed, removed, and moved configurations are described in section below.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;TempoRequestErrors&lt;/code&gt; alert was removed from mixin. Any Jsonnet users relying on this alert should copy this into their own environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Advisory:
&lt;ul&gt;
&lt;li&gt;Changed defaults – Are these updates relevant for your installation?&lt;/li&gt;
&lt;li&gt;TraceQL editor needs to be enabled in Grafana to use the query editor.&lt;/li&gt;
&lt;li&gt;Resource requirements have changed for Tempo 2.0 with the default configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you upgrade to Tempo 2.0, there is no path to downgrade.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: There is a potential issue loading Tempo 1.5&amp;rsquo;s experimental Parquet storage blocks. You may see errors or even panics in the compactors. We have only been able to reproduce this with interim commits between 1.5 and 2.0, but if you experience any issues please &lt;a href=&#34;https://github.com/grafana/tempo/issues/new?assignees=&amp;amp;labels=&amp;amp;template=bug_report.md&amp;amp;title=&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;report them&lt;/a&gt; so we can isolate and fix this issue.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;check-tempo-installation-resource-allocation&#34;&gt;Check Tempo installation resource allocation&lt;/h3&gt;
&lt;p&gt;Parquet provides faster search and is required to enable TraceQL. However, the Tempo installation will require additional CPU and memory resources to use Parquet efficiently. Parquet is more costly due to the extra work of building the columnar blocks, and operators should expect at least 1.5x increase in required resources to run a Tempo 2.0 cluster. Most users will find these extra resources are negligible compared to the benefits that come from the additional features of TraceQL and from storing traces in an open format.&lt;/p&gt;
&lt;p&gt;You can can continue using the previous &lt;code&gt;v2&lt;/code&gt; block format using the instructions provided in the &lt;a href=&#34;../../configuration/parquet/&#34;&gt;Parquet configuration documentation&lt;/a&gt;. Tempo will continue to support trace by id lookup on the &lt;code&gt;v2&lt;/code&gt; format for the foreseeable future.&lt;/p&gt;
&lt;h3 id=&#34;enable-traceql-in-grafana&#34;&gt;Enable TraceQL in Grafana&lt;/h3&gt;
&lt;p&gt;TraceQL is enabled by default in Tempo 2.0. The TraceQL query editor requires Grafana 9.3.2 and later.&lt;/p&gt;
&lt;p&gt;The TraceQL query editor is in beta in Grafana 9.3.2 and needs to be enabled with the &lt;code&gt;traceqlEditor&lt;/code&gt; feature flag.&lt;/p&gt;
&lt;h3 id=&#34;check-configuration-options-for-removed-and-renamed-options&#34;&gt;Check configuration options for removed and renamed options&lt;/h3&gt;
&lt;p&gt;The following tables describe the parameters that have been removed or renamed.&lt;/p&gt;
&lt;h4 id=&#34;removed-and-replaced&#34;&gt;Removed and replaced&lt;/h4&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;query_frontend:&lt;br&gt;  query_shards:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Replaced by &lt;code&gt;trace_by_id.query_shards&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;querier:&lt;br&gt;  query_timeout:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Replaced by two different settings: &lt;code&gt;search.query_timeout&lt;/code&gt; and &lt;code&gt;trace_by_id.query_timeout&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;ingester:&lt;br&gt;  use_flatbuffer_search:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Removed and automatically determined based on block format.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;search_enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed. Now defaults to true.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;metrics_generator_enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed. Now defaults to true.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h4 id=&#34;renamed&#34;&gt;Renamed&lt;/h4&gt;
&lt;p&gt;The following &lt;code&gt;compactor&lt;/code&gt; configuration parameters were renamed.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;compaction:&lt;br&gt;  chunk_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_in_buffer_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;compaction:&lt;br&gt;  flush_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_out_buffer_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;compaction:&lt;br&gt;  iterator_buffer_size:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_prefetch_traces_count&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 following &lt;code&gt;storage&lt;/code&gt; configuration parameters were renamed.&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Parameter&lt;/th&gt;
              &lt;th&gt;Comments&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;wal:&lt;br&gt;  encoding:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_encoding&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  index_downsample_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_index_downsample_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  index_page_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_index_page_size_bytes&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  encoding:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;v2_encoding&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;pre&gt;block:&lt;br&gt;  row_group_size_bytes:&lt;/pre&gt;&lt;/td&gt;
              &lt;td&gt;Renamed to &lt;code&gt;parquet_row_group_size_bytes&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 Azure Storage configuration section now uses snake case with underscores (&lt;code&gt;_&lt;/code&gt;) instead of dashes (&lt;code&gt;-&lt;/code&gt;). Example of using snake case on Azure Storage 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;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;# config.yaml
storage:
  trace:
    azure:
      storage_account_name:
      storage_account_key:
      container_name:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="upgrade-your-tempo-installation">Upgrade your Tempo installation&lt;/h1>
&lt;p>You can upgrade an existing Tempo installation to the next version. However, any new release has the potential to have breaking changes that should be tested in a non-production environment prior to rolling these changes to production.&lt;/p></description></item><item><title>Deploy Tempo with Helm</title><link>https://grafana.com/docs/tempo/v2.2.x/setup/helm-chart/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/setup/helm-chart/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-tempo-with-helm&#34;&gt;Deploy Tempo with Helm&lt;/h1&gt;
&lt;p&gt;The Helm charts for Grafana Tempo and Grafana Enterprise Traces allows you to configure, install, and upgrade Grafana Tempo or Grafana Enterprise Traces within a Kubernetes cluster.&lt;/p&gt;
&lt;h2 id=&#34;example-helm-chart&#34;&gt;Example Helm chart&lt;/h2&gt;
&lt;p&gt;The Tempo repository has an &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 Helm chart&lt;/a&gt; that shows a complete microservice-based deployment.&lt;/p&gt;
&lt;h2 id=&#34;helm-charts-for-deployment&#34;&gt;Helm charts for deployment&lt;/h2&gt;
&lt;p&gt;Tempo has two primary charts used for deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/helm-charts/tree/main/charts/tempo-distributed&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;tempo-distributed&lt;/code&gt; Helm chart&lt;/a&gt; deploys Tempo in microservices mode&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/helm-charts/tree/main/charts/tempo&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;tempo&lt;/code&gt; Helm chart&lt;/a&gt; deploys Tempo in monolithic (single binary) mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To deploy Tempo using the &lt;code&gt;tempo-distributed&lt;/code&gt; Helm chart, read the &lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/get-started-helm-charts/&#34;&gt;Get started with Grafana Tempo using Helm&lt;/a&gt;.&lt;/p&gt;
]]></content><description>&lt;h1 id="deploy-tempo-with-helm">Deploy Tempo with Helm&lt;/h1>
&lt;p>The Helm charts for Grafana Tempo and Grafana Enterprise Traces allows you to configure, install, and upgrade Grafana Tempo or Grafana Enterprise Traces within a Kubernetes cluster.&lt;/p></description></item><item><title>Deploy Tempo with Tempo Operator</title><link>https://grafana.com/docs/tempo/v2.2.x/setup/operator/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/setup/operator/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-tempo-with-tempo-operator&#34;&gt;Deploy Tempo with Tempo Operator&lt;/h1&gt;
&lt;p&gt;The Tempo Operator allows you to configure, install, upgrade, and operate Grafana Tempo on Kubernetes and OpenShift clusters.&lt;/p&gt;
&lt;p&gt;Some of the operator features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource Limits&lt;/strong&gt; - Specify overall resource requests and limits in the &lt;code&gt;TempoStack&lt;/code&gt; CR; the operator assigns fractions of it to each component&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AuthN and AuthZ&lt;/strong&gt; - Supports OpenID Control (OIDC) and role-based access control (RBAC)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multitenancy&lt;/strong&gt; - Multiple tenants can send traces to the same Tempo cluster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mTLS&lt;/strong&gt; - Communication between the Tempo components can be secured via mTLS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaeger UI&lt;/strong&gt; - Traces can be visualized in Jaeger UI and exposed via Ingress or OpenShift Route&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt; - The operator and &lt;code&gt;TempoStack&lt;/code&gt; operands expose telemetry (metrics, traces) and integrate with Prometheus &lt;code&gt;ServiceMonitors&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The source of the Tempo Operator can be found at &lt;a href=&#34;https://github.com/grafana/tempo-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;grafana/tempo-operator&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;
&lt;p&gt;The operator can be installed from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo-operator/releases/latest/download/tempo-operator.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Kubernetes manifest&lt;/a&gt; file on a Kubernetes cluster&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://operatorhub.io/operator/tempo-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;operatorhub.io&lt;/a&gt; on a Kubernetes cluster&lt;/li&gt;
&lt;li&gt;OperatorHub on an OpenShift cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;compatibility&#34;&gt;Compatibility&lt;/h2&gt;
&lt;h3 id=&#34;tempo&#34;&gt;Tempo&lt;/h3&gt;
&lt;p&gt;The supported Tempo version by the operator can be found in the &lt;a href=&#34;https://github.com/grafana/tempo-operator/blob/main/CHANGELOG.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;changelog&lt;/a&gt; or on the &lt;a href=&#34;https://github.com/grafana/tempo-operator/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;release page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;kubernetes&#34;&gt;Kubernetes&lt;/h3&gt;
&lt;p&gt;The Tempo Operator is supported on Kubernetes 1.21 and 1.27.&lt;/p&gt;
&lt;h3 id=&#34;cert-manager&#34;&gt;cert-manager&lt;/h3&gt;
&lt;p&gt;The operator Kubernetes manifest installation files use cert-manger &lt;code&gt;v1&lt;/code&gt; custom resources to provision certificates for admission webhooks.&lt;/p&gt;
&lt;h2 id=&#34;community&#34;&gt;Community&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reach out to us on &lt;a href=&#34;https://grafana.slack.com/archives/C0414EUU39A&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;#tempo-operator&lt;/a&gt; Grafana Slack channel.&lt;/li&gt;
&lt;li&gt;Participate on &lt;a href=&#34;../../community/&#34;&gt;Tempo community call&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="deploy-tempo-with-tempo-operator">Deploy Tempo with Tempo Operator&lt;/h1>
&lt;p>The Tempo Operator allows you to configure, install, upgrade, and operate Grafana Tempo on Kubernetes and OpenShift clusters.&lt;/p>
&lt;p>Some of the operator features are:&lt;/p></description></item><item><title>Deploy on Linux</title><link>https://grafana.com/docs/tempo/v2.2.x/setup/linux/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/setup/linux/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-on-linux&#34;&gt;Deploy on Linux&lt;/h1&gt;
&lt;p&gt;This guide provides a step-by-step process for installing Tempo on Linux.
It assumes you have access to a Linux system and the permissions required to deploy a service with network and file system access.
At the end of this guide, you will have deployed a single Tempo instance on a single node.&lt;/p&gt;
&lt;p&gt;These instructions focus on a &lt;a href=&#34;../deployment/&#34;&gt;monolithic installation&lt;/a&gt;. You can also run Tempo in distributed mode by deploying multiple binaries and using a distributed configuration.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;To follow this guide, you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A running Grafana instance (see &lt;a href=&#34;/docs/grafana/latest/setup-grafana/installation/&#34;&gt;installation instructions&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;An Amazon S3 compatible object store&lt;/li&gt;
&lt;li&gt;Git, Docker, and docker-compose plugin installed to test Tempo&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;system-requirements&#34;&gt;System requirements&lt;/h3&gt;
&lt;p&gt;This configuration is an example you can use as a starting point.
You may need to have more resources for your system than the minimum specifications listed below.
Additional adjustments will be necessary for a production environment.&lt;/p&gt;
&lt;p&gt;You must have the permissions required to deploy a service with a network and file system access.&lt;/p&gt;
&lt;p&gt;Your Linux system should have at least:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 CPUs&lt;/li&gt;
&lt;li&gt;16 GB of memory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;set-up-an-object-storage-bucket&#34;&gt;Set up an object storage bucket&lt;/h2&gt;
&lt;p&gt;Tempo uses object storage as the backend for its trace storage.
It also uses object storage for storing various data related to the state of the system.&lt;/p&gt;
&lt;p&gt;Tempo supports using the local filesystem as the backend for trace storage as well.
This is not recommended for production deployments. This guide focuses on setup with an object storage.&lt;/p&gt;
&lt;p&gt;This example uses &lt;a href=&#34;https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Amazon S3&lt;/a&gt; on the AWS &lt;code&gt;us-east-1&lt;/code&gt; region as your object store.
If you plan on using a different region or object storage service, update the storage fields in the configuration file below. Currently, the supported object storage backends are AWS S3, other S3-compliant object stores, and Google Cloud’s GCS.&lt;/p&gt;
&lt;p&gt;After you have provisioned an object storage backend, create the bucket &lt;code&gt;grafana-traces-data&lt;/code&gt;.
The buckets will be referenced in the configuration file of this guide.
You may need to alter the bucket name to be globally unique.&lt;/p&gt;
&lt;p&gt;Consider adding a prefix for your organization to the bucket, for example, &lt;code&gt;myorg-grafana-traces-data&lt;/code&gt;, and then replacing the names in the rest of these instructions with those bucket names.&lt;/p&gt;
&lt;h2 id=&#34;install-tempo&#34;&gt;Install Tempo&lt;/h2&gt;
&lt;p&gt;For a linux-amd64 installation, run the following commands via the command line interface on your Linux machine.
You need administrator privileges to do this by running as the &lt;code&gt;root&lt;/code&gt; user or via &lt;code&gt;sudo&lt;/code&gt; as a user with permissions to do so.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the Tempo binary, verify checksums (listed in &lt;code&gt;SHA256SUMS&lt;/code&gt;), and add network capabilities to the binary. Be sure to &lt;a href=&#34;https://github.com/grafana/tempo/releases/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;download the correct package installation&lt;/a&gt; for your OS and architecture:&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 -Lo tempo_2.2.0_linux_amd64.deb https://github.com/grafana/tempo/releases/download/v2.2.0/tempo_2.2.0_linux_amd64.deb
echo e81cb4ae47e1d8069efaad400df15547e809b849cbb18932e23ac3082995535b \
  tempo_2.2.0_linux_amd64.deb | sha256sum -c
dpkg -i tempo_2.2.0_linux_amd64.deb&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;create-a-tempo-configuration-file&#34;&gt;Create a Tempo configuration file&lt;/h2&gt;
&lt;p&gt;Copy the following YAML configuration to a file called &lt;code&gt;tempo.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Paste in your S3 credentials for &lt;code&gt;admin_client&lt;/code&gt; and the storage backend. If you wish to give your cluster a unique name, add a cluster property with the appropriate name.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&#34;../../configuration/&#34;&gt;Tempo configuration documentation&lt;/a&gt; for explanations of the available options.&lt;/p&gt;
&lt;p&gt;In the following configuration, Tempo options are altered to only listen to the OTLP gRPC and HTTP protocols.
By default, Tempo listens for all compatible protocols.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;server:
  http_listen_port: 3200

distributor:
  receivers:
      otlp:
        protocols:
          http:
          grpc:

compactor:
  compaction:
    block_retention: 48h                # configure total trace retention here

metrics_generator:
  registry:
    external_labels:
      source: tempo
      cluster: linux-microservices
  storage:
    path: /tmp/tempo/generator/wal
    remote_write:
    - url: http://localhost:9090/api/v1/write
      send_exemplars: true

storage:
  trace:
    backend: s3
    s3:
      endpoint: s3.us-east-1.amazonaws.com
      bucket: grafana-traces-data
      forcepathstyle: true
      # set to false if endpoint is https
      insecure: true
      access_key: # TODO - Add S3 access key
      secret_key: # TODO - Add S3 secret key
    wal:
      path: /tmp/tempo/wal         # where to store the the wal locally
    local:
      path: /tmp/tempo/blocks
overrides:
  metrics_generator_processors: [service-graphs, span-metrics]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In the above configuration, metrics generator is enabled to generate Prometheus metrics data from incoming trace spans. This is sent to a Prometheus remote write compatible metrics store at &lt;code&gt;http://prometheus:9090/api/v1/write&lt;/code&gt; (in the &lt;code&gt;metrics_generator&lt;/code&gt; configuration block). Ensure you change the relevant &lt;code&gt;url&lt;/code&gt; parameter to your own Prometheus compatible storage instance, or disable the metrics generator by removing the &lt;code&gt;metrics_generators_processors&lt;/code&gt; if you do not wish to generate span metrics.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;move-the-configuration-file-to-the-proper-directory&#34;&gt;Move the configuration file to the proper directory&lt;/h2&gt;
&lt;p&gt;Copy the &lt;code&gt;tempo.yaml&lt;/code&gt; to &lt;code&gt;/etc/tempo/config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cp tempo.yaml /etc/tempo/config.yml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;restart-the-tempo-service&#34;&gt;Restart the tempo service&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;systemctl&lt;/code&gt; to restart the service (depending on how you installed Tempo, this may be different):&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;systemctl start tempo.service&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can replace &lt;code&gt;restart&lt;/code&gt; with &lt;code&gt;stop&lt;/code&gt; to stop the service, and &lt;code&gt;start&lt;/code&gt; to start the service again after it&amp;rsquo;s stopped, if required.&lt;/p&gt;
&lt;h2 id=&#34;verify-your-cluster-is-working&#34;&gt;Verify your cluster is working&lt;/h2&gt;
&lt;p&gt;To verify that Tempo is working, run the following 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;systemctl is-active tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You should see the status &lt;code&gt;active&lt;/code&gt; returned. If you do not, check that the configuration file is correct, and then restart the service. You can also use &lt;code&gt;journalctl -u tempo&lt;/code&gt; to view the logs for Tempo to determine if there are any obvious reasons for failure to start.&lt;/p&gt;
&lt;p&gt;Verify that your storage bucket has received data by signing in to your storage provider and determining that a file has been written to storage. It should be called &lt;code&gt;tempo_cluster_seed.json&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;test-your-installation&#34;&gt;Test your installation&lt;/h2&gt;
&lt;p&gt;Once Tempo is running, you can use the K6 with Traces Docker example to verify that trace data is sent to Tempo. This procedure sets up a sample data source in Grafana to read from Tempo.&lt;/p&gt;
&lt;h3 id=&#34;backend-storage-configuration&#34;&gt;Backend storage configuration&lt;/h3&gt;
&lt;p&gt;The Tempo examples running with docker-compose all include a version of Tempo and a storage backend like S3 and GCS. Because Tempo is installed with a backend storage configured, you need to change the &lt;code&gt;docker-compose.yaml&lt;/code&gt; file to remove Tempo and instead point trace storage to the installed version. These steps are included in this section.&lt;/p&gt;
&lt;h3 id=&#34;network-configuration&#34;&gt;Network configuration&lt;/h3&gt;
&lt;p&gt;Docker compose uses an internal networking bridge to connect all of the defined services. Because the Tempo instance is running as a service on the local machine host, you need the resolvable IP address of the local machine so the docker containers can use the Tempo service. You can find the host IP address of your Linux machine using a command such as &lt;code&gt;ip addr show&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;steps&#34;&gt;Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Clone the Tempo repository:&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;git clone https://github.com/grafana/tempo.git&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go into the examples directory:&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;cd tempo/example/docker-compose/local&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the file &lt;code&gt;docker-compose.yaml&lt;/code&gt;, and remove the &lt;code&gt;tempo&lt;/code&gt; service and all its properties, so that the first service defined is &lt;code&gt;k6-tracing&lt;/code&gt;. The start of your &lt;code&gt;docker-compose.yaml&lt;/code&gt; should look like this:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;version: &amp;#34;3&amp;#34;
services:

k6-tracing:&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the &lt;code&gt;k6-tracing&lt;/code&gt; service, and change the value of &lt;code&gt;ENDPOINT&lt;/code&gt; to the local IP address of the machine running Tempo and docker compose, eg. &lt;code&gt;10.128.0.104:4317&lt;/code&gt;. This is the OTLP gRPC port:&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;environment:
  - ENDPOINT=10.128.0.104:4317&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This ensures that the traces sent from the example application go to the locally running Tempo service on the Linux machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the &lt;code&gt;k6-tracing&lt;/code&gt; service and remove the dependency on Tempo by deleting the following lines:&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;depends_on:
tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Save the &lt;code&gt;docker-compose.yaml&lt;/code&gt; file and exit your editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the default Grafana data source for Tempo that is included in the examples. Edit the file located at &lt;code&gt;tempo/example/shared/grafana-datasources.yaml&lt;/code&gt;, and change the &lt;code&gt;url&lt;/code&gt; field of the &lt;code&gt;Tempo&lt;/code&gt; data source to point to the local IP address of the machine running the Tempo service instead (eg. &lt;code&gt;url: http://10.128.0.104:3200&lt;/code&gt;). The Tempo data source section should resemble this:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;- name: Tempo
  type: tempo
  access: proxy
  orgId: 1
  url: http://10.128.0.104:3200&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Save the file and exit your editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the Prometheus configuration file so it uses the Tempo service as a scrape target. Change the target to the local Linux host IP address. Edit the &lt;code&gt;tempo/example/shared/prometheus.yaml&lt;/code&gt; file, and alter the &lt;code&gt;tempo&lt;/code&gt; job to replace &lt;code&gt;tempo:3200&lt;/code&gt; with the Linux machine host IP address.&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;  - job_name: &amp;#39;tempo&amp;#39;
	static_configs:
  	- targets: [ &amp;#39;10.128.0.104:3200&amp;#39; ]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Save the file and exit your editor.**&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the three services that are defined in the docker-compose file:&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;docker compose up -d&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that the services are running using &lt;code&gt;docker compose ps&lt;/code&gt;. You should see something like:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;NAME             	IMAGE                                   	COMMAND              	SERVICE         	CREATED         	STATUS          	PORTS
local-grafana-1  	grafana/grafana:9.3.2                   	&amp;#34;/run.sh&amp;#34;            	grafana         	2 minutes ago   	Up 3 seconds    	0.0.0.0:3000-&amp;gt;3000/tcp, :::3000-&amp;gt;3000/tcp
local-k6-tracing-1   ghcr.io/grafana/xk6-client-tracing:v0.0.2   &amp;#34;/k6-tracing run /ex…&amp;#34;   k6-tracing      	2 minutes ago   	Up 2 seconds
local-prometheus-1   prom/prometheus:latest                  	&amp;#34;/bin/prometheus --c…&amp;#34;   prometheus      	2 minutes ago   	Up 2 seconds    	0.0.0.0:9090-&amp;gt;9090/tcp, :::9090-&amp;gt;9090/tcp&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Grafana is running on port 3000, Prometheus is running on port 9090. Both should be bound to the host machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As part of the docker compose manifest, Grafana is now running on your Linux machine, reachable on port 3000. Point your web browser to the Linux machine on port 3000. You might need to port forward the local port if you’re doing this remotely, for example, via SSH forwarding.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once logged in, navigate to the &lt;strong&gt;Explore&lt;/strong&gt; page, select the Tempo data source and select the &lt;strong&gt;Search&lt;/strong&gt; tab. Select &lt;strong&gt;Run query&lt;/strong&gt; to list the recent traces stored in Tempo. Select one to view the trace diagram:&lt;/p&gt;
 &lt;p align=&#34;center&#34;&gt;&lt;img src=&#34;../assets/setup-linux-run-query.png&#34; alt=&#34;Query example&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alter the Tempo configuration to point to the instance of Prometheus running in docker compose. To do so, edit the configuration at &lt;code&gt;/etc/tempo/config.yaml&lt;/code&gt; and change the &lt;code&gt;storage&lt;/code&gt; block under the &lt;code&gt;metrics_generator&lt;/code&gt; section so that the remote write url is &lt;code&gt;http://localhost:9090&lt;/code&gt;. The configuration section should look like this:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt; storage:
     path: /tmp/tempo/generator/wal
     remote_write:
        - url: http://localhost:9090/api/v1/write
        send_exemplars: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Save the file and exit the editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, restart the Tempo service by running:&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;sudo systemctl restart tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A couple of minutes after Tempo has successfully restarted, select the &lt;strong&gt;Service graph&lt;/strong&gt; tab for the Tempo data source in the &lt;strong&gt;Explore&lt;/strong&gt; page. Select &lt;strong&gt;Run query&lt;/strong&gt; to view a service graph, generated by Tempo’s metrics-generator.&lt;/p&gt;
 &lt;p align=&#34;center&#34;&gt;&lt;img src=&#34;../assets/setup-linux-node-graph.png&#34; alt=&#34;Service graph sample&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="deploy-on-linux">Deploy on Linux&lt;/h1>
&lt;p>This guide provides a step-by-step process for installing Tempo on Linux.
It assumes you have access to a Linux system and the permissions required to deploy a service with network and file system access.
At the end of this guide, you will have deployed a single Tempo instance on a single node.&lt;/p></description></item><item><title>Deploy on Kubernetes with Tanka</title><link>https://grafana.com/docs/tempo/v2.2.x/setup/tanka/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/setup/tanka/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-on-kubernetes-with-tanka&#34;&gt;Deploy on Kubernetes with Tanka&lt;/h1&gt;
&lt;p&gt;Using this deployment guide, you can deploy Tempo to Kubernetes using a Jsonnet library and &lt;a href=&#34;https://tanka.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Tanka&lt;/a&gt; to create a development cluster or sand-boxed environment.
This procedure uses MinIO to provide object storage regardless of the cloud platform or on-premise storage you use.
In a production environment, you can use your cloud provider’s object storage service to avoid the operational overhead of running object storage in production.&lt;/p&gt;
&lt;p&gt;To set up Tempo using Kubernetes with Tanka, you need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configure Kubernetes and install Tanka&lt;/li&gt;
&lt;li&gt;Set up the Tanka environment&lt;/li&gt;
&lt;li&gt;Install libraries&lt;/li&gt;
&lt;li&gt;Deploy MinIO object storage&lt;/li&gt;
&lt;li&gt;Optional: Enable metrics-generator&lt;/li&gt;
&lt;li&gt;Deploy Tempo with the Tanka command&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;This configuration is not suitable for a production environment but can provide a useful way to learn about Tempo.&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;To deploy Tempo to Kubernetes with Tanka, you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Kubernetes cluster with at least 40 CPUs and 46GB of memory for the default configuration. Small ingest or query volumes could use a far smaller configuration.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt;  (version depends upon the API version of Kubernetes in your cluster)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configure-kubernetes-and-install-tanka&#34;&gt;Configure Kubernetes and install Tanka&lt;/h2&gt;
&lt;p&gt;Follow these steps to configure Kubernetes and install Tanka.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new directory for the installation, and make it your current working directory:&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;mkdir tempo
cd tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a Kubernetes namespace. You can replace the namespace&lt;code&gt;tempo&lt;/code&gt; in this example with a name of your choice.&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;kubectl create namespace tempo&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Grafana Tanka; refer to &lt;a href=&#34;https://tanka.dev/install&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Installing Tanka&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;jsonnet-bundler&lt;/code&gt;; refer to the &lt;a href=&#34;https://github.com/jsonnet-bundler/jsonnet-bundler/#install&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;jsonnet-bundler&lt;/code&gt; README&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;set-up-the-tanka-environment&#34;&gt;Set up the Tanka environment&lt;/h2&gt;
&lt;p&gt;Tanka requires the current context for your Kubernetes environment.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Check the current context for your Kubernetes cluster and ensure it&amp;rsquo;s correct:&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;kubectl config current-context&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initialize Tanka. This will use the current Kubernetes context:&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;tk init --k8s=false
tk env add environments/tempo
tk env set environments/tempo \
 --namespace=tempo \
 --server-from-context=$(kubectl config current-context)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;install-libraries&#34;&gt;Install libraries&lt;/h2&gt;
&lt;p&gt;Install the &lt;code&gt;k.libsonnet&lt;/code&gt;, Jsonnet, and Memcachd libraries.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;k.libsonnet&lt;/code&gt; for your version of Kubernetes:&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;mkdir -p lib
export K8S_VERSION=1.25
jb install github.com/jsonnet-libs/k8s-libsonnet/${K8S_VERSION}@main
cat &amp;lt;&amp;lt;EOF &amp;gt; lib/k.libsonnet
import &amp;#39;github.com/jsonnet-libs/k8s-libsonnet/${K8S_VERSION}/main.libsonnet&amp;#39;
EOF&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the Tempo Jsonnet library and its dependencies.&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;jb install github.com/grafana/tempo/operations/jsonnet/microservices@main&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the Memcached library and its dependencies.&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;jb install github.com/grafana/jsonnet-libs/memcached@master&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;deploy-minio-object-storage&#34;&gt;Deploy MinIO object storage&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://min.io&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MinIO&lt;/a&gt; is an open source Amazon S3-compatible object storage service that is freely available and easy to run on Kubernetes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;minio.yaml&lt;/code&gt; and copy the following YAML configuration into it. You may need to remove/modify the &lt;code&gt;storageClassName&lt;/code&gt; depending on your Kubernetes platform. GKE, for example, may not support &lt;code&gt;local-path&lt;/code&gt; name but may support another option such as &lt;code&gt;standard&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  # This name uniquely identifies the PVC. Will be used in deployment below.
  name: minio-pv-claim
  labels:
    app: minio-storage-claim
spec:
  # Read more about access modes here: http://kubernetes.io/docs/user-guide/persistent-volumes/#access-modes
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    # This is the request for storage. Should be available in the cluster.
    requests:
      storage: 50Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: minio
spec:
  selector:
    matchLabels:
      app: minio
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        # Label is used as selector in the service.
        app: minio
    spec:
      # Refer to the PVC created earlier
      volumes:
        - name: storage
          persistentVolumeClaim:
            # Name of the PVC created earlier
            claimName: minio-pv-claim
      initContainers:
        - name: create-buckets
          image: busybox:1.28
          command:
            - &amp;#34;sh&amp;#34;
            - &amp;#34;-c&amp;#34;
            - &amp;#34;mkdir -p /storage/tempo-data&amp;#34;
          volumeMounts:
            - name: storage # must match the volume name, above
              mountPath: &amp;#34;/storage&amp;#34;
      containers:
        - name: minio
          # Pulls the default Minio image from Docker Hub
          image: minio/minio:latest
          args:
            - server
            - /storage
            - --console-address
            - &amp;#34;:9001&amp;#34;
          env:
            # Minio access key and secret key
            - name: MINIO_ACCESS_KEY
              value: &amp;#34;minio&amp;#34;
            - name: MINIO_SECRET_KEY
              value: &amp;#34;minio123&amp;#34;
          ports:
            - containerPort: 9000
            - containerPort: 9001
          volumeMounts:
            - name: storage # must match the volume name, above
              mountPath: &amp;#34;/storage&amp;#34;
---
apiVersion: v1
kind: Service
metadata:
  name: minio
spec:
  type: ClusterIP
  ports:
    - port: 9000
      targetPort: 9000
      protocol: TCP
      name: api
    - port: 9001
      targetPort: 9001
      protocol: TCP
      name: console
  selector:
    app: minio&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the following command to apply the minio.yaml 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;kubectl apply --namespace tempo -f minio.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To check that MinIO is correctly configured, sign in to MinIO and verify that a bucket has been created. Without these buckets, no data will be stored.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Port-forward MinIO to port 9001:&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; kubectl port-forward --namespace tempo service/minio 9001:9001&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Navigate to the MinIO admin bash using your browser: &lt;code&gt;http://localhost:9001&lt;/code&gt;. The sign-in credentials are username &lt;code&gt;minio&lt;/code&gt; and password &lt;code&gt;minio123&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that the Buckets page lists &lt;code&gt;tempo-data&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure the Tempo cluster using the MinIO object storage by updating the contents of the &lt;code&gt;environments/tempo/main.jsonnet&lt;/code&gt; file by running the following 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;jsonnet&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-jsonnet&#34;&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; environments/tempo/main.jsonnet
// The jsonnet file used to generate the Kubernetes manifests.
local tempo = import &amp;#39;microservices/tempo.libsonnet&amp;#39;;
local k = import &amp;#39;ksonnet-util/kausal.libsonnet&amp;#39;;
local container = k.core.v1.container;
local containerPort = k.core.v1.containerPort;

tempo {
    _images&amp;#43;:: {
        tempo: &amp;#39;grafana/tempo:latest&amp;#39;,
        tempo_query: &amp;#39;grafana/tempo-query:latest&amp;#39;,
    },

    tempo_distributor_container&amp;#43;:: container.withPorts([
            containerPort.new(&amp;#39;jaeger-grpc&amp;#39;, 14250),
            containerPort.new(&amp;#39;otlp-grpc&amp;#39;, 4317),
        ]),

    _config&amp;#43;:: {
        namespace: &amp;#39;tempo&amp;#39;,

        compactor&amp;#43;: {
            replicas: 1,
        },
        query_frontend&amp;#43;: {
            replicas: 2,
        },
        querier&amp;#43;: {
            replicas: 3,
        },
        ingester&amp;#43;: {
            replicas: 3,
            pvc_size: &amp;#39;10Gi&amp;#39;,
            pvc_storage_class: &amp;#39;standard&amp;#39;,
        },
        distributor&amp;#43;: {
            replicas: 3,
            receivers: {
                jaeger: {
                    protocols: {
                        grpc: {
                            endpoint: &amp;#39;0.0.0.0:14250&amp;#39;,
                        },
                    },
                },
                otlp: {
                    protocols: {
                        grpc: {
                            endpoint: &amp;#39;0.0.0.0:4317&amp;#39;,
                        },
                    },
                },
            },
        },

        metrics_generator&amp;#43;: {
            replicas: 1,
            ephemeral_storage_request_size: &amp;#39;10Gi&amp;#39;,
            ephemeral_storage_limit_size: &amp;#39;11Gi&amp;#39;,
            pvc_size: &amp;#39;10Gi&amp;#39;,
            pvc_storage_class: &amp;#39;standard&amp;#39;,
        },
        memcached&amp;#43;: {
            replicas: 3,
        },

        bucket: &amp;#39;tempo-data&amp;#39;,
        backend: &amp;#39;s3&amp;#39;,
    },

    tempo_config&amp;#43;:: {
        storage&amp;#43;: {
            trace&amp;#43;: {
                s3: {
                    bucket: $._config.bucket,
                    access_key: &amp;#39;minio&amp;#39;,
                    secret_key: &amp;#39;minio123&amp;#39;,
                    endpoint: &amp;#39;minio:9000&amp;#39;,
                    insecure: true,
                },
            },
        },
        metrics_generator&amp;#43;: {
            processor: {
                span_metrics: {},
                service_graphs: {},
            },

            registry&amp;#43;: {
                external_labels: {
                    source: &amp;#39;tempo&amp;#39;,
                },
            },
        },
        overrides&amp;#43;: {
            metrics_generator_processors: [&amp;#39;service-graphs&amp;#39;, &amp;#39;span-metrics&amp;#39;],
        },
    },

    tempo_ingester_container&amp;#43;:: {
      securityContext&amp;#43;: {
        runAsUser: 0,
      },
    },

    local statefulSet = $.apps.v1.statefulSet,
    tempo_ingester_statefulset&amp;#43;:
        statefulSet.mixin.spec.withPodManagementPolicy(&amp;#39;Parallel&amp;#39;),
}
EOF&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;optional-enable-metrics-generator&#34;&gt;Optional: Enable metrics-generator&lt;/h3&gt;
&lt;p&gt;In the preceding configuration, &lt;a href=&#34;../../configuration/#metrics-generator&#34;&gt;metrics generation&lt;/a&gt; is enabled. However, you still need to specify where to send the generated metrics data.
If you&amp;rsquo;d like to remote write these metrics onto a Prometheus compatible instance (such as Grafana Cloud metrics or a Mimir instance), you&amp;rsquo;ll need to include the configuration block below in the &lt;code&gt;metrics_generator&lt;/code&gt; section of the &lt;code&gt;tempo_config&lt;/code&gt; block above (this assumes basic auth is required, if not then remove the &lt;code&gt;basic_auth&lt;/code&gt; section).
You can find the details for your Grafana Cloud metrics instance for your Grafana Cloud account by using the &lt;a href=&#34;/docs/grafana-cloud/account-management/cloud-portal/&#34;&gt;Cloud Portal&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;jsonnet&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-jsonnet&#34;&gt;storage&amp;#43;: {
    remote_write: [
        {
            url: &amp;#39;https://&amp;lt;urlForPrometheusCompatibleStore&amp;gt;/api/v1/write&amp;#39;,
            send_exemplars: true,
            basic_auth: {
                username: &amp;#39;&amp;lt;username&amp;gt;&amp;#39;,
                password: &amp;#39;&amp;lt;password&amp;gt;&amp;#39;,
            },
        }
    ],
},&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Enabling metrics generation and remote writing them to Grafana Cloud Metrics will produce extra active series that could potentially impact your billing. For more information on billing, refer to &lt;a href=&#34;/docs/grafana-cloud/billing-and-usage/&#34;&gt;Billing and usage&lt;/a&gt;. For more information on metrics generation, refer &lt;a href=&#34;../../metrics-generator/&#34;&gt;Metrics-generator&lt;/a&gt; in the Tempo documentation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;optional-reduce-component-system-requirements&#34;&gt;Optional: Reduce component system requirements&lt;/h3&gt;
&lt;p&gt;Smaller ingestion and query volumes could allow the use of smaller resources. If you wish to lower the resources allocated to components, then you can do this via a container configuration. For example, to change the CPU and memory resource allocation for the ingesters.&lt;/p&gt;
&lt;p&gt;To change the resources requirements, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;code&gt;environments/tempo/main.jsonnet&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Add a new configuration block for the appropriate component (in this case, the ingesters):

&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;jsonnet&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-jsonnet&#34;&gt;tempo_ingester_container&amp;#43;:: {
    resources&amp;#43;: {
        limits&amp;#43;: {
            cpu: &amp;#39;3&amp;#39;,
            memory: &amp;#39;5Gi&amp;#39;,
        },
        requests&amp;#43;: {
            cpu: &amp;#39;200m&amp;#39;,
            memory: &amp;#39;2Gi&amp;#39;,
        },
    },
},&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Save the changes to the file.&lt;/li&gt;
&lt;/ol&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;Lowering these requirements can impact overall performance.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;deploy-tempo-using-tanka&#34;&gt;Deploy Tempo using Tanka&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Deploy Tempo using the Tanka command:

&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;tk apply environments/tempo/main.jsonnet&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&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;If the ingesters don’t start after deploying Tempo with the Tanka command, this may be related to the storage class selected for the Write Ahead Logs. If this is the case, add an appropriate storage class to the ingester configuration. For example, to add a standard instead of fast storage class, add the following to the &lt;code&gt;config&lt;/code&gt; (not &lt;code&gt;tempo_config&lt;/code&gt;) section in the previous step:&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;  ingester&amp;#43;: {
    pvc_storage_class: &amp;#39;standard&amp;#39;,
  },&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;The Tempo instance will now accept the two configured trace protocols (OTLP gRPC and Jaeger gRPC) via the distributor service at &lt;code&gt;distributor.tempo.svc.cluster.local&lt;/code&gt; on the relevant ports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OTLP gRPC: &lt;code&gt;4317&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Jaeger gRPC: &lt;code&gt;14250&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can query Tempo using the &lt;code&gt;query-frontend.tempo.svc.cluster.local&lt;/code&gt; service on port &lt;code&gt;3200&lt;/code&gt; for Tempo queries or port &lt;code&gt;16686&lt;/code&gt; or &lt;code&gt;16687&lt;/code&gt; for Jaeger type queries.&lt;/p&gt;
&lt;p&gt;Now that you&amp;rsquo;ve configured a Tempo cluster, you&amp;rsquo;ll need to get data into it. Read the &lt;a href=&#34;../set-up-test-app/&#34;&gt;Set up a test app&lt;/a&gt; for instructions.&lt;/p&gt;
]]></content><description>&lt;h1 id="deploy-on-kubernetes-with-tanka">Deploy on Kubernetes with Tanka&lt;/h1>
&lt;p>Using this deployment guide, you can deploy Tempo to Kubernetes using a Jsonnet library and &lt;a href="https://tanka.dev" target="_blank" rel="noopener noreferrer">Grafana Tanka&lt;/a> to create a development cluster or sand-boxed environment.
This procedure uses MinIO to provide object storage regardless of the cloud platform or on-premise storage you use.
In a production environment, you can use your cloud provider’s object storage service to avoid the operational overhead of running object storage in production.&lt;/p></description></item><item><title>Set up a test application for a Tempo cluster</title><link>https://grafana.com/docs/tempo/v2.2.x/setup/set-up-test-app/</link><pubDate>Fri, 03 Apr 2026 12:35:46 -0500</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/setup/set-up-test-app/</guid><content><![CDATA[&lt;h1 id=&#34;set-up-a-test-application-for-a-tempo-cluster&#34;&gt;Set up a test application for a Tempo cluster&lt;/h1&gt;
&lt;p&gt;Once you&amp;rsquo;ve set up a Grafana Tempo cluster, you need to write some traces to it and then query the traces from within Grafana.
This procedure uses Tempo in microservices mode.
For example, if you &lt;a href=&#34;../tanka/&#34;&gt;set up Tempo using the Kubernetes with Tanka procedure&lt;/a&gt;, then you can use this procedure to test your set up.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grafana 9.0.0 or higher&lt;/li&gt;
&lt;li&gt;Microservice deployments require the Tempo querier URL, for example: &lt;code&gt;http://query-frontend.tempo.svc.cluster.local:3200&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry telemetrygen&lt;/a&gt; for generating tracing data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to &lt;a href=&#34;/docs/grafana/latest/setup-grafana/installation/kubernetes/#deploy-grafana-on-kubernetes&#34;&gt;Deploy Grafana on Kubernetes&lt;/a&gt; if you are using Kubernetes.
Otherwise, refer to &lt;a href=&#34;/docs/grafana/latest/installation/&#34;&gt;Install Grafana&lt;/a&gt; for more information.&lt;/p&gt;
&lt;h2 id=&#34;set-up-remote_write-to-your-tempo-cluster&#34;&gt;Set up &lt;code&gt;remote_write&lt;/code&gt; to your Tempo cluster&lt;/h2&gt;
&lt;p&gt;To enable writes to your cluster:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add a &lt;code&gt;remote_write&lt;/code&gt; configuration snippet to the configuration file of an existing Grafana Agent.&lt;/p&gt;
&lt;p&gt;If you do not have an existing traces collector, refer to &lt;a href=&#34;/docs/agent/latest/set-up/&#34;&gt;Set up with Grafana Agent&lt;/a&gt;.
For Kubernetes, refer to the &lt;a href=&#34;/docs/grafana-cloud/kubernetes-monitoring/agent-k8s/k8s_agent_traces/&#34;&gt;Grafana Agent Traces Kubernetes quick start guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The example agent Kubernetes ConfigMap configuration below opens many trace receivers (note that the remote write is onto the Tempo cluster using OTLP gRPC):&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;kind: ConfigMap
metadata:
  name: grafana-agent-traces
apiVersion: v1
data:
  agent.yaml: |
    traces:
        configs:
          - batch:
                send_batch_size: 1000
                timeout: 5s
            name: default
            receivers:
                jaeger:
                    protocols:
                        grpc: null
                        thrift_binary: null
                        thrift_compact: null
                        thrift_http: null
                opencensus: null
                otlp:
                    protocols:
                        grpc: null
                        http: null
                zipkin: null
            remote_write:
              - endpoint: &amp;lt;tempoDistributorServiceEndpoint&amp;gt;
                insecure: true  # only add this if TLS is not used
            scrape_configs:
              - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
                job_name: kubernetes-pods
                kubernetes_sd_configs:
                  - role: pod
                relabel_configs:
                  - action: replace
                    source_labels:
                      - __meta_kubernetes_namespace
                    target_label: namespace
                  - action: replace
                    source_labels:
                      - __meta_kubernetes_pod_name
                    target_label: pod
                  - action: replace
                    source_labels:
                      - __meta_kubernetes_pod_container_name
                    target_label: container
                tls_config:
                    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
                    insecure_skip_verify: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you have followed the &lt;a href=&#34;../tanka/&#34;&gt;Tanka Tempo installation example&lt;/a&gt;, then the &lt;code&gt;endpoint&lt;/code&gt; value would be:&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;distributor.tempo.svc.cluster.local:4317&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the ConfigMap with:&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;kubectl apply --namespace default -f agent.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy Grafana Agent using the procedures from the relevant instructions above.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;create-a-grafana-tempo-data-source&#34;&gt;Create a Grafana Tempo data source&lt;/h2&gt;
&lt;p&gt;To allow Grafana to read traces from Tempo, you must create a Tempo data source.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to &lt;strong&gt;Configuration ≫ Data Sources&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;strong&gt;Add data source&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Tempo&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the URL to &lt;code&gt;http://&amp;lt;TEMPO-HOST&amp;gt;:&amp;lt;HTTP-LISTEN-PORT&amp;gt;/&lt;/code&gt;, filling in the path to your gateway and the configured HTTP API prefix. If you have followed the &lt;a href=&#34;../tanka/&#34;&gt;Tanka Tempo installation example&lt;/a&gt;, this will be: &lt;code&gt;http://query-frontend.tempo.svc.cluster.local:3200/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click &lt;strong&gt;Save &amp;amp; Test&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should see a message that says &lt;code&gt;Data source is working&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you see an error that says &lt;code&gt;Data source is not working: failed to get trace with id: 0&lt;/code&gt;, check your Grafana version.&lt;/p&gt;
&lt;p&gt;To fix the error, &lt;a href=&#34;/docs/grafana/latest/setup-grafana/upgrade-grafana/&#34;&gt;upgrade your Grafana to 9.0 or later&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;visualize-your-data&#34;&gt;Visualize your data&lt;/h2&gt;
&lt;p&gt;Once you have created a data source, you can visualize your traces in the &lt;strong&gt;Grafana Explore&lt;/strong&gt; page.
For more information, refer to &lt;a href=&#34;../../getting-started/tempo-in-grafana/&#34;&gt;Tempo in Grafana&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;use-opentelemetry-telemetrygen-to-generate-tracing-data&#34;&gt;Use OpenTelemetry &lt;code&gt;telemetrygen&lt;/code&gt; to generate tracing data&lt;/h3&gt;
&lt;p&gt;Next, you can use &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry &lt;code&gt;telemetrygen&lt;/code&gt;&lt;/a&gt; to generate tracing data to test your Tempo installation.&lt;/p&gt;
&lt;p&gt;In the following instructions we assume the endpoints for both the Grafana Agent and the Tempo distributor are those described above, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grafana-agent-traces.default.svc.cluster.local&lt;/code&gt; for Grafana Agent&lt;/li&gt;
&lt;li&gt;&lt;code&gt;distributor.tempo.svc.cluster.local&lt;/code&gt; for the Tempo distributor
Replace these appropriately if you have altered the endpoint targets.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;telemetrygen&lt;/code&gt; using the &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;installation procedure&lt;/a&gt;.
&lt;strong&gt;NOTE&lt;/strong&gt;: You do not need to configure an OpenTelemetry Collector as we are using the Grafana Agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generate traces using &lt;code&gt;telemtrygen&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;telemetrygen traces --otlp-insecure --rate 20 --duration 5s grafana-agent-traces.default.svc.cluster.local:4317&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This configuration sends traces to Grafana Agent for 5 seconds, at a rate of 20 traces per second.&lt;/p&gt;
&lt;p&gt;Optionally, you can also send the trace directly to the Tempo database without using Grafana Agent as a collector by using the following:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;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;telemetrygen traces --otlp-insecure --rate 20 --duration 5s distributor.tempo.svc.cluster.local:4317&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;view-tracing-data-in-grafana&#34;&gt;View tracing data in Grafana&lt;/h3&gt;
&lt;p&gt;To view the tracing data:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to Grafana and select the &lt;strong&gt;Explore&lt;/strong&gt; menu item.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select the &lt;strong&gt;Tempo data source&lt;/strong&gt; from the list of data sources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the trace ID into the &lt;strong&gt;Trace ID&lt;/strong&gt; edit field.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Run query&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirm that traces are displayed in the traces &lt;strong&gt;Explore&lt;/strong&gt; panel. You should see 5 seconds worth of traces, 100 traces in total per run of &lt;code&gt;telemetrygen&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="set-up-a-test-application-for-a-tempo-cluster">Set up a test application for a Tempo cluster&lt;/h1>
&lt;p>Once you&amp;rsquo;ve set up a Grafana Tempo cluster, you need to write some traces to it and then query the traces from within Grafana.
This procedure uses Tempo in microservices mode.
For example, if you &lt;a href="../tanka/">set up Tempo using the Kubernetes with Tanka procedure&lt;/a>, then you can use this procedure to test your set up.&lt;/p></description></item></channel></rss>