<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Deploy Tempo with Tempo Operator on Grafana Labs</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/</link><description>Recent content in Deploy Tempo with Tempo Operator 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/kubernetes/operator/index.xml" rel="self" type="application/rss+xml"/><item><title>Quickstart</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/quickstart/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/quickstart/</guid><content><![CDATA[&lt;h1 id=&#34;quickstart&#34;&gt;Quickstart&lt;/h1&gt;
&lt;p&gt;One page summary on how to start with Tempo Operator and &lt;code&gt;TempoStack&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;requirements&#34;&gt;Requirements&lt;/h2&gt;
&lt;p&gt;The easiest way to start with the Tempo Operator is to use Kubernetes &lt;a href=&#34;https://kind.sigs.k8s.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;kind&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;deploy&#34;&gt;Deploy&lt;/h2&gt;
&lt;p&gt;To install the operator in an existing cluster, make sure you have &lt;a href=&#34;https://cert-manager.io/docs/installation/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;cert-manager&lt;/a&gt; installed and run:&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;shell&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-shell&#34;&gt;kubectl apply -f https://github.com/grafana/tempo-operator/releases/latest/download/tempo-operator.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once you have the operator deployed you need to install a storage backend. For this quick start guide, we will install &lt;a href=&#34;https://min.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;MinIO&lt;/code&gt;&lt;/a&gt; as follows:&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;shell&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-shell&#34;&gt;kubectl apply -f https://raw.githubusercontent.com/grafana/tempo-operator/main/minio.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After minio was deployed, create a secret for MinIO in the namespace you are using:&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;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: v1
kind: Secret
metadata:
  name: minio-test
stringData:
  endpoint: http://minio.minio.svc:9000
  bucket: tempo
  access_key_id: tempo
  access_key_secret: supersecret
type: Opaque
EOF&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then create Tempo CR:&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;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: tempo.grafana.com/v1alpha1
kind: TempoStack
metadata:
  name: simplest
spec:
  storage:
    secret:
      name: minio-test
      type: s3
  storageSize: 1Gi
  resources:
    total:
      limits:
        memory: 2Gi
        cpu: 2000m
  template:
    queryFrontend:
      jaegerQuery:
        enabled: true
EOF&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After create the &lt;code&gt;TempoStack&lt;/code&gt; CR, you should see a some pods on the namespace. Wait for the stack to stabilize.&lt;/p&gt;
&lt;p&gt;The stack deployed above is configured to receive Jaeger, Zipkin, and OpenTelemetry (OTLP) protocols.
Because the Jaeger Query is enabled, you can also use the Jaeger UI to inspect the data.&lt;/p&gt;
&lt;p&gt;To do a quick test, deploy a Job that generates some traces.&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;kubectl apply -f - &amp;lt;&amp;lt;EOF
apiVersion: batch/v1
kind: Job
metadata:
  name: tracegen
spec:
  template:
    spec:
      containers:
        - name: tracegen
          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/tracegen:latest
          command:
            - &amp;#34;./tracegen&amp;#34;
          args:
            - -otlp-endpoint=tempo-simplest-distributor:4317
            - -otlp-insecure
            - -duration=30s
            - -workers=1
      restartPolicy: Never
  backoffLimit: 4
