<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Federation-frontend on Grafana Labs</title><link>https://grafana.com/docs/enterprise-traces/v2.8.x/configure/federation/</link><description>Recent content in Federation-frontend on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/enterprise-traces/v2.8.x/configure/federation/index.xml" rel="self" type="application/rss+xml"/><item><title>Cross-tenant query federation</title><link>https://grafana.com/docs/enterprise-traces/v2.8.x/configure/federation/tenant-federation/</link><pubDate>Thu, 24 Jul 2025 15:08:34 +0000</pubDate><guid>https://grafana.com/docs/enterprise-traces/v2.8.x/configure/federation/tenant-federation/</guid><content><![CDATA[&lt;h1 id=&#34;cross-tenant-query-federation&#34;&gt;Cross-tenant query federation&lt;/h1&gt;
&lt;p&gt;GET supports creating access policies that can span multiple tenants. Viewers in Grafana Enterprise can see data coming from more than one tenant simultaneously.&lt;/p&gt;
&lt;p&gt;By default, the GET gateway service is used as the target for querying GET (for example, using trace ID or TraceQL queries) and sending trace span data (using OTLP gRPC).
Cross-tenant query federation, however, requires an extra component called the federation-frontend service.&lt;/p&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;
&lt;p&gt;The federation-frontend service acts as the target for queries instead of the GET gateway service. The diagram below shows this as a visualization:&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-tenant-fed-architecture.png&#34;
  alt=&#34;How the federation-frontend service enables cross-tenant query federation&#34; width=&#34;909&#34;
     height=&#34;603&#34;/&gt;&lt;/p&gt;
&lt;p&gt;The data from multiple tenants is aggregated in a single trace lookup or search query as multiple queries to the GET gateway. The gateway then carries out these queries and returns the data to the federation service which combines them as a final query result.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;federation-frontend&lt;/code&gt; runs with tenant federation enabled by default. The &lt;code&gt;federation-frontend&lt;/code&gt; service can be deployed independently from a GET installation, however, there are certain circumstances in which some queries are not valid in this case.&lt;/p&gt;
&lt;p&gt;Cross-tenant queries are made by sending queries via the federation-frontend service that include basic authentication with a username signifying that multiple tenants should be inspected. In this case, the username can be either tenant names or a wildcard to search all tenants when configuring the Authentication in the GET plugin.
These tenants must be accessible using the same access policy token and separated by the pipe (&lt;code&gt;|&lt;/code&gt;) symbol, or using the wildcard (&lt;code&gt;*&lt;/code&gt;) symbol. Using the wildcard symbol searches all tenants that can be queried by the supplied access token.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-plugin-xtenant-auth-closeup.png&#34;
  alt=&#34;Example authentication in the GET plugin for cross-tenant&#34; width=&#34;624&#34;
     height=&#34;294&#34;/&gt;&lt;/p&gt;
&lt;p&gt;This page covers the ability to query data from multiple tenants at once.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;The procedures on this page assume there are two GET tenants: &lt;code&gt;team-engineering&lt;/code&gt; and &lt;code&gt;team-finance&lt;/code&gt;. To create a tenant, refer to &lt;a href=&#34;/docs/enterprise-traces/v2.8.x/setup/set-up-get-tenants/&#34;&gt;Set up a GET tenant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;federation-frontend&lt;/code&gt; target itself requires a &lt;a href=&#34;/docs/enterprise-traces/v2.8.x/setup/&#34;&gt;configured GET installation&lt;/a&gt; installed using the &lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/get-started-helm-charts/&#34;&gt;tempo-distributed Helm chart&lt;/a&gt;. The examples provided use a GET installation that does not use TLS.&lt;/p&gt;
&lt;p&gt;For cross-tenant querying, the federation-frontend component is usually deployed as part of a larger GET installation, and therefore has access to all of the configuration for that installation.
Specify cross-tenant requests in the form &lt;code&gt;&amp;lt;tenant1&amp;gt;|&amp;lt;tenant2&amp;gt;|...&amp;lt;tenantN&amp;gt;&lt;/code&gt;, in which case the federation-frontend separate the request into individual tenant requests.&lt;/p&gt;
&lt;p&gt;To allow requests from any valid tenant associated with the supplied token, use a wildcard tenant name (&lt;code&gt;*&lt;/code&gt;) as the username in cross-tenant requests.
To use a wildcard tenant name, your federation-frontend must access the admin storage bucket as the GET clusters so the service can retrieve the specific tenants that pertain to the access policy that the token represents.
Verify that the federation-frontend configuration includes an &lt;code&gt;admin_client&lt;/code&gt; section. For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;auth_enabled: true
admin_client:
  storage:
    backend: s3
    s3:
      bucket_name: &amp;lt;bucketName&amp;gt;
      endpoint: &amp;lt;s3Endpoint&amp;gt;
      access_key_id: &amp;lt;accessKey&amp;gt;
      secret_access_key: &amp;lt;secretKey&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In situations where a wildcard tenant name passes to the federation-frontend, you must supply an &lt;code&gt;admin_client&lt;/code&gt; configuration section if the component is not part of a GET installation.&lt;/p&gt;
