---
title: "Configure GEM federation-frontend | Grafana Labs Helm charts documentation"
description: "Learn how to enable the GEM federation-frontend."
---

> For a curated documentation index, see [llms.txt](/llms.txt). For the complete documentation index, see [llms-full.txt](/llms-full.txt).

# Configure GEM federation-frontend

You can deploy the Grafana Enterprise Metrics (GEM) federation-frontend in a Kubernetes cluster using Helm. The federation-frontend allows you to query data from multiple GEM clusters using a single endpoint. For more information about cluster query federation, refer to the [federation-frontend documentation](/docs/enterprise-metrics/v2.17.x/operations/cluster-query-federation/).

> Note
> 
> This guide focuses specifically on deploying the federation-frontend component as a standalone deployment without any additional GEM or Mimir components.

## Before you begin

1. Set up a GEM cluster: For information about setting up and configuring a GEM deployment, refer to [Deploy Grafana Enterprise Metrics using the Helm chart](/docs/helm-charts/mimir-distributed/latest/get-started-helm-charts/gs-gem/).
2. Provision an access token with the `metrics:read` scope for each cluster that you want to query. For more information, refer to [Set up a GEM tenant](/docs/enterprise-metrics/v2.17.x/set-up-gem-tenant/).

## Deploy the GEM federation-frontend

1. Create a Kubernetes `Secret` named `gem-tokens` with the GEM access tokens for each of the remote GEM clusters. The Helm values file uses this `Secret` later. Replace `TOKEN1` and `TOKEN2` with the access tokens for the remote GEM clusters.
   
   YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
   
   ```yaml
   apiVersion: v1
   kind: Secret
   metadata:
     name: gem-tokens
   data:
     CLUSTER_1_GEM_TOKEN: TOKEN1
     CLUSTER_2_GEM_TOKEN: TOKEN2
   ```
2. Apply the secret to your cluster in the `federation-frontend-demo` namespace with the `kubectl` command:
   
   Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
   
   ```bash
   kubectl -n federation-frontend-demo apply -f mysecret.yaml
   ```
3. Create a values file named `federation-frontend.yaml` with the following content.
   
   Replace `http://gem-query-frontend.monitoring.svc.cluster.local:8080/prometheus` and `https://gem.monitoring.acme.local/prometheus` with the URLs of the GEM clusters you want to query. Replace `tenant-1` and `tenant-2` with the tenant IDs of the remote GEM clusters.
   
   Note that these resource settings are examples that are sufficient for small deployments. Adjust the values based on your specific requirements and load:
   
   YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
   
   ```yaml
   # Enable enterprise features
   enterprise:
     enabled: true
   
   # Enable and configure federation-frontend
   federation_frontend:
     enabled: true
     # Since this is a standalone deployment, configure the chart to not render any of the other GEM components.
     disableOtherComponents: true
     replicas: 2
     resources:
       requests:
         cpu: 100m
         memory: 128Mi
       limits:
         cpu: 1
         memory: 256Mi
     extraEnvFrom:
       - secretRef:
           name: gem-tokens
   
   # Configure the remote GEM clusters to query.
   mimir:
     structuredConfig:
       auth:
         type: trust
       # The federation-frontend doesn't handle authentication or authorization. Disabling multitenancy means the federation-frontend doesn't require the X-Scope-OrgID header.
       # With disabled multitenancy, the federation-frontend uses the authn/z material from the proxy_targets configuration.
       # For a complete list of configuration options, refer to the configuration reference at https://grafana.com/docs/enterprise-metrics/<GEM_VERSION>/config/reference/#federation.
       multitenancy_enabled: false
       federation:
         proxy_targets:
           - name: "cluster-1"
             url: "http://gem-query-frontend.monitoring.svc.cluster.local:8080/prometheus"
             basic_auth:
               username: tenant-1
               password: "${CLUSTER_1_GEM_TOKEN}"
   
           - name: "cluster-2"
             url: "https://gem.monitoring.acme.local/prometheus"
             basic_auth:
               username: tenant-2
               password: "${CLUSTER_2_GEM_TOKEN}"
   
   # Disable MinIO
   minio:
     enabled: false
   
   # The federation-frontend doesn't need the rollout-operator for rollouts, so it can be disabled.
   rollout_operator:
     enabled: false
   ```
4. Deploy the federation-frontend using `helm`:
   
   Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
   
   ```bash
   helm install federation-frontend grafana/mimir-distributed -f federation-frontend.yaml -n federation-frontend-demo
   ```
   
   This deploys only the federation-frontend component. The federation-frontend is configured to proxy queries to the GEM clusters that you specify in the `proxy_targets` configuration.
5. Verify that the federation-frontend is running. The simplest way to do this is to issue a label names query against the federation-frontend service.
   
   This example tries to reach the Kubernetes service from the cluster and request the label names from the past 12 hours.
   
   Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
   
   ```bash
   curl -XPOST 'https://mimir-federation-frontend:8080/prometheus/api/v1/labels' \
     -d "start=$(date -u +%Y-%m-%dT%H:%M:%S.0Z -d '12 hours ago' 2>/dev/null || date -u -v -12H +%Y-%m-%dT%H:%M:%S.0Z)" \
     -d "end=$(date -u +%Y-%m-%dT%H:%M:%S.0Z)"
   ```
   
   You should receive a response with the label names from the remote GEM clusters similar to this:
   
   JSON ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
   
   ```json
   {
     "status": "success",
     "data": ["__cluster__", "__name__", "hash_extra", "series_id"]
   }
   ```