EOF&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Forward the Jaeger Query port to see the traces:&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;kubectl port-forward svc/tempo-simplest-query-frontend 16686:16686&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Visit http://localhost:16686 to view the results.&lt;/p&gt;
]]></content><description>&lt;h1 id="quickstart">Quickstart&lt;/h1>
&lt;p>One page summary on how to start with Tempo Operator and &lt;code>TempoStack&lt;/code>.&lt;/p>
&lt;h2 id="requirements">Requirements&lt;/h2>
&lt;p>The easiest way to start with the Tempo Operator is to use Kubernetes &lt;a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer">kind&lt;/a>.&lt;/p></description></item><item><title>Object storage</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/object-storage/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/object-storage/</guid><content><![CDATA[&lt;h1 id=&#34;object-storage&#34;&gt;Object storage&lt;/h1&gt;
&lt;p&gt;Tempo Operator supports &lt;a href=&#34;https://aws.amazon.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;AWS S3&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;, &lt;a href=&#34;https://cloud.google.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;GCS&lt;/a&gt;, &lt;a href=&#34;https://min.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Minio&lt;/a&gt; and &lt;a href=&#34;https://www.redhat.com/en/technologies/cloud-computing/openshift-data-foundation&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenShift Data Foundation&lt;/a&gt; for TempoStack object storage.&lt;/p&gt;
&lt;h2 id=&#34;aws-s3&#34;&gt;AWS S3&lt;/h2&gt;
&lt;h3 id=&#34;requirements&#34;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Create a &lt;a href=&#34;https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;bucket&lt;/a&gt; on AWS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;static-token-installation&#34;&gt;Static token installation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an Object Storage secret with keys as follows:&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;console&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-console&#34;&gt;kubectl create secret generic tempostack-dev-s3 \
  --from-literal=bucket=&amp;#34;&amp;lt;BUCKET_NAME&amp;gt;&amp;#34; \
  --from-literal=endpoint=&amp;#34;&amp;lt;AWS_BUCKET_ENDPOINT&amp;gt;&amp;#34; \
  --from-literal=access_key_id=&amp;#34;&amp;lt;AWS_ACCESS_KEY_ID&amp;gt;&amp;#34; \
  --from-literal=access_key_secret=&amp;#34;&amp;lt;AWS_ACCESS_KEY_SECRET&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;where &lt;code&gt;tempostack-dev-s3&lt;/code&gt; is the secret name.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Create an instance of TempoStack by referencing the secret name and type as &lt;code&gt;s3&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&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;spec:
  storage:
    secret:
      name: tempostack-dev-s3
      type: s3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;aws-security-token-service-sts-installation&#34;&gt;AWS Security Token Service (STS) installation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Create a custom AWS IAM Role associated with a trust relationship to Tempo&amp;rsquo;s Kubernetes &lt;code&gt;ServiceAccount&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&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;{
  &amp;#39;Version&amp;#39;: &amp;#39;2012-10-17&amp;#39;,
  &amp;#39;Statement&amp;#39;:
    [
      {
        &amp;#39;Effect&amp;#39;: &amp;#39;Allow&amp;#39;,
        &amp;#39;Principal&amp;#39;: { &amp;#39;Federated&amp;#39;: &amp;#39;arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}&amp;#39; },
        &amp;#39;Action&amp;#39;: &amp;#39;sts:AssumeRoleWithWebIdentity&amp;#39;,
        &amp;#39;Condition&amp;#39;:
          {
            &amp;#39;StringEquals&amp;#39;:
              {
                &amp;#39;${OIDC_PROVIDER}:sub&amp;#39;:
                  [
                    &amp;#39;system:serviceaccount:${TEMPOSTACK_NS}:tempo-${TEMPOSTACK_NAME}&amp;#39;,
                    &amp;#39;system:serviceaccount:${TEMPOSTACK_NS}:tempo-${TEMPOSTACK_NAME}-query-frontend&amp;#39;,
                  ],
              },
          },
      },
    ],
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Create an AWS IAM role:&lt;/li&gt;
&lt;/ol&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;aws iam create-role \
--role-name &amp;#34;tempo-s3-access&amp;#34; \
--assume-role-policy-document &amp;#34;file:///tmp/trust.json&amp;#34; \
--query Role.Arn \
--output text&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Attach a specific policy to that role:&lt;/li&gt;
&lt;/ol&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;aws iam attach-role-policy \
--role-name &amp;#34;tempo-s3-access&amp;#34; \
--policy-arn &amp;#34;arn:aws:iam::aws:policy/AmazonS3FullAccess&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;
&lt;p&gt;Create an Object Storage secret with keys as follows:&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;console&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-console&#34;&gt;kubectl create secret generic tempostack-dev-s3 \
  --from-literal=bucket=&amp;#34;&amp;lt;BUCKET_NAME&amp;gt;&amp;#34; \
  --from-literal=region=&amp;#34;&amp;lt;AWS_REGION&amp;gt;&amp;#34; \
  --from-literal=role_arn=&amp;#34;&amp;lt;ROLE ARN&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;where &lt;code&gt;tempostack-dev-s3&lt;/code&gt; is the secret name.&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Create an instance of TempoStack by referencing the secret name and type as &lt;code&gt;s3&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&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;spec:
  storage:
    secret:
      name: tempostack-dev-s3
      type: s3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;azure&#34;&gt;Azure&lt;/h2&gt;
&lt;h3 id=&#34;requirements-1&#34;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Create a &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;bucket&lt;/a&gt; on Azure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;installation&#34;&gt;Installation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an Object Storage secret with keys as follows:&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;console&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-console&#34;&gt;kubectl create secret generic tempostack-dev-azure \
  --from-literal=container=&amp;#34;&amp;lt;AZURE_CONTAINER_NAME&amp;gt;&amp;#34; \
  --from-literal=account_name=&amp;#34;&amp;lt;AZURE_ACCOUNT_NAME&amp;gt;&amp;#34; \
  --from-literal=account_key=&amp;#34;&amp;lt;AZURE_ACCOUNT_KEY&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;where &lt;code&gt;tempostack-dev-azure&lt;/code&gt; is the secret name.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Create an instance of TempoStack by referencing the secret name and type as &lt;code&gt;azure&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&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;spec:
  storage:
    secret:
      name: tempostack-dev-azure
      type: azure&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;google-cloud-storage&#34;&gt;Google Cloud Storage&lt;/h2&gt;