&lt;h2 id=&#34;configure-cross-tenant-queries&#34;&gt;Configure cross-tenant queries&lt;/h2&gt;
&lt;p&gt;To enable the federation-frontend for an installed GET cluster, you need to add an extra configuration in your Helm chart’s &lt;code&gt;values.yaml&lt;/code&gt; file and upgrade the GET cluster using the &lt;code&gt;values.yaml&lt;/code&gt; file.
This configuration assumes that TLS is not enabled as part of the GET installation.&lt;/p&gt;
&lt;p&gt;This example configuration enables the federation-frontend service, and then details the targets that it should use to send onward queries to, via the &lt;code&gt;proxy_targets&lt;/code&gt; URL list (this being the GET gateway).
The default access policy management in GET allows only for tokens created in that GET cluster to access its own tenants, and therefore there is only one entry in the &lt;code&gt;proxy_targets&lt;/code&gt; list.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&#34;/docs/enterprise-traces/latest/configure/reference/#federation_config&#34;&gt;federation-frontend configuration documentation&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Locate your &lt;code&gt;values.yaml&lt;/code&gt; file used with your &lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/get-started-helm-charts/&#34;&gt;&lt;code&gt;tempo-distributed&lt;/code&gt; Helm chart&lt;/a&gt; installation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the file and add the following section:&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;enterpriseFederationFrontend:
  enabled: true
  proxy_targets:
	- url: http://myinstall-get-cluster-tempo-enterprise-gateway.get.svc:3100
  	tls_insecure_skip_verify: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Save the changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the command below to upgrade the GET cluster with the changes in your &lt;code&gt;values.yaml&lt;/code&gt; file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the GET installation name (&lt;code&gt;MYINSTALL-GET-CLUSTER&lt;/code&gt;) to your GET cluster&lt;/li&gt;
&lt;li&gt;Add the appropriate namespace by replacing &lt;code&gt;GET-NAMESPACE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add the version number of the Helm chart (&lt;code&gt;HELM-CHART-VERSION&lt;/code&gt;).
Run the command to upgrade the GET cluster.&lt;/li&gt;
&lt;/ul&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;helm upgrade -f values.yaml MYINSTALL-GET-CLUSTER grafana/tempo-distributed --namespace GET-NAMESPACE --version HELM-CHART-VERSION&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Helm updates the GET installation to include the federation-frontend service, which allows any queries routed to it to be cross-tenant compatible.&lt;/p&gt;
&lt;p&gt;Queries against single tenants can be sent via the GET gateway, if required, although it may be more convenient to use the service for all queries regardless of cross-tenant status.&lt;/p&gt;
&lt;h2 id=&#34;set-up-an-access-policy-with-tenant-federation-and-a-token&#34;&gt;Set up an access policy with tenant federation and a token&lt;/h2&gt;
&lt;p&gt;For demonstration purposes, we’ll create two new tenants, create a shared access policy for them, and then query trace data using a single data source and query.&lt;/p&gt;
&lt;h3 id=&#34;create-two-new-tenants&#34;&gt;Create two new tenants&lt;/h3&gt;
&lt;p&gt;First, create two new tenants, &lt;code&gt;team-engineering&lt;/code&gt; and &lt;code&gt;team-finance&lt;/code&gt;, using the &lt;a href=&#34;/grafana/plugins/grafana-enterprise-traces-app/&#34;&gt;Grafana Enterprise Traces plugin&lt;/a&gt; for Grafana.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Within Grafana, select &lt;strong&gt;Apps &amp;gt; Grafana Enterprise Traces&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Tenants&lt;/strong&gt; and then choose &lt;strong&gt;Create tenant&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name the first tenant &lt;code&gt;team-engineering&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Create tenant&lt;/strong&gt; again and name the second tenant &lt;code&gt;team-finance&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-plugin-two-new-tenants.png&#34;
  alt=&#34;Add two new tenants using the GET plugins&#34; width=&#34;1326&#34;
     height=&#34;520&#34;/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;create-an-access-policy-for-the-tenants&#34;&gt;Create an access policy for the tenants&lt;/h3&gt;
