<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Reference on Grafana Labs</title><link>https://grafana.com/docs/enterprise-metrics/v2.17.x/reference/</link><description>Recent content in Reference on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/enterprise-metrics/v2.17.x/reference/index.xml" rel="self" type="application/rss+xml"/><item><title>Troubleshoot GEM</title><link>https://grafana.com/docs/enterprise-metrics/v2.17.x/reference/troubleshoot/</link><pubDate>Mon, 18 Aug 2025 18:19:44 +0000</pubDate><guid>https://grafana.com/docs/enterprise-metrics/v2.17.x/reference/troubleshoot/</guid><content><![CDATA[&lt;h1 id=&#34;troubleshoot-gem&#34;&gt;Troubleshoot GEM&lt;/h1&gt;
&lt;p&gt;You might encounter these issues while operating a GEM cluster. Follow these steps to troubleshoot.&lt;/p&gt;
&lt;h2 id=&#34;write-path&#34;&gt;Write path&lt;/h2&gt;
&lt;p&gt;Use the &lt;strong&gt;Writes&lt;/strong&gt; and &lt;strong&gt;Writes Resources&lt;/strong&gt; GEM system monitoring dashboards for insight into the performance of the write path.&lt;/p&gt;
&lt;p&gt;Read the &lt;strong&gt;Writes&lt;/strong&gt; dashboard from top to bottom. Each row represents a step in write path processing. You can isolate high write-latency to a specific component by finding the dashboard row with increased latency. After isolating the component, use the per-instance graph panel to narrow down the issue to specific instances.&lt;/p&gt;
&lt;p&gt;Typically, 99 percentile latency (P99 latency) for distributors ranges 50-100ms. If this value is higher, you might need to scale up distributors.&lt;/p&gt;
&lt;p&gt;For ingesters, P99 latency typically ranges 5-50ms. If this value is higher, investigate the root cause before scaling up ingesters.&lt;/p&gt;
&lt;p&gt;Increased latency can have a number of causes, including compute or disk resource starvation. Use the &lt;strong&gt;Writes Resources&lt;/strong&gt; dashboard to investigate the compute and disk resources in-use by each component of the cluster involved in the write path.&lt;/p&gt;
&lt;h3 id=&#34;out-of-order-sample-errors&#34;&gt;Out-of-order sample errors&lt;/h3&gt;
&lt;p&gt;Unless you&amp;rsquo;ve configured experimental out-of-order sample ingestion, GEM must ingest samples of each series in order. If this requirement isn&amp;rsquo;t met, GEM returns the out-of-order sample error. To learn more about how to configure experimental out-of-order sample ingestion, refer to &lt;a href=&#34;/docs/mimir/latest/configure/configure-out-of-order-samples-ingestion/&#34;&gt;Configure out-of-order samples ingestion&lt;/a&gt; in the Mimir documentation.&lt;/p&gt;
&lt;p&gt;You can query the rate of out-of-order sample errors, as shown:&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;promql&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-promql&#34;&gt;sum by (reason) (rate(cortex_discarded_samples_total{reason=&amp;#34;sample-out-of-order&amp;#34;}[$__rate_interval]))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Common reasons for samples sent out-of-order include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple Prometheus servers or Grafana agents sending the same data.&lt;/li&gt;
&lt;li&gt;Non-configured, or misconfigured, high-availability (HA) tracking. HA tracking is the specific configuration used to deduplicate writes from Prometheus server HA pairs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When multiple clients send the same data, you might see logs with the &lt;code&gt;sample with repeated timestamp but different value&lt;/code&gt; message. To enable source IP logging, set &lt;code&gt;-server.log-source-ips-enabled = true&lt;/code&gt; in the configuration YAML file. For details about configuring source IP logging, refer to the 
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/configure/config-gem/reference/#server&#34;&gt;server_config&lt;/a&gt; section of the reference configuration page.&lt;/p&gt;
&lt;p&gt;HA tracking uses labels to deduplicate writes from HA Prometheus servers or Grafana agents scraping the same targets. Ensure that all samples are sent with a specific cluster and replica label. By default, these use the label names &lt;code&gt;cluster&lt;/code&gt; and &lt;code&gt;__replica__&lt;/code&gt;, but you can set these values individually for each tenant.
During deduplication with HA tracking enabled, the replica label is removed from the samples. However, with misconfigured clients, these labels may not be present on all samples, which may be ingested with these labels intact.&lt;/p&gt;
&lt;p&gt;You can identify series without the replica label, for example &lt;code&gt;__replica__&lt;/code&gt;, with the following query:&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;promql&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-promql&#34;&gt;count({__name__=~&amp;#34;.&amp;#43;&amp;#34;, __replica__=&amp;#34;&amp;#34;})&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;Only the first sample in a remote-write batch is checked for deduplication. It&amp;rsquo;s important to configure the correct external labels for all samples.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h3 id=&#34;timestamp-too-old-errors&#34;&gt;Timestamp-too-old errors&lt;/h3&gt;
&lt;p&gt;When a sample is older than what the GEM time-series database (TSDB) accepts, GEM returns a timestamp-too-old error. This limit is generally 1-2 hours back, depending on when the last block was cut. These bounds are relative to the timestamps sent and stored in the TSDB, rather than to the GEM server&amp;rsquo;s wall-clock. TSDBs are separate for each GEM tenant, and samples sent to one tenant don&amp;rsquo;t affect another.&lt;/p&gt;
&lt;p&gt;You can query the rate of timestamp-too-old errors, as shown:&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;promql&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-promql&#34;&gt;sum by (reason) (rate(cortex_discarded_samples_total{reason=&amp;#34;sample-timestamp-too-old&amp;#34;}[$__rate_interval]))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;One possible causes for the error is a client with a skewed wall-clock that is sending samples with a timestamp ahead of all other clients sending to the same tenant. You can check the wall-clock of clients against GEM&amp;rsquo;s wall-clock with the following query:&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;promql&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-promql&#34;&gt;abs(node_time_seconds - timestamp(node_time_seconds))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;verify-ingester-ring-status&#34;&gt;Verify ingester ring status&lt;/h3&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;In GEM versions 1.6 and earlier, don&amp;rsquo;t expose the ring page on the ingester microservice. Make sure to connect to a distributor, querier, or ruler instead.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;The following examples assume that you&amp;rsquo;re forwarding a GEM component with the ingester ring page using &lt;code&gt;kubectl port-forward&lt;/code&gt; and listening to the localhost port 8080.&lt;/p&gt;
&lt;p&gt;For a list of ring members, run this command:&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;$ curl -s -H &amp;#34;Accept: application/json&amp;#34; http://localhost:8080/ingester/ring | jq &amp;#39;.shards[] | del(.tokens)&amp;#39;
{
  &amp;#34;id&amp;#34;: &amp;#34;ingester-0&amp;#34;,
  &amp;#34;state&amp;#34;: &amp;#34;ACTIVE&amp;#34;,
  &amp;#34;address&amp;#34;: &amp;#34;127.0.0.1:9095&amp;#34;,
  &amp;#34;timestamp&amp;#34;: &amp;#34;2021-12-22 09:43:06 &amp;#43;0000 GMT&amp;#34;,
  &amp;#34;registered_timestamp&amp;#34;: &amp;#34;2021-12-22 09:39:36 &amp;#43;0000 GMT&amp;#34;,
  &amp;#34;zone&amp;#34;: &amp;#34;&amp;#34;
}
{
  &amp;#34;id&amp;#34;: &amp;#34;ingester-1&amp;#34;,
  &amp;#34;state&amp;#34;: &amp;#34;Unhealthy&amp;#34;,
  &amp;#34;address&amp;#34;: &amp;#34;127.0.0.1:9095&amp;#34;,
  &amp;#34;timestamp&amp;#34;: &amp;#34;2021-12-22 09:39:20 &amp;#43;0000 GMT&amp;#34;,
  &amp;#34;registered_timestamp&amp;#34;: &amp;#34;2021-12-22 09:33:44 &amp;#43;0000 GMT&amp;#34;,
  &amp;#34;zone&amp;#34;: &amp;#34;&amp;#34;
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To remove an unhealthy instance from the ring, run this command:&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 response code of the endpoint is 302, regardless of whether the request succeeds or fails. Monitor the logs for potential errors.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&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;$ curl -v -d forget=ingester-1 http://localhost:8080/ingester/ring
*   Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
&amp;gt; POST /ingester/ring HTTP/1.1
&amp;gt; Host: localhost:8080
&amp;gt; User-Agent: curl/7.79.1
&amp;gt; Accept: */*
&amp;gt; Content-Length: 19
&amp;gt; Content-Type: application/x-www-form-urlencoded
&amp;gt;
* Mark bundle as not supporting multiuse
&amp;lt; HTTP/1.1 302 Found
&amp;lt; Location: #
&amp;lt; Date: Wed, 22 Dec 2021 09:47:30 GMT
&amp;lt; Content-Length: 0
&amp;lt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;too-many-inflight-push-requests-errors&#34;&gt;Too-many-inflight-push-requests errors&lt;/h3&gt;
&lt;p&gt;A too-many-inflight-push-requests error can occur in both the distributor and the ingester.&lt;/p&gt;
&lt;p&gt;Run these queries to determine if there&amp;rsquo;s a single ingester or distributor causing the issue:&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;promql&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-promql&#34;&gt;sum(cortex_distributor_inflight_push_requests) by (namespace, cluster, pod)

sum(cortex_ingester_inflight_push_requests) by (namespace, cluster, pod)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;One possible cause of too many inflight push request on ingesters is throttled or underperforming disk I/O. This also manifests in increased TSDB commit durations, which you can check with this query:&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;promql&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-promql&#34;&gt;histogram_quantile(0.9, (sum(rate(cortex_ingester_tsdb_appender_commit_duration_seconds_bucket[5m])) by (namespace, cluster, le)))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;read-path&#34;&gt;Read path&lt;/h2&gt;
&lt;p&gt;Use the &lt;strong&gt;Reads&lt;/strong&gt; and &lt;strong&gt;Reads Resources&lt;/strong&gt; GEM system monitoring dashboards for insight into the performance of the read path.&lt;/p&gt;
&lt;p&gt;Read the &lt;strong&gt;Reads&lt;/strong&gt; dashboard from top to bottom. Each row represents a step in processing the read path.&lt;/p&gt;
&lt;p&gt;Read path latency is more variable than write path latency, as it depends on the kinds of queries you run. Increased latency can have a number of causes, including compute or disk resource starvation. Use the &lt;strong&gt;Reads Resources&lt;/strong&gt; dashboard to investigate the compute and disk resources in-use by each component of the cluster involved in the read path.&lt;/p&gt;
&lt;h2 id=&#34;compactor&#34;&gt;Compactor&lt;/h2&gt;
&lt;p&gt;Use the &lt;strong&gt;Compactor&lt;/strong&gt; and &lt;strong&gt;Compactor Resources&lt;/strong&gt; GEM system monitoring dashboards for insight into the performance of the compactor.&lt;/p&gt;
&lt;h3 id=&#34;compactions-failing&#34;&gt;Compactions failing&lt;/h3&gt;
&lt;p&gt;Use the following PromQL expression to determine which instances of the compactor haven&amp;rsquo;t completed a successful compaction in the last 24 hours:&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;promql&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-promql&#34;&gt;(time() - cortex_compactor_last_successful_run_timestamp_seconds &amp;gt; 60 * 60 * 24)
and
(cortex_compactor_last_successful_run_timestamp_seconds &amp;gt; 0)&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To investigate the cause of compaction failures, view the logs of the affected compactor instance.&lt;/p&gt;
&lt;h4 id=&#34;block-corruption&#34;&gt;Block corruption&lt;/h4&gt;
&lt;p&gt;Corrupted blocks can cause failed compactions. Use the following LogQL expression to identify logs that point to corrupted blocks:&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;&amp;lt;compactor label matchers&amp;gt; |= &amp;#34;level=error&amp;#34; |= &amp;#34;not healthy index found&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A full log line has an &lt;code&gt;err&lt;/code&gt; key that contains more information for resolving this error. You can use the compaction level to understand whether it&amp;rsquo;s safe to move the block away and allow the compactor to proceed. In a cluster with an ingester replication factor of three and a single &lt;code&gt;not healthy index error&lt;/code&gt;, it&amp;rsquo;s safe to move a block of &lt;code&gt;Compaction level 1&lt;/code&gt; out of the tenant&amp;rsquo;s bucket directory. No data loss occurs, as the replicated blocks still exist in object storage, as they haven&amp;rsquo;t yet been vertically compacted. 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;level=error ts=2020-07-12T17:35:05.516823471Z caller=compactor.go:339 component=compactor msg=&amp;#34;failed to compact user blocks&amp;#34; user=REDACTED-TENANT err=&amp;#34;compaction: group 0@6672437747845546250: block with not healthy index found /data/compact/0@6672437747845546250/REDACTED-BLOCK; Compaction level 1; Labels: map[__org_id__:REDACTED]: 1/1183085 series have an average of 1.000 out-of-order chunks: 0.000 of these are exact duplicates (in terms of data and time range)&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h5 id=&#34;move-a-corrupt-block-using-minio-client&#34;&gt;Move a corrupt block using &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;MinIO Client&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;To allow the compactor to resume the operation, move the corrupted block into the bucket using &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;MinIO Client&lt;/a&gt; or an alternative tool:&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;# setup the object store
mc alias set my-object-store https://&amp;lt;ENDPOINT&amp;gt; &amp;lt;ACCESS-KEY&amp;gt; &amp;lt;SECRET-ACCESS-KEY&amp;gt; [--insecure]

# move blocks so its ignored during compaction
mc mv --recursive my-object-store/&amp;lt;BUCKET&amp;gt;/&amp;lt;TENANT&amp;gt;/&amp;lt;BLOCK&amp;gt; my-object-store/&amp;lt;BUCKET&amp;gt;/&amp;lt;TENANT&amp;gt;/corrupted-&amp;lt;BLOCK&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BUCKET&lt;/code&gt; is the bucket name the compactor is using.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TENANT&lt;/code&gt; is the tenant ID reported in the example error message as &lt;code&gt;REDACTED-TENANT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BLOCK&lt;/code&gt; is the last part of the path reported as &lt;code&gt;REDACTED-BLOCK&lt;/code&gt; in the example error message.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ingester&#34;&gt;Ingester&lt;/h2&gt;
&lt;h3 id=&#34;restarts&#34;&gt;Restarts&lt;/h3&gt;
&lt;p&gt;Review the logs of the affected ingester to understand the reason for the restart. An ingester might restart due to being Out of Memory Killed (OOMkilled).&lt;/p&gt;
&lt;p&gt;In Kubernetes, you can confirm this reason with &lt;code&gt;kubectl&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;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 get pod ${POD} -o json | jq -r &amp;#39;.status.containerStatuses[] | { name, .lastState.terminated.reason }&amp;#39;
{
  &amp;#34;name&amp;#34;: &amp;#34;ingester&amp;#34;,
  &amp;#34;reason&amp;#34;: &amp;#34;OOMKilled&amp;#34;,
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On a Linux server, 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;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;$ grep oom /var/log/*&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If the ingester is OOMKilled, check for increased load. If there has been an increase in the number of active series, there might not be enough memory provisioned for each ingester. After an outage, lagging clients could send samples at a higher rate, which can temporarily increase the load on the system, including the ingesters.&lt;/p&gt;
&lt;h3 id=&#34;out-of-memory-errors-on-start-up&#34;&gt;Out-of-memory errors on start up&lt;/h3&gt;
&lt;p&gt;When a GEM ingester crashes, it must process its Write Ahead Log (WAL) on start up to recover any data that was in-memory and not yet written out to disk as TSDB blocks (to be later uploaded to object storage). Depending on the reason the ingester crashed, it could crash again due to running out of memory while trying to process the
WAL. If, after several attempts, an ingester isn&amp;rsquo;t able to finish processing its WAL, you can move or remove the data in the WAL. This requires access to the directory used by the ingester for the WAL.&lt;/p&gt;
&lt;p&gt;This example shows removing the WAL for the default tenant, &lt;code&gt;fake&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;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;rm -r /data/tsdb/fake/wal&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;rsquo;re using multiple tenants, attempt to remove the WAL for only the largest tenant first. 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;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;du -ms /data/tsdb/* | sort -n
840     /data/tsdb/__system__
10637   /data/tsdb/team-a
28425   /data/tsdb/team-b

rm -r /data/tsdb/team-b/wal&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;This could cause data loss for the tenant in question. We recommend running GEM with a replication factor of three, meaning that data on any one ingester exists on two other ingesters. However, if you need to remove the WAL of more than a single ingester, you could lose data. Even removing the WAL on a single ingester
increases the chance that a hardware failure affecting other ingesters causes data loss. Only do this as a last resort to make a GEM cluster stable.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;blocks&#34;&gt;Blocks&lt;/h2&gt;
&lt;h3 id=&#34;map-a-block-identifier-to-a-date-and-time-range&#34;&gt;Map a block identifier to a date and time range&lt;/h3&gt;
&lt;p&gt;Each block has a Universally Unique Lexicographically Sortable Identifier (ULID).
For additional metadata information about the block, refer to the &lt;code&gt;meta.json&lt;/code&gt; file inside the block directory.&lt;/p&gt;
&lt;p&gt;To determine the start and end timestamp from a block&amp;rsquo;s &lt;code&gt;meta.json&lt;/code&gt; file, run the following:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;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;$ jq &amp;#39;{ &amp;#34;start&amp;#34;: (.minTime / 1000 | todate), &amp;#34;end&amp;#34;: (.maxTime / 1000 | todate) }&amp;#39;  01FBBE5RQV8WT7D81NYYSPYHTH.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;caching&#34;&gt;Caching&lt;/h2&gt;
&lt;h3 id=&#34;memcache-connect-timeout-errors&#34;&gt;&amp;ldquo;memcache: connect timeout&amp;rdquo; errors&lt;/h3&gt;
&lt;p&gt;Latency when establishing a connection to a Memcached server, including any required DNS lookups, can result in a timeout error. GEM maintains a pool of connections to Memcached servers and reuses connections from that pool. While running, the expected rate of newly created connections from GEM is near zero.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re running the memcached_exporter, you can query the rate of new connections, as shown:&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;promql&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-promql&#34;&gt;rate(memcached_connections_total[$__rate_interval])&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This error is logged when a single GEM server attempts a large number of parallel connections. By default, the maximum number of concurrent connections is 100 and is governed by the &lt;code&gt;-*.memcached.max-get-multi-concurrency&lt;/code&gt; flags. The default connection pool is sixteen. If the maximum number of concurrent connections is established, eighty-four (100 - 16) connections are opened in parallel, which may exceed the connection timeout.&lt;/p&gt;
&lt;p&gt;To mitigate this error, tune the connection pool using the &lt;code&gt;-*.memcached.max-idle-connections&lt;/code&gt; flags.&lt;/p&gt;
]]></content><description>&lt;h1 id="troubleshoot-gem">Troubleshoot GEM&lt;/h1>
&lt;p>You might encounter these issues while operating a GEM cluster. Follow these steps to troubleshoot.&lt;/p>
&lt;h2 id="write-path">Write path&lt;/h2>
&lt;p>Use the &lt;strong>Writes&lt;/strong> and &lt;strong>Writes Resources&lt;/strong> GEM system monitoring dashboards for insight into the performance of the write path.&lt;/p></description></item><item><title>Glossary</title><link>https://grafana.com/docs/enterprise-metrics/v2.17.x/reference/glossary/</link><pubDate>Mon, 18 Aug 2025 18:19:44 +0000</pubDate><guid>https://grafana.com/docs/enterprise-metrics/v2.17.x/reference/glossary/</guid><content><![CDATA[&lt;h1 id=&#34;glossary&#34;&gt;Glossary&lt;/h1&gt;
&lt;p&gt;Commonly used terms and abbreviations within Grafana Enterprise Metrics documentation are as follows:&lt;/p&gt;
&lt;!-- prettier-ignore-start --&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Term&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;Access policy&lt;/td&gt;
              &lt;td&gt;An access policy is a resource that contains a granular set of permissions which specify what actions a request to GEM is allowed to do. In GEM, access policies are created with the desired set of permissions. Then API tokens can be generated that are associated with a particular access policy. You can also &lt;a href=&#34;/docs/enterprise-metrics/latest/manage/oauth/&#34;&gt;Configure GEM to integrate with an OAuth backend&lt;/a&gt; to externally generate tokens associated with a particular access policy.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;Cluster&lt;/td&gt;
              &lt;td&gt;A cluster is a licensed deployment of Grafana Metric Enterprise. Clusters are uniquely named and must have a corresponding license.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;Tenant&lt;/td&gt;
              &lt;td&gt;A tenant is scoped to a particular cluster. New samples can be written to a tenant and queries can be issued to a particular tenant. Each tenant will store its metrics in a separate set of &lt;a href=&#34;https://ganeshvernekar.com/blog/prometheus-tsdb-the-head-block/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;TSDB blocks&lt;/a&gt; that are stored in the configured storage bucket. The blocks themselves will be stored in the bucket with the name of the tenant as a prefix. This means once a tenant is created, its &lt;em&gt;name&lt;/em&gt; cannot be changed. However, the &lt;em&gt;display_name&lt;/em&gt; for a tenant can be changed.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;Token&lt;/td&gt;
              &lt;td&gt;A token is a randomly generated string that can be used as an API key when making requests to GEM.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;!-- prettier-ignore-end --&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;gem_terms_relationship.png&#34;
  alt=&#34;Relationship of GEM terminology&#34;/&gt;&lt;/p&gt;
]]></content><description>&lt;h1 id="glossary">Glossary&lt;/h1>
&lt;p>Commonly used terms and abbreviations within Grafana Enterprise Metrics documentation are as follows:&lt;/p>
&lt;!-- prettier-ignore-start -->
&lt;section class="expand-table-wrapper">&lt;div class="button-div">
&lt;button class="expand-table-btn">Expand table&lt;/button>
&lt;/div>&lt;div class="responsive-table-wrapper">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Term&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Access policy&lt;/td>
&lt;td>An access policy is a resource that contains a granular set of permissions which specify what actions a request to GEM is allowed to do. In GEM, access policies are created with the desired set of permissions. Then API tokens can be generated that are associated with a particular access policy. You can also &lt;a href="/docs/enterprise-metrics/latest/manage/oauth/">Configure GEM to integrate with an OAuth backend&lt;/a> to externally generate tokens associated with a particular access policy.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Cluster&lt;/td>
&lt;td>A cluster is a licensed deployment of Grafana Metric Enterprise. Clusters are uniquely named and must have a corresponding license.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tenant&lt;/td>
&lt;td>A tenant is scoped to a particular cluster. New samples can be written to a tenant and queries can be issued to a particular tenant. Each tenant will store its metrics in a separate set of &lt;a href="https://ganeshvernekar.com/blog/prometheus-tsdb-the-head-block/" target="_blank" rel="noopener noreferrer">TSDB blocks&lt;/a> that are stored in the configured storage bucket. The blocks themselves will be stored in the bucket with the name of the tenant as a prefix. This means once a tenant is created, its &lt;em>name&lt;/em> cannot be changed. However, the &lt;em>display_name&lt;/em> for a tenant can be changed.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Token&lt;/td>
&lt;td>A token is a randomly generated string that can be used as an API key when making requests to GEM.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/section>&lt;!-- prettier-ignore-end -->
&lt;p>&lt;img
class="lazyload d-inline-block"
data-src="gem_terms_relationship.png"
alt="Relationship of GEM terminology"/>&lt;/p></description></item><item><title>Grafana Mimir advanced architecture</title><link>https://grafana.com/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/</link><pubDate>Thu, 14 Aug 2025 18:42:07 +0000</pubDate><guid>https://grafana.com/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/</guid><content><![CDATA[&lt;!-- Note: This topic is mounted in the GEM documentation. Ensure that all updates are also applicable to GEM. --&gt;
&lt;h1 id=&#34;grafana-mimir-advanced-architecture&#34;&gt;Grafana Mimir advanced architecture&lt;/h1&gt;
&lt;p&gt;The following topics include in-depth overviews of the Grafana Mimir architecture.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/deployment-modes/&#34;&gt;Deployment modes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/components/&#34;&gt;Components&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/binary-index-header/&#34;&gt;Binary index-header&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/bucket-index/&#34;&gt;Bucket index&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/hash-ring/&#34;&gt;Hash rings&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/key-value-store/&#34;&gt;Key-value store&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/memberlist-and-the-gossip-protocol/&#34;&gt;Memberlist and gossip protocol&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/query-sharding/&#34;&gt;Query sharding&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/enterprise-metrics/v2.17.x/reference/mimir-arch/mimir-query-engine/&#34;&gt;Mimir query engine&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
]]></content><description>&lt;!-- Note: This topic is mounted in the GEM documentation. Ensure that all updates are also applicable to GEM. -->
&lt;h1 id="grafana-mimir-advanced-architecture">Grafana Mimir advanced architecture&lt;/h1>
&lt;p>The following topics include in-depth overviews of the Grafana Mimir architecture.&lt;/p></description></item></channel></rss>