&lt;h3 id=&#34;requirements-2&#34;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Create a &lt;a href=&#34;https://cloud.google.com/resource-manager/docs/creating-managing-projects&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;project&lt;/a&gt; on Google Cloud Platform.&lt;/li&gt;
&lt;li&gt;Create a &lt;a href=&#34;https://cloud.google.com/storage/docs/creating-buckets&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;bucket&lt;/a&gt; under same project.&lt;/li&gt;
&lt;li&gt;Create a &lt;a href=&#34;https://cloud.google.com/docs/authentication/getting-started#creating_a_service_account&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;service account&lt;/a&gt; under same project for GCP authentication.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;installation-1&#34;&gt;Installation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Copy the service account credentials received from GCP into a file name &lt;code&gt;key.json&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create an Object Storage secret with keys &lt;code&gt;bucketname&lt;/code&gt; and &lt;code&gt;key.json&lt;/code&gt; as follows:&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;console&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-console&#34;&gt;kubectl create secret generic tempostack-dev-gcs \
  --from-literal=bucketname=&amp;#34;&amp;lt;BUCKET_NAME&amp;gt;&amp;#34; \
  --from-file=key.json=&amp;#34;&amp;lt;PATH/TO/KEY.JSON&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;where &lt;code&gt;tempostack-dev-gcs&lt;/code&gt; is the secret name, &lt;code&gt;&amp;lt;BUCKET_NAME&amp;gt;&lt;/code&gt; is the name of bucket created in requirements step and &lt;code&gt;&amp;lt;PATH/TO/KEY.JSON&amp;gt;&lt;/code&gt; is the file path where the &lt;code&gt;key.json&lt;/code&gt; was copied to.&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Create an instance of TempoStack by referencing the secret name and type as &lt;code&gt;gcs&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&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;spec:
  storage:
    secret:
      name: tempostack-dev-gcs
      type: gcs&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;minio&#34;&gt;MinIO&lt;/h2&gt;
&lt;h3 id=&#34;requirements-3&#34;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deploy MinIO on your cluster, e.g. using the &lt;a href=&#34;https://operator.min.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MinIO Operator&lt;/a&gt; or another method.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;a href=&#34;https://docs.min.io/docs/minio-client-complete-guide.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;bucket&lt;/a&gt; on MinIO using the CLI.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;installation-2&#34;&gt;Installation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an Object Storage secret with keys as follows:&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;console&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-console&#34;&gt;kubectl create secret generic tempostack-dev-minio \
  --from-literal=bucket=&amp;#34;&amp;lt;BUCKET_NAME&amp;gt;&amp;#34; \
  --from-literal=endpoint=&amp;#34;&amp;lt;MINIO_BUCKET_ENDPOINT&amp;gt;&amp;#34; \
  --from-literal=access_key_id=&amp;#34;&amp;lt;MINIO_ACCESS_KEY_ID&amp;gt;&amp;#34; \
  --from-literal=access_key_secret=&amp;#34;&amp;lt;MINIO_ACCESS_KEY_SECRET&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;where &lt;code&gt;tempostack-dev-minio&lt;/code&gt; is the secret name.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Create an instance of TempoStack by referencing the secret name and type as &lt;code&gt;s3&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&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;spec:
  storage:
    secret:
      name: tempostack-dev-minio
      type: s3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;openshift-data-foundation&#34;&gt;OpenShift Data Foundation&lt;/h2&gt;
&lt;h3 id=&#34;requirements-4&#34;&gt;Requirements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Deploy the &lt;a href=&#34;https://access.redhat.com/documentation/en-us/red_hat_openshift_data_foundation/4.10&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenShift Data Foundation&lt;/a&gt; on your cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a bucket via an ObjectBucketClaim.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;installation-3&#34;&gt;Installation&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create an Object Storage secret with keys as follows:&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;console&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-console&#34;&gt;kubectl create secret generic tempostack-dev-odf \
  --from-literal=bucket=&amp;#34;&amp;lt;BUCKET_NAME&amp;gt;&amp;#34; \
  --from-literal=endpoint=&amp;#34;https://s3.openshift-storage.svc&amp;#34; \
  --from-literal=access_key_id=&amp;#34;&amp;lt;ACCESS_KEY_ID&amp;gt;&amp;#34; \
  --from-literal=access_key_secret=&amp;#34;&amp;lt;ACCESS_KEY_SECRET&amp;gt;&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;where &lt;code&gt;tempostack-dev-odf&lt;/code&gt; is the secret name. You can copy the values for &lt;code&gt;BUCKET_NAME&lt;/code&gt;, &lt;code&gt;ACCESS_KEY_ID&lt;/code&gt; and &lt;code&gt;ACCESS_KEY_SECRET&lt;/code&gt; from your ObjectBucketClaim&amp;rsquo;s accompanied secret.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Create an instance of TempoStack by referencing the secret name and type as &lt;code&gt;s3&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&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;spec:
  storage:
    secret:
      name: tempostack-dev-odf
      type: s3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="object-storage">Object storage&lt;/h1>