&lt;p&gt;To allow queries to span both GET tenants, create a new access policy called &lt;code&gt;leadership&lt;/code&gt;.
For demonstration purposes, name these tenants &lt;code&gt;team-engineering&lt;/code&gt; and &lt;code&gt;team-finance&lt;/code&gt;.
To create a raw access policy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new access policy &lt;code&gt;leadership&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable the &lt;code&gt;traces:read&lt;/code&gt; scope.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the tenants &lt;code&gt;team-engineering&lt;/code&gt; and &lt;code&gt;team-finance&lt;/code&gt;.
Alternatively, you can add the special tenant name &lt;code&gt;*&lt;/code&gt; to create an access policy that has access to all tenants in the cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Create&lt;/strong&gt; to add the new access policy.
&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-create-access-policy.png&#34;
  alt=&#34;Create a new access policy for the tenants&#34; width=&#34;1212&#34;
     height=&#34;776&#34;/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Add token&lt;/strong&gt; to create a new token for the access-policy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Copy to clipboard&lt;/strong&gt; to store the token in your clipboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;





  
  
  


&lt;div&gt;
  &lt;iframe src=&#34;https://player.vimeo.com/video/742056367?transparent=0&#34; title=&#34;vimeo video&#34; webkitallowfullscreen=&#34;&#34; mozallowfullscreen=&#34;&#34; allowfullscreen=&#34;&#34;&gt;&lt;/iframe&gt;
  &lt;div &gt;
    
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;set-up-a-grafana-data-source-using-the-access-policy&#34;&gt;Set up a Grafana data source using the access policy&lt;/h2&gt;
&lt;p&gt;In the standard configuration, the Grafana Enterprise Traces plugin creates a data source for each tenant, which uses the GET gateway and configures it specifically for the single tenant specified.
To use the cross-tenant capabilities, create a new Tempo data source that uses the federation-frontend service and specifies both tenants.&lt;/p&gt;
&lt;p&gt;To set up a data source using the access policy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new Tempo data source from the Grafana &lt;strong&gt;Connections&lt;/strong&gt; menu and select Data sources. Select &lt;strong&gt;Add new data source&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for Tempo and select &lt;strong&gt;Tempo data source&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under &lt;strong&gt;Connection&lt;/strong&gt; field, select &lt;strong&gt;URL&lt;/strong&gt; from the drop-down. Enter the URL of the frontend-federation Kubernetes service in your GET cluster. For example, where &lt;code&gt;mycluster-get-install-tempo-enterprise-federation-frontend&lt;/code&gt; represents your GET namespace: &lt;code&gt;http://mycluster-get-install-tempo-enterprise-federation-frontend.get.svc.cluster.local:3100&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the &lt;strong&gt;Authentication&lt;/strong&gt; section, enable &lt;strong&gt;Basic authentication&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;User&lt;/strong&gt; field, enter: &lt;code&gt;team-engineering|team-finance&lt;/code&gt; where all the names of the tenants that you want to query across are separated by the &lt;code&gt;|&lt;/code&gt; pipe character.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Password&lt;/strong&gt; field, paste the token created in the token creation process for the tenant policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At the bottom of the page, select &lt;strong&gt;Save&lt;/strong&gt; to preserve your changes and &lt;strong&gt;Test&lt;/strong&gt; to validate the configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-plugin-xtenant-auth.png&#34;
  alt=&#34;Authorization for cross-tenant configuration in the GET plugin&#34; width=&#34;1326&#34;
     height=&#34;956&#34;/&gt;&lt;/p&gt;
