<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deploy Tempo locally on Grafana Labs</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/locally/</link><description>Recent content in Deploy Tempo locally on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/locally/index.xml" rel="self" type="application/rss+xml"/><item><title>Deploy on Linux</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/locally/linux/</link><pubDate>Thu, 09 Apr 2026 16:01:48 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/locally/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;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/plan/deployment-modes/&#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 (refer to 
    &lt;a href=&#34;/docs/grafana/next/setup-grafana/installation/&#34;&gt;the 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 &lt;a href=&#34;https://aws.amazon.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;AWS S3&lt;/a&gt;, other S3-compliant object stores like &lt;a href=&#34;https://min.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Minio&lt;/a&gt;,&lt;a href=&#34;https://azure.microsoft.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure&lt;/a&gt;, and &lt;a href=&#34;https://cloud.google.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Google Cloud Storage&lt;/a&gt;.&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;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. The following example downloads and installs Tempo 2.9.0 for the AMD64 (x86_64) processor architecture on a Linux distribution supporting deb packages:&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.9.0_linux_amd64.deb https://github.com/grafana/tempo/releases/download/v2.9.0/tempo_2.9.0_linux_amd64.deb
echo c1bc0fc8af5dcbe1b4806bdfad6d120e5a5df376d6782d22d0c3190be14fff05 \
  tempo_2.9.0_linux_amd64.deb | sha256sum -c
sudo dpkg -i tempo_2.9.0_linux_amd64.deb&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&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;/docs/tempo/v2.10.x/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.
By default, the OpenTelemetry Collector receiver binds to &lt;code&gt;localhost&lt;/code&gt; instead of &lt;code&gt;0.0.0.0&lt;/code&gt;.
This example binds to all ports, bear in mind that this can be a security risk if your Tempo instance is exposed to the public internet.&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:
        grpc:
          endpoint: &amp;#34;0.0.0.0:4317&amp;#34;
        http:
          endpoint: &amp;#34;0.0.0.0:4318&amp;#34;

ingester:
  max_block_duration: 5m

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://prometheus:9090/api/v1/write
        send_exemplars: true

storage:
  trace:
    backend: s3                        # backend configuration to use
    s3:
      endpoint: s3.us-east-1.amazonaws.com
      bucket: grafana-traces-data
      forcepathstyle: true
      enable_dual_stack: false
      # 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: /var/tmp/tempo/wal         # where to store the wal locally
    local:
      path: /var/tmp/tempo/blocks

overrides:
  metrics_generator_processors: [service-graphs, span-metrics] # enables metrics generator&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The above configuration is compatible with the downloaded release of Tempo.
Future release may impact the configuration content. In the configuration shown above, the 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.
Make sure 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;/div&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 don&amp;rsquo;t, 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 &#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;  - 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 &#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;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.9   &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;figure
       class=&#34;figure-wrapper figure-wrapper__lightbox w-100p &#34;
       style=&#34;max-width: 1541px;&#34;
       itemprop=&#34;associatedMedia&#34;
       itemscope=&#34;&#34;
       itemtype=&#34;http://schema.org/ImageObject&#34;
     &gt;&lt;a
           class=&#34;lightbox-link&#34;
           href=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png&#34;
           itemprop=&#34;contentUrl&#34;
         &gt;&lt;div class=&#34;img-wrapper w-100p h-auto&#34;&gt;&lt;img
             class=&#34;lazyload &#34;
             data-src=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png&#34;data-srcset=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png?w=320 320w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png?w=550 550w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png?w=750 750w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png?w=900 900w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png?w=1040 1040w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png?w=1240 1240w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png?w=1920 1920w&#34;data-sizes=&#34;auto&#34;alt=&#34;Use the query builder to explore tracing data in Grafana&#34;width=&#34;1541&#34;height=&#34;912&#34;/&gt;
           &lt;noscript&gt;
             &lt;img
               src=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-builder-span-details-v11.png&#34;
               alt=&#34;Use the query builder to explore tracing data in Grafana&#34;width=&#34;1541&#34;height=&#34;912&#34;/&gt;
           &lt;/noscript&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&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 &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt; storage:
     path: /var/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;figure
       class=&#34;figure-wrapper figure-wrapper__lightbox w-100p &#34;
       style=&#34;max-width: 1290px;&#34;
       itemprop=&#34;associatedMedia&#34;
       itemscope=&#34;&#34;
       itemtype=&#34;http://schema.org/ImageObject&#34;
     &gt;&lt;a
           class=&#34;lightbox-link&#34;
           href=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png&#34;
           itemprop=&#34;contentUrl&#34;
         &gt;&lt;div class=&#34;img-wrapper w-100p h-auto&#34;&gt;&lt;img
             class=&#34;lazyload &#34;
             data-src=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png&#34;data-srcset=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png?w=320 320w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png?w=550 550w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png?w=750 750w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png?w=900 900w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png?w=1040 1040w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png?w=1240 1240w, /media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png?w=1920 1920w&#34;data-sizes=&#34;auto&#34;alt=&#34;Service graph sample&#34;width=&#34;1290&#34;height=&#34;1145&#34;/&gt;
           &lt;noscript&gt;
             &lt;img
               src=&#34;/media/docs/grafana/data-sources/tempo/query-editor/tempo-ds-query-service-graph.png&#34;
               alt=&#34;Service graph sample&#34;width=&#34;1290&#34;height=&#34;1145&#34;/&gt;
           &lt;/noscript&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&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 Tempo using Docker Compose</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/locally/docker-compose/</link><pubDate>Thu, 09 Apr 2026 16:01:48 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/locally/docker-compose/</guid><content><![CDATA[&lt;h1 id=&#34;deploy-tempo-using-docker-compose&#34;&gt;Deploy Tempo using Docker Compose&lt;/h1&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;example&lt;/code&gt; directory&lt;/a&gt; in the Tempo repository provides a &lt;code&gt;docker-compose&lt;/code&gt; file that you can use to run Tempo locally with different configurations.&lt;/p&gt;
&lt;p&gt;The easiest example to start with is &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/local/readme.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Local Storage&lt;/a&gt;.
This example runs Tempo as a single binary together with the synthetic-load-generator, to generate traces, and Grafana, to query Tempo.
Data is stored locally on disk.&lt;/p&gt;
&lt;p&gt;The following examples showcase specific features or integrations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/alloy/readme.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Grafana Alloy&lt;/a&gt; provides a simple example using the Grafana Alloy as a tracing pipeline.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/otel-collector/readme.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry Collector&lt;/a&gt; is a basic example using the OpenTelemetry Collector as a tracing pipeline.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/otel-collector-multitenant/readme.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry Collector Multitenant&lt;/a&gt; uses the OpenTelemetry Collector in an advanced multi-tenant configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/grafana/tempo/tree/main/example/docker-compose/local/readme.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Local storage&lt;/a&gt; example uses the &lt;code&gt;local&lt;/code&gt; backend, suitable for local testing and development.&lt;/p&gt;
]]></content><description>&lt;h1 id="deploy-tempo-using-docker-compose">Deploy Tempo using Docker Compose&lt;/h1>
&lt;p>The &lt;a href="https://github.com/grafana/tempo/tree/main/example/docker-compose" target="_blank" rel="noopener noreferrer">&lt;code>example&lt;/code> directory&lt;/a> in the Tempo repository provides a &lt;code>docker-compose&lt;/code> file that you can use to run Tempo locally with different configurations.&lt;/p></description></item></channel></rss>