&lt;p>Tempo Operator supports &lt;a href="https://aws.amazon.com/" target="_blank" rel="noopener noreferrer">AWS S3&lt;/a>, &lt;a href="https://azure.microsoft.com" target="_blank" rel="noopener noreferrer">Azure&lt;/a>, &lt;a href="https://cloud.google.com/" target="_blank" rel="noopener noreferrer">GCS&lt;/a>, &lt;a href="https://min.io/" target="_blank" rel="noopener noreferrer">Minio&lt;/a> and &lt;a href="https://www.redhat.com/en/technologies/cloud-computing/openshift-data-foundation" target="_blank" rel="noopener noreferrer">OpenShift Data Foundation&lt;/a> for TempoStack object storage.&lt;/p>
&lt;h2 id="aws-s3">AWS S3&lt;/h2>
&lt;h3 id="requirements">Requirements&lt;/h3>
&lt;ul>
&lt;li>Create a &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html" target="_blank" rel="noopener noreferrer">bucket&lt;/a> on AWS.&lt;/li>
&lt;/ul>
&lt;h3 id="static-token-installation">Static token installation&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>Create an Object Storage secret with keys as follows:&lt;/p></description></item><item><title>Enable multi-tenancy</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/multitenancy/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/multitenancy/</guid><content><![CDATA[&lt;h1 id=&#34;enable-multi-tenancy&#34;&gt;Enable multi-tenancy&lt;/h1&gt;
&lt;p&gt;Tempo is a multi-tenant distributed tracing backend. It supports multi-tenancy through the use of a header: &lt;code&gt;X-Scope-OrgID&lt;/code&gt;.
Refer to 
    &lt;a href=&#34;/docs/tempo/v2.10.x/operations/manage-advanced-systems/multitenancy/&#34;&gt;multi-tenancy docs&lt;/a&gt; for more details.
This document outlines how to deploy and use multi-tenant Tempo with the Operator.&lt;/p&gt;
&lt;h2 id=&#34;multi-tenancy-without-authentication&#34;&gt;Multi-tenancy without authentication&lt;/h2&gt;
&lt;p&gt;The following Kubernetes Custom Resource (CR) deploys a multi-tenant Tempo instance.&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;Jaeger query isn&amp;rsquo;t tenant-aware and, therefore, isn&amp;rsquo;t supported in this configuration.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;


&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: tempo.grafana.com/v1alpha1
kind: TempoStack
metadata:
  name: simplest
spec:
  tenants: {}
  storage:
    secret:
      name: minio-test
      type: s3
  storageSize: 1Gi
  resources:
    total:
      limits:
        memory: 2Gi
        cpu: 2000m&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;oidc-authentication-with-static-rbac&#34;&gt;OIDC authentication with static RBAC&lt;/h2&gt;
&lt;p&gt;On Kubernetes, a multi-tenant Tempo instance uses OIDC authentication and static RBAC authorization defined in the CR.
The instance should be accessed through service &lt;code&gt;tempo-simplest-gateway&lt;/code&gt;, which handles authentication and authorization.
The service exposes Jaeger query API and OpenTelemetry gRPC (OTLP) for trace ingestion.
The Jaeger UI can be accessed at &lt;code&gt;http://&amp;lt;exposed gateway service&amp;gt;:8080/api/traces/v1/&amp;lt;tenant-name&amp;gt;/search&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: tempo.grafana.com/v1alpha1
kind: TempoStack
metadata:
  name: simplest
spec:
  template:
    queryFrontend:
      jaegerQuery:
        enabled: true
    gateway:
      enabled: true
  storage:
    secret:
      type: s3
      name: minio-test
  storageSize: 200M
  tenants:
    mode: static
    authentication:
      - tenantName: test-oidc
        tenantId: test-oidc
        oidc:
          issuerURL: http://dex.default.svc.cluster.local:30556/dex
          redirectURL: http://tempo-simplest-gateway.default.svc.cluster.local:8080/oidc/test-oidc/callback
          usernameClaim: email
          secret:
            name: oidc-test
    authorization:
      roleBindings:
        - name: &amp;#39;test&amp;#39;
          roles:
            - read-write
          subjects:
            - kind: user
              name: &amp;#39;admin@example.com&amp;#39;
      roles:
        - name: read-write
          permissions:
            - read
            - write
          resources:
            - traces
          tenants:
            - test-oidc&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The secret &lt;code&gt;oidc-test&lt;/code&gt; defines fields &lt;code&gt;clientID&lt;/code&gt;, &lt;code&gt;clientSecret&lt;/code&gt; and &lt;code&gt;issuerCAPath&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The RBAC gives tenant &lt;code&gt;test-oidc&lt;/code&gt; read and write access for traces.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;openshift&#34;&gt;OpenShift&lt;/h2&gt;
&lt;p&gt;On OpenShift, the authentication and authorization does not require any third-party service dependencies.
The authentication uses OpenShift OAuth (the user is redirected to the OpenShift login page) and authorization is handled through &lt;code&gt;SubjectAccessReview&lt;/code&gt; (SAR).&lt;/p&gt;
&lt;p&gt;The instance should be accessed through service &lt;code&gt;tempo-simplest-gateway&lt;/code&gt;, which handles authentication and authorization.
The service exposes Jaeger query API and OpenTelemetry gRPC (OTLP) for trace ingestion.
The Jaeger UI can be accessed at &lt;code&gt;http://&amp;lt;exposed gateway service&amp;gt;:8080/api/traces/v1/&amp;lt;tenant-name&amp;gt;/search&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: tempo.grafana.com/v1alpha1
kind: TempoStack
metadata:
  name: simplest
spec:
  storage:
    secret:
      name: object-storage
      type: s3
  storageSize: 1Gi
  tenants:
    mode: openshift
    authentication:
      - tenantName: dev
        tenantId: &amp;#39;1610b0c3-c509-4592-a256-a1871353dbfa&amp;#39;
      - tenantName: prod
        tenantId: &amp;#39;1610b0c3-c509-4592-a256-a1871353dbfb&amp;#39;
  template:
    gateway:
      enabled: true
    queryFrontend:
      jaegerQuery:
        enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;ClusterRole&lt;/code&gt; and &lt;code&gt;ClusterRoleBinding&lt;/code&gt; objects have to be created to enable reading and writing the data.&lt;/p&gt;
&lt;h3 id=&#34;rbac-for-reading-the-data&#34;&gt;RBAC for reading the data&lt;/h3&gt;
&lt;p&gt;The following RBAC gives authenticated users access to read trace data for &lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;prod&lt;/code&gt; tenants.&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: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: tempostack-traces-reader
rules:
  - apiGroups:
      - &amp;#39;tempo.grafana.com&amp;#39;
    resources:
      - dev
      - prod
    resourceNames:
      - traces
    verbs:
      - &amp;#39;get&amp;#39;
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tempostack-traces-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: tempostack-traces-reader
subjects:
  - kind: Group
    apiGroup: rbac.authorization.k8s.io
    name: system:authenticated&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;rbac-for-writing-data&#34;&gt;RBAC for writing data&lt;/h3&gt;
&lt;p&gt;The following RBAC gives service account &lt;code&gt;otel-collector&lt;/code&gt; write access for trace data for &lt;code&gt;dev&lt;/code&gt; tenant.&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: ServiceAccount
metadata:
  name: otel-collector
  namespace: otel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: tempostack-traces-write
rules:
  - apiGroups:
      - &amp;#39;tempo.grafana.com&amp;#39;
    resources:
      - dev
    resourceNames:
      - traces
    verbs:
      - &amp;#39;create&amp;#39;
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tempostack-traces
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: tempostack-traces-write
subjects:
  - kind: ServiceAccount
    name: otel-collector
    namespace: otel&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;OpenTelemetry collector CR configuration with authentication for dev tenant.&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;spec:
  serviceAccount: otel-collector
  config: |
    extensions:
      bearertokenauth:
        filename: &amp;#34;/var/run/secrets/kubernetes.io/serviceaccount/token&amp;#34;
    exporters:
      # Export the dev tenant traces to a Tempo instance
      otlp/dev:
        endpoint: tempo-simplest-gateway.tempo.svc.cluster.local:8090
        tls:
          insecure: false
          ca_file: &amp;#34;/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt&amp;#34;
        auth:
          authenticator: bearertokenauth
        headers:
          X-Scope-OrgID: &amp;#34;dev&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="enable-multi-tenancy">Enable multi-tenancy&lt;/h1>
&lt;p>Tempo is a multi-tenant distributed tracing backend. It supports multi-tenancy through the use of a header: &lt;code>X-Scope-OrgID&lt;/code>.
Refer to
&lt;a href="/docs/tempo/v2.10.x/operations/manage-advanced-systems/multitenancy/">multi-tenancy docs&lt;/a> for more details.
This document outlines how to deploy and use multi-tenant Tempo with the Operator.&lt;/p></description></item><item><title>Monitor Tempo instances and the operator</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/monitor/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/monitor/</guid><content><![CDATA[&lt;h1 id=&#34;monitor-tempo-instances-and-the-operator&#34;&gt;Monitor Tempo instances and the operator&lt;/h1&gt;
&lt;p&gt;You can configure the Tempo Operator to monitor TempoStack instances (including all Tempo components like the distributor). In addition, the operator can expose metrics about the operator itself (for example, the number of successful and failed upgrades, etc.).&lt;/p&gt;
&lt;h2 id=&#34;monitor-tempostack-instances&#34;&gt;Monitor TempoStack instances&lt;/h2&gt;
&lt;p&gt;The Tempo Operator supports monitoring and alerting of each Tempo component (distributor, ingester, etc.).
To enable metrics and alerting, the &lt;a href=&#34;https://github.com/prometheus-operator/prometheus-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Prometheus Operator&lt;/a&gt; or a comparable solution which discovers &lt;code&gt;ServiceMonitor&lt;/code&gt; and &lt;code&gt;PrometheusRule&lt;/code&gt; objects must be installed and configured in the cluster.&lt;/p&gt;
&lt;p&gt;The configuration for monitoring &lt;code&gt;TempoStack&lt;/code&gt; instances is exposed in the CR:&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: tempo.grafana.com/v1alpha1
kind: TempoStack
spec:
  observability:
    metrics:
      createServiceMonitors: true
      createPrometheusRules: true
    tracing:
      sampling_fraction: 1.0
      jaeger_agent_endpoint: localhost:6831&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;configure-distributed-tracing-of-operands&#34;&gt;Configure distributed tracing of operands&lt;/h3&gt;
&lt;p&gt;All Tempo components as well as the &lt;a href=&#34;https://github.com/observatorium/api&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Tempo Gateway&lt;/a&gt; support the export of traces in &lt;code&gt;thrift_compact&lt;/code&gt; format.&lt;/p&gt;
&lt;h4 id=&#34;deploy-opentelemetry-collector-sidecar&#34;&gt;Deploy OpenTelemetry collector sidecar&lt;/h4&gt;
&lt;p&gt;To deploy the OpenTelemetry collector, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href=&#34;https://opentelemetry.io/docs/k8s-operator/#getting-started&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry Operator&lt;/a&gt; into the cluster.&lt;/li&gt;
&lt;li&gt;Create an &lt;code&gt;OpenTelemetryCollector&lt;/code&gt; CR that receives trace data in Jaeger Thrift format and exports data via OTLP to the desired trace backend.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional:&lt;/strong&gt; Deploy tracing backend to store trace data.&lt;/li&gt;
&lt;/ol&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: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: sidecar-for-tempo
spec:
  mode: sidecar
  config: |
    receivers:
      jaeger:
        protocols:
          thrift_compact:

    exporters:
      otlp:
        endpoint: &amp;lt;otlp-endpoint&amp;gt;:4317
        tls:
          insecure: true

    service:
      pipelines:
        traces:
          receivers: [jaeger]
          exporters: [otlp]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;send-trace-data-to-opentelemetry-sidecar&#34;&gt;Send trace data to OpenTelemetry sidecar&lt;/h4&gt;
&lt;p&gt;Finally, create a &lt;code&gt;TempoStack&lt;/code&gt; instance that sets &lt;code&gt;jaeger_agent_endpoint&lt;/code&gt; to report trace data to the &lt;code&gt;localhost&lt;/code&gt;.
The Tempo operator sets the OpenTelemetry inject annotation &lt;code&gt;sidecar.opentelemetry.io/inject&amp;quot;: &amp;quot;true&lt;/code&gt; to all &lt;code&gt;TempoStack&lt;/code&gt; pods.
The OpenTelemetry Operator will recognize the annotation, and it will inject a sidecar into all &lt;code&gt;TempoStack&lt;/code&gt; pods.&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: tempo.grafana.com/v1alpha1
kind: TempoStack
metadata:
  name: simple-stack
spec:
  template:
    queryFrontend:
      jaegerQuery:
        enabled:
  storage:
    secret:
      type: s3
      name: minio-test
  storageSize: 200M
  observability:
    tracing:
      sampling_fraction: &amp;#39;1.0&amp;#39;
      jaeger_agent_endpoint: localhost:6831&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;monitor-the-operator&#34;&gt;Monitor the operator&lt;/h2&gt;
&lt;p&gt;The Tempo Operator can expose upgrade and other operational metrics about the operator itself, and can create alerts based on these metrics.
For example, the operator handles Tempo upgrades and exposes metrics like &amp;ldquo;the number of successful Tempo upgrades&amp;rdquo;, &amp;ldquo;number of failed Tempo upgrades&amp;rdquo;, and others.
The operator also creates alerts to notify system administrators if any Tempo upgrade fails.&lt;/p&gt;
&lt;p&gt;Other metrics are internal to the operator itself, for example, the duration of a reconcile loop iteration.
This operator-specific component continuously tries to match the expected state as described in the TempoStack custom resource to the actual cluster state.
For example, if an object is deleted in the cluster which is managed by the operator, the operator re-creates this object again, to match the expected state of the cluster.&lt;/p&gt;
&lt;p&gt;The operator can be configured using the ConfigMap &lt;code&gt;tempo-operator-manager-config&lt;/code&gt; in the same namespace as the operator.
The following excerpt shows the configuration options to enable the creation of &lt;code&gt;ServiceMonitor&lt;/code&gt; (for scraping metrics) and &lt;code&gt;PrometheusRule&lt;/code&gt; (for creating alerts) objects:&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: ConfigMap
data:
  controller_manager_config.yaml: |
    featureGates:
      observability:
        metrics:
          createServiceMonitors: true
          createPrometheusRules: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="monitor-tempo-instances-and-the-operator">Monitor Tempo instances and the operator&lt;/h1>
&lt;p>You can configure the Tempo Operator to monitor TempoStack instances (including all Tempo components like the distributor). In addition, the operator can expose metrics about the operator itself (for example, the number of successful and failed upgrades, etc.).&lt;/p></description></item><item><title>Grafana data source</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/grafana_datasource/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/grafana_datasource/</guid><content><![CDATA[&lt;h1 id=&#34;grafana-data-source&#34;&gt;Grafana data source&lt;/h1&gt;
&lt;p&gt;You can use Grafana to query and visualize traces of the &lt;code&gt;TempoStack&lt;/code&gt; instance by configuring a Tempo data source in Grafana.&lt;/p&gt;
&lt;h2 id=&#34;use-grafana-operator&#34;&gt;Use Grafana Operator&lt;/h2&gt;
&lt;p&gt;If your Grafana instance is managed by the &lt;a href=&#34;/docs/grafana-cloud/developer-resources/infrastructure-as-code/grafana-operator/&#34;&gt;Grafana Operator&lt;/a&gt;, you can instruct the Tempo Operator to create a data source (&lt;code&gt;GrafanaDatasource&lt;/code&gt; custom resource):&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: tempo.grafana.com/v1alpha1
kind: TempoStack
spec:
  observability:
    grafana:
      createDatasource: true&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 feature gate &lt;code&gt;featureGates.grafanaOperator&lt;/code&gt; must be enabled in the Tempo Operator configuration.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;manual-data-source-configuration&#34;&gt;Manual data source configuration&lt;/h2&gt;
&lt;p&gt;You can choose to either use Tempo Operator&amp;rsquo;s gateway or not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If the &lt;code&gt;TempoStack&lt;/code&gt; is deployed using the gateway, you&amp;rsquo;ll need to provide authentication information to Grafana, along with the URL of the tenant from which you expect to see the traces.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the gateway is not used, then you need to make sure Grafana can access the &lt;code&gt;query-frontend&lt;/code&gt; endpoints.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&#34;/docs/grafana/latest/datasources/tempo/&#34;&gt;Tempo data source for Grafana&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;use-with-gateway&#34;&gt;Use with gateway&lt;/h3&gt;
&lt;p&gt;The gateway, an optional component deployed as part of Tempo Operator, provides secure access to Tempo&amp;rsquo;s distributor (for example, for pushing spans) and query-frontend (for example, for querying traces) via consulting an OAuth/OIDC endpoint for the request subject.&lt;/p&gt;
&lt;p&gt;The OIDC configuration expects &lt;code&gt;clientID&lt;/code&gt; and &lt;code&gt;clientSecret&lt;/code&gt;. They should be provided via a Kubernetes secret that the &lt;code&gt;TempoStack&lt;/code&gt; admin provides upfront.&lt;/p&gt;
&lt;p&gt;The gateway exposes all Tempo query endpoints, so you can use the endpoint as a Tempo data source for Grafana.&lt;/p&gt;
&lt;p&gt;If Grafana is configured with some OAuth provider, such as generic OAuth, the &lt;code&gt;TempoStack&lt;/code&gt; with the gateway should be deployed using the same &lt;code&gt;clientID&lt;/code&gt; and &lt;code&gt;clientSecret&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: Secret
metadata:
  name: oidc-test
stringData:
  clientID: &amp;lt;clientID used for grafana authentication&amp;gt;
  clientSecret: &amp;lt;clientSecret used for grafana authentication&amp;gt;
type: Opaque&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then deploy &lt;code&gt;TempoStack&lt;/code&gt; with gateway enabled:&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;spec:
  template:
    gateway:
      enabled: true
  tenants:
    mode: static
    authentication:
      - tenantName: test-oidc
        tenantId: test-oidc
        oidc:
        issuerURL: http://dex:30556/dex
        redirectURL: http://tempo-foo-gateway:8080/oidc/test-oidc/callback
        usernameClaim: email
        secret:
          name: oidc-test&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Set the data source URL parameter to &lt;code&gt;http://&amp;lt;HOST&amp;gt;:&amp;lt;PORT&amp;gt;/api/traces/v1/{tenant}/tempo/&lt;/code&gt;, where &lt;code&gt;{tenant}&lt;/code&gt; is the name of the tenant.&lt;/p&gt;
&lt;p&gt;To use it as a data source, set the Authentication Method to &lt;strong&gt;Forward Oauth Identify&lt;/strong&gt; using the same &lt;code&gt;clientID&lt;/code&gt; and &lt;code&gt;clientSecret&lt;/code&gt; for gateway and for the OAuth configuration. This will forward the &lt;code&gt;access_token&lt;/code&gt; to the gateway so it can authenticate the client.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;&lt;img src=&#34;../grafana_datasource_tempo.png&#34; alt=&#34;Tempo data source configured for the gateway forwarding OAuth access token&#34;&gt;&lt;/p&gt;
&lt;p&gt;If you prefer to set the Bearer token directly and not use the &lt;strong&gt;Forward Oauth Identify&lt;/strong&gt;, you can add it to the &amp;ldquo;Authorization&amp;rdquo; Header.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;&lt;img src=&#34;../grafana_datasource_tempo_headers.png&#34; alt=&#34;Tempo data source configured for the gateway using Bearer token&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;without-the-gateway&#34;&gt;Without the gateway&lt;/h3&gt;
&lt;p&gt;If you are not using the gateway, make sure your Grafana can access to the query-frontend endpoints, you can do this by creating an ingress or a route in OpenShift.&lt;/p&gt;
&lt;p&gt;Once you have the endpoint, you can set it as &lt;code&gt;URL&lt;/code&gt; when you create the Tempo data source.&lt;/p&gt;
]]></content><description>&lt;h1 id="grafana-data-source">Grafana data source&lt;/h1>
&lt;p>You can use Grafana to query and visualize traces of the &lt;code>TempoStack&lt;/code> instance by configuring a Tempo data source in Grafana.&lt;/p>
&lt;h2 id="use-grafana-operator">Use Grafana Operator&lt;/h2>
&lt;p>If your Grafana instance is managed by the &lt;a href="/docs/grafana-cloud/developer-resources/infrastructure-as-code/grafana-operator/">Grafana Operator&lt;/a>, you can instruct the Tempo Operator to create a data source (&lt;code>GrafanaDatasource&lt;/code> custom resource):&lt;/p></description></item><item><title>Monolithic deployment</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/monolithic/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/monolithic/</guid><content><![CDATA[&lt;h1 id=&#34;monolithic-deployment&#34;&gt;Monolithic deployment&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;TempoMonolithic&lt;/code&gt; Custom Resource (CR) creates a Tempo deployment in 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/plan/deployment-modes/#monolithic-mode&#34;&gt;Monolithic mode&lt;/a&gt;.
In this mode, a single container has all components of the Tempo deployment, including the compactor, distributor, ingester, querier, and query-frontend.&lt;/p&gt;
&lt;p&gt;This type of deployment is ideal for small deployments, demo, and test setups, and supports storing traces in memory, in a Persistent Volume and in object storage.&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 monolithic deployment of Tempo doesn&amp;rsquo;t scale horizontally.
If you require horizontal scaling, use the &lt;code&gt;TempoStack&lt;/code&gt; CR for a Tempo deployment in 
    &lt;a href=&#34;/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/plan/deployment-modes/#microservices-mode&#34;&gt;Microservices mode&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;quickstart&#34;&gt;Quickstart&lt;/h2&gt;
&lt;p&gt;The following manifest creates a Tempo monolithic deployment with trace ingestion over OTLP/gRPC and OTLP/HTTP, storing traces in a 2 GiB &lt;code&gt;tmpfs&lt;/code&gt; volume (in-memory storage).&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: tempo.grafana.com/v1alpha1
kind: TempoMonolithic
metadata:
  name: sample
spec:
  storage:
    traces:
      backend: memory
      size: 2Gi&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After the Pod is ready, you can send traces to &lt;code&gt;tempo-sample:4317&lt;/code&gt; (OTLP/gRPC) and &lt;code&gt;tempo-sample:4318&lt;/code&gt; (OTLP/HTTP) inside the cluster.&lt;/p&gt;
&lt;p&gt;To configure a Grafana data source, use the URL &lt;code&gt;http://tempo-sample:3200&lt;/code&gt; (available inside the cluster).&lt;/p&gt;
&lt;h2 id=&#34;crd-specification&#34;&gt;CRD specification&lt;/h2&gt;
&lt;p&gt;A manifest with all available configuration options is available here: &lt;a href=&#34;https://github.com/grafana/tempo-operator/blob/main/docs/spec/tempo.grafana.com_tempomonolithics.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;tempo.grafana.com_tempomonolithics.yaml&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;This file is auto-generated and does not constitute a valid CR.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;It provides an overview of the structure, the available configuration options and help texts.&lt;/p&gt;
]]></content><description>&lt;h1 id="monolithic-deployment">Monolithic deployment&lt;/h1>
&lt;p>The &lt;code>TempoMonolithic&lt;/code> Custom Resource (CR) creates a Tempo deployment in
&lt;a href="/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/plan/deployment-modes/#monolithic-mode">Monolithic mode&lt;/a>.
In this mode, a single container has all components of the Tempo deployment, including the compactor, distributor, ingester, querier, and query-frontend.&lt;/p></description></item><item><title>Operator configuration and CRD specifications</title><link>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/api-docs/</link><pubDate>Thu, 09 Apr 2026 14:59:14 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.10.x/set-up-for-tracing/setup-tempo/deploy/kubernetes/operator/api-docs/</guid><content><![CDATA[&lt;h1 id=&#34;operator-configuration-and-crd-specifications&#34;&gt;Operator configuration and CRD specifications&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;The Operator configuration can be found at &lt;a href=&#34;https://github.com/grafana/tempo-operator/blob/main/docs/operator/config.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;tempo-operator/docs/operator/config.yaml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;TempoStack&lt;/code&gt; CRD documentation can be found at &lt;a href=&#34;https://github.com/grafana/tempo-operator/blob/main/docs/spec/tempo.grafana.com_tempostacks.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;tempo-operator/docs/spec/tempo.grafana.com_tempostacks.yaml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;TempoMonolithic&lt;/code&gt; CRD documentation can be found at &lt;a href=&#34;https://github.com/grafana/tempo-operator/blob/main/docs/spec/tempo.grafana.com_tempomonolithics.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;tempo-operator/docs/spec/tempo.grafana.com_tempomonolithics.yaml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="operator-configuration-and-crd-specifications">Operator configuration and CRD specifications&lt;/h1>
&lt;ul>
&lt;li>The Operator configuration can be found at &lt;a href="https://github.com/grafana/tempo-operator/blob/main/docs/operator/config.yaml" target="_blank" rel="noopener noreferrer">tempo-operator/docs/operator/config.yaml&lt;/a>&lt;/li>
&lt;li>The &lt;code>TempoStack&lt;/code> CRD documentation can be found at &lt;a href="https://github.com/grafana/tempo-operator/blob/main/docs/spec/tempo.grafana.com_tempostacks.yaml" target="_blank" rel="noopener noreferrer">tempo-operator/docs/spec/tempo.grafana.com_tempostacks.yaml&lt;/a>&lt;/li>
&lt;li>The &lt;code>TempoMonolithic&lt;/code> CRD documentation can be found at &lt;a href="https://github.com/grafana/tempo-operator/blob/main/docs/spec/tempo.grafana.com_tempomonolithics.yaml" target="_blank" rel="noopener noreferrer">tempo-operator/docs/spec/tempo.grafana.com_tempomonolithics.yaml&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>