&lt;p&gt;The test should respond with ‘Data source successfully connected’.&lt;/p&gt;
&lt;h3 id=&#34;use-opentelemetry-telemetrygen-to-generate-tracing-data&#34;&gt;Use OpenTelemetry &lt;code&gt;telemetrygen&lt;/code&gt; to generate tracing data&lt;/h3&gt;
&lt;p&gt;Next, use &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry telemetrygen&lt;/a&gt; to generate tracing data to test your configuration.&lt;/p&gt;
&lt;p&gt;In the following instructions, the GET gateway is port-forwarded to a local development machine on port 3100 using the &lt;code&gt;kubectl port-forward&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;To use this example, replace the content in upper case with the information for your cluster.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl port-forward --address 0.0.0.0 service/MYCLUSTER-GET-INSTALL-TEMPO-ENTERPRISE-GATEWAY 3100:3100 --namespace GET-NAMESPACE&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;telemetrygen&lt;/code&gt; using the &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;installation procedure&lt;/a&gt;. NOTE: You don&amp;rsquo;t need to configure an OpenTelemetry Collector because you&amp;rsquo;re using Grafana Alloy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new &lt;code&gt;base64&lt;/code&gt; token for both the &lt;code&gt;team-engineering&lt;/code&gt; and &lt;code&gt;team-finance&lt;/code&gt; tenants. For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;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;echo &amp;#39;team-engineering:&amp;lt;generatedToken&amp;gt;&amp;#39; | base64
echo &amp;#39;team-finance:&amp;lt;generatedToken&amp;gt;&amp;#39; | base64&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run this command twice to generate traces using &lt;code&gt;telemetrygen&lt;/code&gt; for each separate tenant and token for each token. Replace the &lt;code&gt;base64Token&lt;/code&gt; with the one generated for each 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;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;telemetrygen traces --traces 1 --otlp-insecure --otlp-header &amp;#39;Authorization=&amp;#34;Basic &amp;lt;base64Token&amp;gt;&amp;#34;&amp;#39; --otlp-endpoint localhost:3100&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This configuration sends a single trace to each of the tenants. When a cross-tenant query runs, you should see two traces instead of a single trace for one tenant.&lt;/p&gt;
&lt;h3 id=&#34;use-cross-tenant-query-federation&#34;&gt;Use cross-tenant query federation&lt;/h3&gt;
&lt;p&gt;Queries are performed using the cross-tenant configured data source in either &lt;strong&gt;Explore&lt;/strong&gt; or inside of dashboards are performed across all the tenants that you specified in the &lt;strong&gt;User&lt;/strong&gt; field. These queries are processed as if all the data were in a single tenant.&lt;/p&gt;
&lt;p&gt;To submit a query across all tenants that your access policy has access rights to, you can either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Explicitly set the name of all the tenants separated by a pipe character &amp;ldquo;|&amp;rdquo; in the &lt;em&gt;username&lt;/em&gt;. For example, to query across &lt;code&gt;tenant1&lt;/code&gt;, &lt;code&gt;tenant2&lt;/code&gt;, and &lt;code&gt;tenant3&lt;/code&gt; you would enter &lt;code&gt;tenant1|tenant2|tenant3&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the username to a wildcard character &lt;code&gt;*&lt;/code&gt;. This will query all tenants that the access policy grants you access to, without requiring you to explicitly specify their names.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conversely, if you use a wildcard &lt;em&gt;username&lt;/em&gt; in your data source configuration with an access policy with specific tenants, that data source has access to only those tenants.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your Grafana instance and select the &lt;strong&gt;Explorer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select your cross-tenant data source.&lt;/li&gt;
&lt;li&gt;Selection &lt;strong&gt;Query type &amp;gt; Search&lt;/strong&gt; and select &lt;strong&gt;Run query&lt;/strong&gt;. You should see two traces returned, one from each tenant.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-xtenant-traceql-results.png&#34;
  alt=&#34;TraceQL query showing results for cross-tenant search&#34; width=&#34;1326&#34;
     height=&#34;956&#34;/&gt;&lt;/p&gt;
]]></content><description>&lt;h1 id="cross-tenant-query-federation">Cross-tenant query federation&lt;/h1>
&lt;p>GET supports creating access policies that can span multiple tenants. Viewers in Grafana Enterprise can see data coming from more than one tenant simultaneously.&lt;/p></description></item><item><title>Cross-cluster query federation</title><link>https://grafana.com/docs/enterprise-traces/v2.8.x/configure/federation/cluster-federation/</link><pubDate>Wed, 22 Apr 2026 04:21:40 +0000</pubDate><guid>https://grafana.com/docs/enterprise-traces/v2.8.x/configure/federation/cluster-federation/</guid><content><![CDATA[&lt;h1 id=&#34;cross-cluster-query-federation&#34;&gt;Cross-cluster query federation&lt;/h1&gt;
&lt;p&gt;Cross-cluster query federation lets you gather data from multiple Grafana Enterprise Traces (GET) clusters and provide access controls for the tracing data. Each GET cluster has to have its own license.
A team that is globally responsible for all observability can make a single query across the GET clusters for all regions to retrieve trace results.&lt;/p&gt;
&lt;p&gt;Using cross-cluster query federation, you control who can access tracing data at a cluster-level. Consider an organization that separates observability data via region. Each region may have its own GET cluster.
Engineering teams in that region may (or may not, refer to 
    &lt;a href=&#34;/docs/enterprise-traces/v2.8.x/configure/federation/tenant-federation/&#34;&gt;cross-tenant query federation&lt;/a&gt;) have access to the data for that region.
Depending upon the configuration, developers probably won&amp;rsquo;t have access to other regions&amp;rsquo; GET data.&lt;/p&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;
&lt;p&gt;The diagram below shows the cross-cluster federation architecture.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-cluster-fed-architecture.png&#34;
  alt=&#34;Cross-cluster query federation architecture&#34; width=&#34;1172&#34;
     height=&#34;457&#34;/&gt;&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;federation-frontend&lt;/code&gt; target itself requires a 
    &lt;a href=&#34;/docs/enterprise-traces/v2.8.x/setup/&#34;&gt;configured GET installation&lt;/a&gt; installed using the tempo-distributed Helm chart.&lt;/p&gt;
&lt;p&gt;No other GET components are required. You can run the federation-frontend service on its own.
The service configuration examples used in these procedures target the GET cluster it is configured alongside and a Grafana Cloud Traces tenant.&lt;/p&gt;
&lt;p&gt;You also need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The list of GET clusters and their gateway URLs. The clusters can be GET, Tempo open source, and Cloud Traces clusters.&lt;/li&gt;
&lt;li&gt;Authentication credentials for each cluster, including a tenant user and token for a GET cluster and Grafana Cloud Traces; refer to the &lt;a href=&#34;/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/&#34;&gt;Grafana Cloud Access Policies documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configure-authentication-for-cross-cluster-query-federation&#34;&gt;Configure authentication for cross-cluster query federation&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;federation-frontend&lt;/code&gt; target itself requires a 
    &lt;a href=&#34;/docs/enterprise-traces/v2.8.x/setup/&#34;&gt;configured GET installation&lt;/a&gt;.
No other GET components are required.&lt;/p&gt;
&lt;h3 id=&#34;set-up-the-federation-frontend&#34;&gt;Set up the federation-frontend&lt;/h3&gt;
&lt;p&gt;A minimal configuration of the &lt;code&gt;federation-frontend&lt;/code&gt; target has authentication disabled,
because it forwards the HTTP authentication header
(&lt;code&gt;Authorization: Basic ...&lt;/code&gt;) that is supplied by its clients to the target clusters.&lt;/p&gt;
&lt;p&gt;You need to configure a list of target clusters within the &lt;code&gt;enterpriseFederationFrontend.proxy_targets&lt;/code&gt; block. Currently, there are no equivalent CLI flags available.
Each entry requires a URL that points to a Tempo-compatible API.
For GET clusters, use this URL pattern with your GET gateway, port, and HTTP API prefix: &lt;code&gt;http://&amp;lt;get-gateway&amp;gt;:&amp;lt;get-port&amp;gt;/&amp;lt;http_api_prefix&amp;gt;.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Optionally, you can configure each &lt;code&gt;proxy_target&lt;/code&gt; to have Basic auth credentials, which override the user-supplied ones.&lt;/p&gt;
&lt;p&gt;When you configure Basic auth with the &lt;code&gt;proxy_target&lt;/code&gt; configuration, these credentials take precedence over the ones supplied by the client.
Without enabling authentication on the federation-frontend, any client that can reach the federation-frontend can perform queries on the target clusters by using those credentials.&lt;/p&gt;
&lt;p&gt;To set the &lt;code&gt;target&lt;/code&gt; option, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Locate your &lt;code&gt;values.yaml&lt;/code&gt; file used with your &lt;a href=&#34;/docs/helm-charts/tempo-distributed/next/get-started-helm-charts/&#34;&gt;tempo-distributed Helm chart installation&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the file and add the following section:&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;enterpriseFederationFrontend:
 enabled: true
 proxy_targets:
   - url: http://myinstall-get-cluster-tempo-enterprise-gateway.get.svc:3100
     tls_insecure_skip_verify: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This configures the federation-frontend to use your GET cluster as the first target. This example uses a single GET cluster. Because of this, authentication details can pass from the Grafana data source straight through the federation-frontend to the GET cluster gateway, for it to authenticate the tenant and token.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to Grafana Cloud, and generate a read token for your Grafana Cloud Traces instance. Refer to the &lt;a href=&#34;/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/&#34;&gt;Cloud Access Policies documentation&lt;/a&gt; for instructions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Retrieve the Grafana Cloud Traces user ID, the generated access token, and Grafana Cloud Traces endpoint. The user ID will be a number, the token a base64 encoded string, and the endpoint will look something like this: &lt;code&gt;https://tempo-us-central1.grafana.net/tempo&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following to the &lt;code&gt;proxy_targets&lt;/code&gt; section to your &lt;code&gt;values.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;   - url: https://&amp;lt;gctEndpoint&amp;gt;/tempo
     basic_auth:
       username: &amp;lt;userID&amp;gt;
       password: &amp;lt;token&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This target includes basic authentication. The authentication details passed by the request from Grafana are for the GET instance and not the Grafana Cloud instance. The federation-frontend lets you specify authentication details that will override any that are passed to it in a query. In this case, for the appropriate Grafana Cloud user.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-warning&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;This gives any client that can reach the federation-frontend access to your traces data in Grafana Cloud Traces without further authentication.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the GET cluster by running the following command. Before you execute the command, change the GET installation name (&lt;code&gt;MYINSTALL-GET-CLUSTER&lt;/code&gt;) and add the appropriate namespace (&lt;code&gt;GET-NAMESPACE&lt;/code&gt;) and version number of the Helm chart (&lt;code&gt;HELM-CHART-VERSION&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;helm upgrade -f values.yaml MYINSTALL-GET-CLUSTER grafana/tempo-distributed --namespace GET-NAMESPACE --version HELM-CHART-VERSION&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Helm updates the GET installation to include the federation-frontend service, which allows any queries routed to it to be cross-cluster compatible.&lt;/p&gt;
&lt;p&gt;Queries can be sent directly to the appropriate GET gateways, if required.&lt;/p&gt;
&lt;h2 id=&#34;set-up-an-access-policy-with-tenant-federation-and-a-token&#34;&gt;Set up an access policy with tenant federation and a token&lt;/h2&gt;
&lt;p&gt;For demonstration purposes, we’ll create a new tenant using the Grafana Enterprise Traces plugin for Grafana, create a shared access policy for them, and then query trace data using a single data source and query.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use the GET application plugin to create a new tenant called &lt;code&gt;team-engineering&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select ‘Create tenant’ and create the new tenants.&lt;/li&gt;
&lt;li&gt;Create a new access policy called &lt;code&gt;engineering&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-plugin-new-tenant.png&#34;
  alt=&#34;Create a new tenant in the GET plugin for Grafana&#34; width=&#34;1212&#34;
     height=&#34;429&#34;/&gt;&lt;/p&gt;
&lt;p&gt;To create a &lt;a href=&#34;/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/&#34;&gt;raw access policy&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new access policy called &lt;code&gt;engineering&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable the &lt;code&gt;traces:read&lt;/code&gt; scope (or all scopes for admin and writing access as well).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under the &lt;strong&gt;Tenants&lt;/strong&gt; section, add the &lt;code&gt;team-engineering&lt;/code&gt; tenant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Create&lt;/strong&gt; to create the new access policy.
&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-create-access-policy.png&#34;
  alt=&#34;Create a new access policy for the tenant&#34; width=&#34;1212&#34;
     height=&#34;776&#34;/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &lt;strong&gt;Add token&lt;/strong&gt; to create a new token for the access-policy. Click &lt;strong&gt;Copy to clipboard&lt;/strong&gt; to store the token in your clipboard.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;set-up-a-grafana-data-source-using-the-access-policy&#34;&gt;Set up a Grafana data source using the access policy&lt;/h3&gt;
&lt;p&gt;In the standard configuration, the GET plugin creates a data source for each tenant, which uses the GET gateway and configures it specifically for the single tenant specified. To use the cross-cluster capabilities, create a new Tempo data source that uses the federation-frontend service (not the default, which is the GET gateway) and specifies the tenant and generated token for basic auth.&lt;/p&gt;
&lt;p&gt;To set up a data source using the access policy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new Tempo data source. From the Grafana &lt;strong&gt;Connections&lt;/strong&gt; menu, select &lt;strong&gt;Data sources&lt;/strong&gt; and then click &lt;strong&gt;Add new data source&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for Tempo and select &lt;strong&gt;Tempo data source&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Under &lt;strong&gt;Connection&lt;/strong&gt; field, select &lt;strong&gt;URL&lt;/strong&gt; from the drop-down and enter the URL of the frontend-federation Kubernetes service in your GET cluster. For example (after replacing the appropriate &lt;get-namespace&gt;): &lt;code&gt;http://mycluster-get-install-tempo-enterprise-federation-frontend.get.svc.cluster.local:3100&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the &lt;strong&gt;Authentication&lt;/strong&gt; section, enable &lt;strong&gt;Basic authentication&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;User&lt;/strong&gt; field, enter: &lt;code&gt;team-engineering&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Password&lt;/strong&gt; field, paste the token created in the token creation process for the tenant policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/enterprise-traces/get-plugin-data-source-setup.png&#34;
  alt=&#34;Set up connection and authentication for new data source&#34; width=&#34;1212&#34;
     height=&#34;898&#34;/&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At the bottom of the page, select &lt;strong&gt;Save&lt;/strong&gt; to preserve your changes and &lt;strong&gt;Test&lt;/strong&gt; to validate the configuration. The test should respond with ‘Data source successfully connected’.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;generate-tracing-data-with-opentelemetry-telemetrygen&#34;&gt;Generate tracing data with OpenTelemetry &lt;code&gt;telemetrygen&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Next, you can use &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry telemetrygen&lt;/a&gt; to generate tracing data to test your configuration.&lt;/p&gt;
&lt;p&gt;In the following instructions, the GET gateway is port-forwarded to a local development machine on port 3100 using the &lt;code&gt;kubectl port-forward&lt;/code&gt; command. To use this example, replace the content in upper case with the information for your cluster.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl port-forward --address 0.0.0.0 service/MYCLUSTER-GET-INSTALL-TEMPO-ENTERPRISE-GATEWAY 3100:3100 --namespace GET-NAMESPACE&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To generate data and send it to your GET cluster:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;telemetrygen&lt;/code&gt; using the &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;installation procedure&lt;/a&gt;. NOTE: You do not need to configure an OpenTelemetry Collector because you&amp;rsquo;re using Grafana Alloy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create two new &lt;code&gt;base64&lt;/code&gt; token, one for &lt;code&gt;team-engineering&lt;/code&gt; and the other for the Grafana Cloud Traces user tenants. For example:&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;echo &amp;#39;team-engineering:&amp;lt;generatedToken&amp;gt;&amp;#39; | base64
echo &amp;#39;&amp;lt;gctUser&amp;gt;:&amp;lt;gctToken&amp;gt;&amp;#39; | base64&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run this command to generate a trace using &lt;code&gt;telemtrygen&lt;/code&gt; for the &lt;code&gt;team-engineering&lt;/code&gt; tenant. Replace the &lt;code&gt;base64Token&lt;/code&gt; with the one generated for the tenant.&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;telemetrygen traces --traces 1 --otlp-insecure --otlp-header &amp;#39;Authorization=&amp;#34;Basic &amp;lt;base64Token&amp;gt;&amp;#34;&amp;#39; --otlp-endpoint localhost:3100&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run this command to generate a trace using &lt;code&gt;telemtrygen&lt;/code&gt; for the Grafana Cloud Traces user. Replace the &lt;code&gt;base64Token&lt;/code&gt; with the one generated for the Grafana Cloud Traces user. Replace &lt;code&gt;&amp;lt;GCTendpoint&amp;gt;&lt;/code&gt; with the Grafana Cloud Traces endpoint.&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;telemetrygen traces --traces 1 --otlp-header &amp;#39;Authorization=&amp;#34;Basic &amp;lt;token&amp;gt;&amp;#34;&amp;#39; --otlp-endpoint &amp;lt;GCTendpoint&amp;gt;:443&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This configuration sends a single trace to the tenant.
This means when GET performs a cross-cluster query, you should see two traces instead of a single trace for one cluster.&lt;/p&gt;
&lt;h2 id=&#34;use-cross-cluster-query-federation&#34;&gt;Use cross-cluster query federation&lt;/h2&gt;
&lt;p&gt;Queries run with the configured data source in either &lt;strong&gt;Explore&lt;/strong&gt; or inside of dashboards are performed across all the clusters specified in federation-frontend proxy targets.
These queries are processed as if all the data were from a single source.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your Grafana instance and select &lt;strong&gt;Explore&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select your cross-cluster data source.&lt;/li&gt;
&lt;li&gt;Selection &lt;strong&gt;Query type &amp;gt; Search&lt;/strong&gt; and select &lt;strong&gt;Run query&lt;/strong&gt;. You should see two traces returned, one from the GET cluster and the other from Grafana Cloud.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;aggregate-traces-from-a-local-get-cluster-and-grafana-cloud-traces-instance&#34;&gt;Aggregate traces from a local GET cluster and Grafana Cloud Traces instance&lt;/h2&gt;
&lt;p&gt;The federation-frontend provides an aggregated view of traces stored
in a local GET cluster and a hosted Grafana Cloud Traces instance. With the
following configuration, you can query both of the clusters as though they were
one:&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;federation:
  proxy_targets:
    - name: own-data-center
      url: http://get/tempo
    - name: grafana-cloud
      url: https://tempo-us-central1.grafana.net/tempo
      basic_auth:
        username: &amp;lt;instance-id&amp;gt;
        password: &amp;lt;token&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div class=&#34;admonition admonition-&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;&lt;/p&gt;&lt;p&gt;This gives any client that can reach the federation-frontend access to your traces data in Grafana Cloud Traces without further authentication.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;By using the authentication credentials of the local GET cluster in your query request, you can
execute a query against both clusters. To do so, set the access policy&amp;rsquo;s token
as a variable for subsequent commands:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;export API_TOKEN=&amp;#34;the long token string you copied&amp;#34;
curl -s -u &amp;#34;&amp;lt;tenant-id&amp;gt;:$API_TOKEN&amp;#34; http://federation-frontend/tempo/api/traces/4d65822107fcfd52 | jq&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The federation-frontend passes the credentials from your query command to &lt;code&gt;cluster=&amp;quot;own-data-center&amp;quot;&lt;/code&gt;.
Because the &lt;code&gt;basic_auth&lt;/code&gt; block is configured to include credentials for the &lt;code&gt;grafana-cloud&lt;/code&gt; cluster, the credentials supplied in the query command are overridden with those from the configuration file.
The credentials in the configuration file are used to authenticate with the &lt;code&gt;grafana-cloud&lt;/code&gt; cluster.&lt;/p&gt;
]]></content><description>&lt;h1 id="cross-cluster-query-federation">Cross-cluster query federation&lt;/h1>
&lt;p>Cross-cluster query federation lets you gather data from multiple Grafana Enterprise Traces (GET) clusters and provide access controls for the tracing data. Each GET cluster has to have its own license.
A team that is globally responsible for all observability can make a single query across the GET clusters for all regions to retrieve trace results.&lt;/p></description></item></channel></rss>