<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Migrate on Grafana Labs</title><link>https://grafana.com/docs/loki/v3.7.x/setup/migrate/</link><description>Recent content in Migrate on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/loki/v3.7.x/setup/migrate/index.xml" rel="self" type="application/rss+xml"/><item><title>Migrate to Alloy</title><link>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-to-alloy/</link><pubDate>Thu, 09 Apr 2026 02:28:18 +0000</pubDate><guid>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-to-alloy/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-to-alloy&#34;&gt;Migrate to Alloy&lt;/h1&gt;
&lt;p&gt;Grafana Alloy is the new name for the Grafana Labs distribution of the OpenTelemetry collector. Grafana Agent Static, Grafana Agent Flow, and Grafana Agent Operator reached End-of-Life (EOL) on November 1, 2025. Grafana Labs has provided tools and migration documentation to assist you in migrating to Grafana Alloy.&lt;/p&gt;
&lt;p&gt;Read more about why we recommend migrating to &lt;a href=&#34;/blog/2024/04/09/grafana-alloy-opentelemetry-collector-with-prometheus-pipelines/&#34;&gt;Grafana Alloy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This section provides links to documentation for how to migrate to Alloy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/docs/alloy/latest/tasks/migrate/from-static/&#34;&gt;Migrate from Grafana Agent Static&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/docs/alloy/latest/tasks/migrate/from-flow/&#34;&gt;Migrate from Grafana Agent Flow&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/docs/alloy/latest/tasks/migrate/from-operator/&#34;&gt;Migrate from Grafana Agent Operator&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/docs/alloy/latest/tasks/migrate/from-otelcol/&#34;&gt;Migrate from OpenTelemetry Collector&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/docs/alloy/latest/tasks/migrate/from-prometheus/&#34;&gt;Migrate from Prometheus&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/docs/alloy/latest/tasks/migrate/from-promtail/&#34;&gt;Migrate from Promtail&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="migrate-to-alloy">Migrate to Alloy&lt;/h1>
&lt;p>Grafana Alloy is the new name for the Grafana Labs distribution of the OpenTelemetry collector. Grafana Agent Static, Grafana Agent Flow, and Grafana Agent Operator reached End-of-Life (EOL) on November 1, 2025. Grafana Labs has provided tools and migration documentation to assist you in migrating to Grafana Alloy.&lt;/p></description></item><item><title>Migrate from SSD to distributed</title><link>https://grafana.com/docs/loki/v3.7.x/setup/migrate/ssd-to-distributed/</link><pubDate>Thu, 09 Apr 2026 02:28:18 +0000</pubDate><guid>https://grafana.com/docs/loki/v3.7.x/setup/migrate/ssd-to-distributed/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-from-ssd-to-distributed&#34;&gt;Migrate from SSD to distributed&lt;/h1&gt;
&lt;p&gt;This guide provides instructions for migrating from a 
    &lt;a href=&#34;/docs/loki/v3.7.x/get-started/deployment-modes/#simple-scalable&#34;&gt;simple scalable deployment (SSD)&lt;/a&gt; to a 
    &lt;a href=&#34;/docs/loki/v3.7.x/get-started/deployment-modes/#microservices-mode&#34;&gt;distributed microservices deployment&lt;/a&gt; of Loki. Before starting the migration, make sure you have read the &lt;a href=&#34;#considerations&#34;&gt;considerations&lt;/a&gt; section.&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;Simple Scalable Deployment (SSD) mode is being deprecated. The timeline for the deprecation is to be determined (TBD), but will happen before Loki 4.0 is released. You should plan to migrate from SSD to distributed before Loki 4.0 releases.&lt;/p&gt;&lt;/blockquote&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;In this guide, an AWS deployment is used as an example. However, the migration process is mirrored for other cloud providers. This is due to the fact that no changes are required to the underlying data storage.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;considerations&#34;&gt;Considerations&lt;/h2&gt;
&lt;p&gt;Migrating from a simple scalable deployment to a distributed deployment with zero downtime is possible but requires careful planning. The following considerations should be taken into account:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Helm Deployment:&lt;/strong&gt; This guide assumes that you have deploying Loki using Helm. Other migration methods are possible but are not covered in this guide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Resources:&lt;/strong&gt; This migration method requires you to spin up distributed Loki pods before shutting down the SSD pods. This means that you need to have enough resources in your Kubernetes cluster to run both the SSD and distributed Loki pods at the same time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data:&lt;/strong&gt; No changes are required to your underlying data storage. Although data loss or corruption is unlikely, it is always recommended to back up your data before starting the migration process. If you are using a cloud provider you can take a snapshot/backup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration:&lt;/strong&gt; We do not account for all configuration parameters in this guide. We only cover the parameters that need to be changed. Other parameters can remain the same. &lt;strong&gt;However&lt;/strong&gt;, if &lt;code&gt;pattern_ingesters=true&lt;/code&gt; you will need to spin up &lt;code&gt;patternIngesters&lt;/code&gt; before shutting down the SSD ingesters. This is primarily needed for the Grafana Logs Drilldown feature.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zone Aware Ingesters:&lt;/strong&gt; This guide does not currently account for Zone Aware Ingesters. Our current recommendation is to either disable Zone Aware Ingesters or to consult the &lt;a href=&#34;/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-from-single-zone-with-helm/&#34;&gt;Mimir migration guide&lt;/a&gt;. Take note, not all parameters are equivalent between Mimir and Loki.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before starting the migration process, make sure you have the following prerequisites:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Access to your Kubernetes cluster via &lt;code&gt;kubectl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Helm installed.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;example-ssd-deployment&#34;&gt;Example SSD deployment&lt;/h2&gt;
&lt;p&gt;This example will use the following SSD deployment as a reference:&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;This example is only a reference on the parameters that need to be changed. There will be other parameters within your own config such as &lt;code&gt;limits_config&lt;/code&gt;, &lt;code&gt;gateway&lt;/code&gt;, &lt;code&gt;compactor&lt;/code&gt;, etc. These can remain the same.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;


&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;---
loki:
  schemaConfig:
    configs:
      - from: &amp;#34;2024-04-01&amp;#34;
        store: tsdb
        object_store: s3
        schema: v13
        index:
          prefix: loki_index_
          period: 24h
  storage_config:
    aws:
      region: eu-central-1
      bucketnames: aws-chunks-bucket
      s3forcepathstyle: false
  ingester:
    chunk_encoding: snappy
  ruler:
    enable_api: true
    storage:
      type: s3
      s3:
        region: eu-central-1
        bucketnames: aws-ruler-bucket
        s3forcepathstyle: false
      alertmanager_url: http://prom:9093
  querier:
    max_concurrent: 4

  storage:
    type: s3
    bucketNames:
      chunks: &amp;#34;aws-chunks-bucket&amp;#34;
      ruler: &amp;#34;aws-ruler-bucket&amp;#34;
    s3:
      region: eu-central-1

deploymentMode: SimpleScalable

# SSD
backend:
  replicas: 2
read:
  replicas: 3
write:
  replicas: 3

# Distributed Loki
ingester:
  replicas: 0
  zoneAwareReplication:
    enabled: false

querier:
  replicas: 0
  maxUnavailable: 0
queryFrontend:
  replicas: 0
  maxUnavailable: 0
queryScheduler:
  replicas: 0
distributor:
  replicas: 0
  maxUnavailable: 0
compactor:
  replicas: 0
indexGateway:
  replicas: 0
  maxUnavailable: 0
ruler:
  replicas: 0
  maxUnavailable: 0

# Single binary Loki
singleBinary:
  replicas: 0

minio:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;stage-1-deploying-the-loki-distributed-components&#34;&gt;Stage 1: Deploying the Loki distributed components&lt;/h2&gt;
&lt;p&gt;In this stage, we will deploy the distributed Loki components alongside the SSD components. We will also change the &lt;code&gt;deploymentMode&lt;/code&gt; to &lt;code&gt;SimpleScalable&amp;lt;-&amp;gt;Distributed&lt;/code&gt;. The &lt;code&gt;SimpleScalable&amp;lt;-&amp;gt;Distributed&lt;/code&gt; migration mode allows for a zero-downtime transition between Simple Scalable and fully distributed architectures. During migration, both deployment types run simultaneously, sharing the same object storage backend.&lt;/p&gt;
&lt;p&gt;The following table outlines which components take over the responsibilities of the SSD components:&lt;/p&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;Simple Scalable Components&lt;/th&gt;
              &lt;th&gt;Distributed Components&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;write (Deployment)&lt;/td&gt;
              &lt;td&gt;Distributor &#43; Ingester&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;read (StatefulSet)&lt;/td&gt;
              &lt;td&gt;Query Frontend &#43; Querier&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;backend (StatefulSet)&lt;/td&gt;
              &lt;td&gt;Compactor &#43; Ruler &#43; Index Gateway&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;How Loki handles request routing during the migration:&lt;/p&gt;
&lt;p&gt;The Gateway (nginx) handles request routing based on endpoint type:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write Path (&lt;code&gt;loki/api/v1/push&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;Initially routes to Simple Scalable write component&lt;/li&gt;
&lt;li&gt;Gradually shifted to the Distributor&lt;/li&gt;
&lt;li&gt;Both write paths share the same object storage, ensuring data consistency&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Read Path (&lt;code&gt;/loki/api/v1/query&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;Routes to either Simple Scalable read or distributed Query Frontend&lt;/li&gt;
&lt;li&gt;Query results are consistent since both architectures read from same storage&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Admin/Background Operations:
&lt;ul&gt;
&lt;li&gt;Compaction, retention, and rule evaluation handled by either backend or respective distributed components&lt;/li&gt;
&lt;li&gt;Operations are coordinated through object storage locks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To start the migration process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a copy of your existing &lt;code&gt;values.yaml&lt;/code&gt; file and name it &lt;code&gt;values-migration.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cp values.yaml values-migration.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next modify the following parameters; &lt;code&gt;deploymentMode&lt;/code&gt;, &lt;code&gt;ingester&lt;/code&gt; and components based on the annotations below.&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;---
loki:
  schemaConfig:
    configs:
      - from: &amp;#34;2024-04-01&amp;#34;
        store: tsdb
        object_store: s3
        schema: v13
        index:
          prefix: loki_index_
          period: 24h
  storage_config:
    aws:
      region: eu-central-1
      bucketnames: aws-chunks-bucket
      s3forcepathstyle: false
  ingester:
    chunk_encoding: snappy
    # Add this to ingester; this will force ingesters to flush before shutting down
    wal:
      flush_on_shutdown: true
  ruler:
    enable_api: true
    storage:
      type: s3
      s3:
        region: eu-central-1
        bucketnames: aws-ruler-bucket
        s3forcepathstyle: false
      alertmanager_url: http://prom:9093
  querier:
    max_concurrent: 4

  storage:
    type: s3
    bucketNames:
      chunks: &amp;#34;aws-chunks-bucket&amp;#34;
      ruler: &amp;#34;aws-ruler-bucket&amp;#34;
    s3:
      region: eu-central-1

# Important: Make sure to change this to SimpleScalable&amp;lt;-&amp;gt;Distributed
deploymentMode: SimpleScalable&amp;lt;-&amp;gt;Distributed

# SSD
backend:
  replicas: 2
read:
  replicas: 3
write:
  replicas: 3

# Distributed Loki
# Spin up the distributed components
ingester:
  replicas: 3
  zoneAwareReplication:
    enabled: false
querier:
  replicas: 3
  maxUnavailable: 0
queryFrontend:
  replicas: 2
  maxUnavailable: 0
queryScheduler:
  replicas: 2
distributor:
  replicas: 2
  maxUnavailable: 0
compactor:
  replicas: 1
indexGateway:
  replicas: 2
  maxUnavailable: 0
ruler:
  replicas: 1
  maxUnavailable: 0

# Single binary Loki
singleBinary:
  replicas: 0

minio:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is a breakdown of the changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ingester.wal.flush_on_shutdown: true&lt;/code&gt;: This will force the ingesters to flush before shutting down. This is important to prevent data loss.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deploymentMode: SimpleScalable&amp;lt;-&amp;gt;Distributed&lt;/code&gt;: This will allow for the SSD and distributed components to run simultaneously.&lt;/li&gt;
&lt;li&gt;Spin up all distributed components with the desired replicas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the distributed components using the following command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm upgrade --values values-migration.yaml loki grafana/loki -n loki &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;It is important to allow all components to fully spin up before proceeding to the next stage. You can check the status of the components using the following command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get pods -n loki&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Let all components reach the &lt;code&gt;Running&lt;/code&gt; state before proceeding to the next stage.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;stage-2-transitioning-to-distributed-components&#34;&gt;Stage 2: Transitioning to distributed components&lt;/h2&gt;
&lt;p&gt;The final stage of the migration involves transitioning all traffic to the distributed components. This is done by scaling down the SSD components and swapping the &lt;code&gt;deploymentMode&lt;/code&gt; to &lt;code&gt;Distributed&lt;/code&gt;. To do this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a copy of &lt;code&gt;values-migration.yaml&lt;/code&gt; and name it &lt;code&gt;values-distributed.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;cp values-migration.yaml values-distributed.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next modify the following parameters; &lt;code&gt;deploymentMode&lt;/code&gt; and components based on the annotations below.&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;---
loki:
  schemaConfig:
    configs:
      - from: &amp;#34;2024-04-01&amp;#34;
        store: tsdb
        object_store: s3
        schema: v13
        index:
          prefix: loki_index_
          period: 24h
  storage_config:
    aws:
      region: eu-central-1
      bucketnames: aws-chunks-bucket
      s3forcepathstyle: false
  ingester:
    chunk_encoding: snappy
    wal:
      flush_on_shutdown: true
  ruler:
    enable_api: true
    storage:
      type: s3
      s3:
        region: eu-central-1
        bucketnames: aws-ruler-bucket
        s3forcepathstyle: false
      alertmanager_url: http://prom:9093
  querier:
    max_concurrent: 4

  storage:
    type: s3
    bucketNames:
      chunks: &amp;#34;aws-chunks-bucket&amp;#34;
      ruler: &amp;#34;aws-ruler-bucket&amp;#34;
    s3:
      region: eu-central-1

# Important: Make sure to change this to Distributed
deploymentMode: Distributed

# SSD
# Scale down the SSD components
backend:
  replicas: 0
read:
  replicas: 0
write:
  replicas: 0

# Distributed Loki
ingester:
  replicas: 3
  zoneAwareReplication:
    enabled: false
querier:
  replicas: 3
  maxUnavailable: 0
queryFrontend:
  replicas: 2
  maxUnavailable: 0
queryScheduler:
  replicas: 2
distributor:
  replicas: 2
  maxUnavailable: 0
compactor:
  replicas: 1
indexGateway:
  replicas: 2
  maxUnavailable: 0
ruler:
  replicas: 1
  maxUnavailable: 0

# Single binary Loki
singleBinary:
  replicas: 0

minio:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is a breakdown of the changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deploymentMode: Distributed&lt;/code&gt;: This will allow for the distributed components to run in isolation.&lt;/li&gt;
&lt;li&gt;Scale down all SSD components to &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deploy the final configuration using the following command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm upgrade --values values-distributed.yaml loki grafana/loki -n loki &lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the deployment is complete, you can verify that all components are running using the following command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get pods -n loki&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should see all distributed components running and the SSD compontents have now been removed.&lt;/p&gt;
&lt;h2 id=&#34;whats-next&#34;&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;Loki in distributed mode is inherently more complex than SSD mode. It is recommended to meta-monitor your Loki deployment to ensure that everything is running smoothly. You can do this by following the 
    &lt;a href=&#34;/docs/loki/v3.7.x/operations/meta-monitoring/&#34;&gt;meta-monitoring guide&lt;/a&gt;.&lt;/p&gt;
]]></content><description>&lt;h1 id="migrate-from-ssd-to-distributed">Migrate from SSD to distributed&lt;/h1>
&lt;p>This guide provides instructions for migrating from a
&lt;a href="/docs/loki/v3.7.x/get-started/deployment-modes/#simple-scalable">simple scalable deployment (SSD)&lt;/a> to a
&lt;a href="/docs/loki/v3.7.x/get-started/deployment-modes/#microservices-mode">distributed microservices deployment&lt;/a> of Loki. Before starting the migration, make sure you have read the &lt;a href="#considerations">considerations&lt;/a> section.&lt;/p></description></item><item><title>Migrate to TSDB</title><link>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-to-tsdb/</link><pubDate>Thu, 09 Apr 2026 02:28:18 +0000</pubDate><guid>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-to-tsdb/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-to-tsdb&#34;&gt;Migrate to TSDB&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;../../../operations/storage/tsdb/&#34;&gt;TSDB&lt;/a&gt; is the recommended index type for Loki and is where the current development lies.
If you are running Loki with &lt;a href=&#34;../../../operations/storage/boltdb-shipper/&#34;&gt;boltb-shipper&lt;/a&gt; or any of the 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/storage/#index-storage&#34;&gt;legacy index types&lt;/a&gt; that have been deprecated,
we strongly recommend migrating to TSDB.&lt;/p&gt;
&lt;h3 id=&#34;configure-tsdb-index-for-an-upcoming-period&#34;&gt;Configure TSDB index for an upcoming period&lt;/h3&gt;
&lt;p&gt;To begin the migration, add a new 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#period_config&#34;&gt;period_config&lt;/a&gt; entry in your 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#schema_config&#34;&gt;schema_config&lt;/a&gt;.
You can read more about schema config 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/storage/#schema-config&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;You must roll out the new &lt;code&gt;period_config&lt;/code&gt; change to all Loki components in order for it to take effect.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;This example adds a new &lt;code&gt;period_config&lt;/code&gt; which configures Loki to start using the TSDB index for the data ingested starting from &lt;code&gt;2023-10-20&lt;/code&gt;.&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;schema_config:
  configs:
    - from: 2023-01-01
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h
    - from: 2023-10-20 ①
      store: tsdb ②
      object_store: filesystem ③
      schema: v13 ④
      index:
        prefix: index_
        period: 24h&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You must set the new period &lt;code&gt;from&lt;/code&gt; to a date in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the new period to use TSDB as the index type by setting &lt;code&gt;store: tsdb&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This sample configuration uses filesystem as the storage in both the periods. If you want to use a different storage for the TSDB index and chunks, you can specify a different &lt;code&gt;object_store&lt;/code&gt; in the new period.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the schema to v13 which is the recommended version at the time of writing. Please refer to the 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#period_config&#34;&gt;configure page&lt;/a&gt; for the current recommended version.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;configure-tsdb-shipper&#34;&gt;Configure TSDB shipper&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s also important that you configure the &lt;code&gt;tsdb_shipper&lt;/code&gt; block in 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#storage_config&#34;&gt;storage_config&lt;/a&gt;. Specifically the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;active_index_directory&lt;/code&gt;: directory where ingesters would write index files which will then be uploaded by shipper to configured storage.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cache_location&lt;/code&gt;: cache location for downloading index files from the storage for use in query path.&lt;/li&gt;
&lt;/ul&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;storage_config:
  tsdb_shipper:
    active_index_directory: /data/tsdb-index
    cache_location: /data/tsdb-cache&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;run-compactor&#34;&gt;Run compactor&lt;/h3&gt;
&lt;p&gt;We strongly recommended running the &lt;a href=&#34;../../../operations/storage/retention/#compactor&#34;&gt;compactor&lt;/a&gt; when using TSDB index. It is responsible for running compaction and retention on TSDB index.
Not running index compaction will result in sub-optimal query performance.&lt;/p&gt;
&lt;p&gt;Please refer to the &lt;a href=&#34;../../../operations/storage/retention/#compactor&#34;&gt;compactor section&lt;/a&gt; for more information and configuration examples.&lt;/p&gt;
]]></content><description>&lt;h1 id="migrate-to-tsdb">Migrate to TSDB&lt;/h1>
&lt;p>&lt;a href="../../../operations/storage/tsdb/">TSDB&lt;/a> is the recommended index type for Loki and is where the current development lies.
If you are running Loki with &lt;a href="../../../operations/storage/boltdb-shipper/">boltb-shipper&lt;/a> or any of the
&lt;a href="/docs/loki/v3.7.x/configure/storage/#index-storage">legacy index types&lt;/a> that have been deprecated,
we strongly recommend migrating to TSDB.&lt;/p></description></item><item><title>Migrate from `loki-distributed` Helm chart</title><link>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-from-distributed/</link><pubDate>Thu, 09 Apr 2026 02:28:18 +0000</pubDate><guid>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-from-distributed/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-from-loki-distributed-helm-chart&#34;&gt;Migrate from &lt;code&gt;loki-distributed&lt;/code&gt; Helm chart&lt;/h1&gt;
&lt;p&gt;This guide will walk you through migrating to the &lt;code&gt;loki&lt;/code&gt; Helm Chart, v3.0 or higher, from the &lt;code&gt;loki-distributed&lt;/code&gt; Helm Chart (v0.63.2 at time of writing). The process consists of deploying the new &lt;code&gt;loki&lt;/code&gt; Helm Chart alongside the existing &lt;code&gt;loki-distributed&lt;/code&gt; installation. By joining the new cluster to the existing cluster&amp;rsquo;s ring, you will create one large cluster. This will allow you to manually bring down the &lt;code&gt;loki-distributed&lt;/code&gt; components in a safe way to avoid any data loss.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before you begin:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We recommend having a Grafana instance available to monitor both the existing and new clusters, to make sure there is no data loss during the migration process. The &lt;code&gt;loki&lt;/code&gt; chart ships with self-monitoring features, including dashboards. These are useful for monitoring the health of the new cluster as it spins up.&lt;/p&gt;
&lt;p&gt;Start by updating your existing Grafana Agent or Promtail config (whatever is scraping logs from your environment) to &lt;em&gt;exclude&lt;/em&gt; the new deployment. The new &lt;code&gt;loki&lt;/code&gt; chart ships with its own self-monitoring mechanisms, and we want to make sure it&amp;rsquo;s not scraped twice, which would produce duplicate logs. The best way to do this is via a relabel config that will drop logs from the new deployment, for example something like:&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;- source_labels:
    - &amp;#34;__meta_kubernetes_pod_label_app_kubernetes_io_component&amp;#34;
  regex: &amp;#34;(canary|read|write)&amp;#34;
  action: &amp;#34;drop&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This leverages the fact that the new deployment adds a &lt;code&gt;app.kubernetes.io/component&lt;/code&gt; label of either &lt;code&gt;read&lt;/code&gt; for the Read pods, &lt;code&gt;write&lt;/code&gt; for the Write pods, and &lt;code&gt;canary&lt;/code&gt; for the Loki Canary pods. These annotations are not present in the &lt;code&gt;loki-distributed&lt;/code&gt; deployment, so this should only match logs from the new deployment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To Migrate from &lt;code&gt;loki-distributed&lt;/code&gt; to &lt;code&gt;loki&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Deploy new Loki Cluster&lt;/p&gt;
&lt;p&gt;Next you will deploy the new &lt;code&gt;loki&lt;/code&gt; chart in the same namespace as your existing &lt;code&gt;loki-distributed&lt;/code&gt; installation. Make sure to use the same buckets and storage configuration as your existing installation. You will need to set some special &lt;code&gt;migrate&lt;/code&gt; values as well:&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;migrate:
  fromDistributed:
    enabled: true
    memberlistService: loki-loki-distributed-memberlist&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The value of &lt;code&gt;memberlistService&lt;/code&gt; must be the kubernetes service created for the purpose of Memberlist DNS in the &lt;code&gt;loki-distributed&lt;/code&gt; deployment. It should match the value of &lt;code&gt;memberlist.join_members&lt;/code&gt; in the config of the &lt;code&gt;loki-distributed&lt;/code&gt; deployment. This is what will make the new cluster join the existing clusters ring. It is important to join all existing rings, if you are using different memberlist DNS for different rings, you must manually set the value of each applicable &lt;code&gt;join_members&lt;/code&gt; configuration for each ring. If using the same memberlist DNS for all rings, as is the default in the &lt;code&gt;loki-distributed&lt;/code&gt; chart, setting &lt;code&gt;migrate.memberlistService&lt;/code&gt; should be enough.&lt;/p&gt;
&lt;p&gt;Once the new cluster is up, add the appropriate data source in Grafana for the new cluster. Check that the following queries return results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Confirm new and old logs are in the new deployment. Using the new deployment&amp;rsquo;s Loki data source in Grafana, look for:
&lt;ul&gt;
&lt;li&gt;Logs with a job that is unique to your existing Promtail or Grafana Agent, the one we adjusted above to exclude logs from the new deployment which is not yet pushing logs to the new deployment. If you can query those via the new deployment in shows we have not lost historical logs.&lt;/li&gt;
&lt;li&gt;Logs with the label &lt;code&gt;job=&amp;quot;loki/loki-read&amp;quot;&lt;/code&gt;. The read component does not exist in &lt;code&gt;loki-distributed&lt;/code&gt;, so this show the new Loki cluster&amp;rsquo;s self monitoring is working correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Confirm new logs are in the old deployment. Using the old deployment&amp;rsquo;s Loki data source in Grafana, look for:
&lt;ul&gt;
&lt;li&gt;Logs with the label &lt;code&gt;job=&amp;quot;loki/loki-read&amp;quot;&lt;/code&gt;. Since you have excluded logs from the new deployment from going to the &lt;code&gt;loki-distributed&lt;/code&gt; deployment, if you can query them through the &lt;code&gt;loki-distributed&lt;/code&gt; Loki data source that show the ingesters have joined the same ring, and are queryable from the &lt;code&gt;loki-distributed&lt;/code&gt; queriers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert all Clients to Push Logs to New &lt;code&gt;loki&lt;/code&gt; Deployment&lt;/p&gt;
&lt;p&gt;Assuming everything is working as expected, you can now modify the &lt;code&gt;clients&lt;/code&gt; section of your Grafana Agent or Promtail configuration to push logs to the new deployment. After this change is made, the &lt;code&gt;loki-distributed&lt;/code&gt; cluster will no longer recieve new logs and can be carefully scaled down.&lt;/p&gt;
&lt;p&gt;Once this has deployed, query the new &lt;code&gt;loki&lt;/code&gt; cluster&amp;rsquo;s Loki data source for new logs to make sure they&amp;rsquo;re still being ingested.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tear Down the Old Loki Canary&lt;/p&gt;
&lt;p&gt;If you had previously deployed the canary via the &lt;code&gt;loki-canary&lt;/code&gt; Helm Chart, you can now tear it down. The new chart ships the canary by default and is automatically configured to scrape it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update Flush Config On &lt;code&gt;loki-distributed&lt;/code&gt; Deployment&lt;/p&gt;
&lt;p&gt;You are almost ready to start scaling down the old &lt;code&gt;loki-distributed&lt;/code&gt; cluster. Before you start, however, it is important to make sure the &lt;code&gt;loki-distributed&lt;/code&gt; ingesters are configured to flush on shutdown. Since these ingesters will not be coming back, there will be no opportunity for them to replay their WALs, so they need to flush all in-memory logs before shutting down to prevent data loss.&lt;/p&gt;
&lt;p&gt;The easiest way to do this is via the &lt;code&gt;extraArgs&lt;/code&gt; argument in the &lt;code&gt;ingester&lt;/code&gt; section of the &lt;code&gt;loki-distributed&lt;/code&gt; chart. You may also want to set the ingester&amp;rsquo;s log level to &lt;code&gt;debug&lt;/code&gt; to see messages about the flushing process.&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;ingester:
  replicas: 3
  extraArgs:
    - &amp;#39;-ingester.flush-on-shutdown=true&amp;#39;
    - &amp;#39;-log.level=debug&amp;#39;
    ```

Deploy this change, and make sure all ingesters restart and are running the latest configuration.&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scale Down Ingesters One at a Time&lt;/p&gt;
&lt;p&gt;It is now time to start scaling down &lt;code&gt;loki-distributed&lt;/code&gt;. Scale down the ingester StatefulSet or Deployment (depending on how your &lt;code&gt;loki-distributed&lt;/code&gt; chart is deployed) 1 replica at a time. If &lt;code&gt;debug&lt;/code&gt; logs were enabled, you can monitor the logs of each ingester as it&amp;rsquo;s terminating to make sure the flushing process was successful. Once the ingester pod is fully terminated, continue decrementing by another 1 replica. Continue until there are 0 instances of the ingester running.&lt;/p&gt;
&lt;p&gt;You can use the following command to edit the ingester StatefulSet in order to change the number of replicas (making sure to replace &lt;em&gt;&amp;lt;NAMESPACE&amp;gt;&lt;/em&gt; with the correct namespace):&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 -n &amp;lt;NAMESPACE&amp;gt; edit statefulsets.apps loki-distributed-ingester&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove &lt;code&gt;loki-distributed&lt;/code&gt; cluster&lt;/p&gt;
&lt;p&gt;Double check that logs are still coming in to the new cluster. If something is wrong, it will be much easier to quickly scale back up &lt;code&gt;loki-distributed&lt;/code&gt; ingesters before tearing down the whole cluster so you can investigate. If everything looks good, you can tear down &lt;code&gt;loki-distributed&lt;/code&gt; using &lt;code&gt;helm uninstall&lt;/code&gt;. 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;helm uninstall -n loki loki-distributed&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now edit the new &lt;code&gt;loki&lt;/code&gt; cluster to remove the &lt;code&gt;migrate&lt;/code&gt; options you added when first installing. Remove all of the following from your &lt;code&gt;values.yaml&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;migrate:
  fromDistributed:
    enabled: true
    memberlistService: loki-loki-distributed-memberlist&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To apply the new configuration (assuming you installed the new chart as &lt;code&gt;loki&lt;/code&gt; in the &lt;em&gt;loki&lt;/em&gt; namespace):&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 -n loki loki grafana/loki --values values.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;migrate.fromDistributed.memberlistService&lt;/code&gt; was added as an &lt;em&gt;additional&lt;/em&gt; memberlist join member, so once this new config is pushed, the components should roll without interruption.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the Dashboards&lt;/p&gt;
&lt;p&gt;Now that the migration is finished, you can check the dashboards included with the new &lt;code&gt;loki&lt;/code&gt; chart to make sure everything is working as expected. You can also check the loki canary metrics to make sure nothing was lost during the migration. Assuming everything was in the &lt;code&gt;loki&lt;/code&gt; namespace, the following query, if run over a time period that starts before the migration, and ends after it was complete, should clearly illustrate when metrics started coming from the new canary, and if and when there was data detected by either during the process:&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;logql&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-logql&#34;&gt;(
  sum(increase(loki_canary_missing_entries_total{namespace=&amp;#34;loki&amp;#34;}[$__range])) by (job)
  /
  sum(increase(loki_canary_entries_total{namespace=&amp;#34;loki&amp;#34;}[$__range])) by (job)
)*100&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="migrate-from-loki-distributed-helm-chart">Migrate from &lt;code>loki-distributed&lt;/code> Helm chart&lt;/h1>
&lt;p>This guide will walk you through migrating to the &lt;code>loki&lt;/code> Helm Chart, v3.0 or higher, from the &lt;code>loki-distributed&lt;/code> Helm Chart (v0.63.2 at time of writing). The process consists of deploying the new &lt;code>loki&lt;/code> Helm Chart alongside the existing &lt;code>loki-distributed&lt;/code> installation. By joining the new cluster to the existing cluster&amp;rsquo;s ring, you will create one large cluster. This will allow you to manually bring down the &lt;code>loki-distributed&lt;/code> components in a safe way to avoid any data loss.&lt;/p></description></item><item><title>Migrate to three scalable targets</title><link>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-to-three-scalable-targets/</link><pubDate>Thu, 09 Apr 2026 02:28:18 +0000</pubDate><guid>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-to-three-scalable-targets/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-to-three-scalable-targets&#34;&gt;Migrate to three scalable targets&lt;/h1&gt;
&lt;p&gt;This guide will walk you through migrating from the old, two target, scalable configuration to the new, three target, scalable configuration. This new configuration introduces a &lt;code&gt;backend&lt;/code&gt; component, and reduces the &lt;code&gt;read&lt;/code&gt; component to running just a &lt;code&gt;Querier&lt;/code&gt; and &lt;code&gt;QueryFrontend&lt;/code&gt;, allowing it to be run as a kubernetes &lt;code&gt;Deployment&lt;/code&gt; rather than a &lt;code&gt;StatefulSet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before you begin:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We recommend having a Grafana instance available to monitor both the existing and new clusters, to make sure there is no data loss during the migration process. The &lt;code&gt;loki&lt;/code&gt; chart ships with self-monitoring features, including dashboards. These are useful for monitoring the health of the cluster during migration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To Migrate from a &amp;ldquo;read and write&amp;rdquo; to a &amp;ldquo;backend, read and write&amp;rdquo; deployment&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make sure your deployment is using a new enough version of Loki&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This feature landed as an option in the helm chart while still in the &lt;code&gt;main&lt;/code&gt; branch of Loki. As a result, depending on when you run this migration, you may neeed to manually override the Loki or GEL image being used to one that has the third, &lt;code&gt;backend&lt;/code&gt; target available. For Loki, add the following to your &lt;code&gt;values.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;loki:
  image:
    repository: &amp;#34;grafana/loki&amp;#34;
    tag: &amp;#34;main-f5fbfab-amd64&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For GEL, you&amp;rsquo;ll need to add:&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;enterprise:
  image:
    repository: &amp;#34;grafana/enterprise-logs&amp;#34;
    tag: &amp;#34;main-96f32b9f&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Set the &lt;code&gt;legacyReadTarget&lt;/code&gt; flag to false&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Set the value &lt;code&gt;read.legacyReadTarget&lt;/code&gt; to false. In your &lt;code&gt;values.yaml&lt;/code&gt;, add:&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;read:
  legacyReadTarget: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Upgrade the helm installation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Run &lt;code&gt;helm upgrade&lt;/code&gt; on your installation with your updated &lt;code&gt;values.yaml&lt;/code&gt; file.&lt;/p&gt;
]]></content><description>&lt;h1 id="migrate-to-three-scalable-targets">Migrate to three scalable targets&lt;/h1>
&lt;p>This guide will walk you through migrating from the old, two target, scalable configuration to the new, three target, scalable configuration. This new configuration introduces a &lt;code>backend&lt;/code> component, and reduces the &lt;code>read&lt;/code> component to running just a &lt;code>Querier&lt;/code> and &lt;code>QueryFrontend&lt;/code>, allowing it to be run as a kubernetes &lt;code>Deployment&lt;/code> rather than a &lt;code>StatefulSet&lt;/code>.&lt;/p></description></item><item><title>Migrate to Thanos storage clients</title><link>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-storage-clients/</link><pubDate>Thu, 09 Apr 2026 02:28:18 +0000</pubDate><guid>https://grafana.com/docs/loki/v3.7.x/setup/migrate/migrate-storage-clients/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-to-thanos-storage-clients&#34;&gt;Migrate to Thanos storage clients&lt;/h1&gt;
&lt;p&gt;Loki release 3.4 introduces new object storage clients based on the &lt;a href=&#34;https://github.com/thanos-io/objstore&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Thanos Object Storage Client Go module&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the reasons for making this change is to have a consistent storage configuration across Grafana Loki, Mimir and other telemetry databases from Grafana Labs. If you are already using Grafana Mimir or Pyroscope, you can reuse the storage configuration for setting up Loki.&lt;/p&gt;
&lt;p&gt;This is an opt-in feature with the Loki 3.4 release. In a future release, Thanos will become the default way of configuring storage and the existing storage clients will be deprecated.&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 new storage configuration deviates from the existing format. The following sections describe the changes in detail for each provider.
Refer to the 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#thanos_object_store_config&#34;&gt;Thanos storage configuration reference&lt;/a&gt; to view the complete list of supported storage providers and their configuration options.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h3 id=&#34;enable-the-new-storage-clients&#34;&gt;Enable the new storage clients&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Enable Thanos storage clients by setting &lt;code&gt;use_thanos_objstore&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in the &lt;code&gt;storage_config&lt;/code&gt; section or by setting the &lt;code&gt;-use-thanos-objstore&lt;/code&gt; flag to true. When enabled, configuration under &lt;code&gt;storage_config.object_store&lt;/code&gt; takes effect instead of existing storage configurations.&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;# Uses the new storage clients for connecting to gcs backend
storage_config:
  use_thanos_objstore: true # enable the new storage clients
  object_store:
    gcs:
      bucket_name: &amp;#34;example-bucket&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As an alternative, you can also configure the new clients in the common &lt;code&gt;storage&lt;/code&gt; section if you prefer to use the &lt;code&gt;common&lt;/code&gt; config 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;storage_config:
   use_thanos_objstore: true # enable the new storage clients
common:
  storage:
    object_store:
      gcs:
        bucket_name: &amp;#34;example-bucket&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ruler storage should be configured under the &lt;code&gt;ruler_storage&lt;/code&gt; section when using the new storage clients.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage_config:
   use_thanos_objstore: true # enable the new storage clients
ruler_storage:
   backend: gcs
   gcs:
      bucket_name: &amp;#34;example-bucket&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are using &lt;code&gt;store.object-prefix&lt;/code&gt; flag or the corresponding &lt;code&gt;object_prefix&lt;/code&gt; YAML setting, you&amp;rsquo;ll need to update your configuration to use the new &lt;code&gt;object_store.storage-prefix&lt;/code&gt; flag or the corresponding &lt;code&gt;storage_prefix&lt;/code&gt; YAML setting.&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;# Example configuration to prefix all objects with &amp;#34;prefix&amp;#34;
storage_config:
   use_thanos_objstore: true # enable the new storage clients
   object_store:
      storage_prefix: &amp;#34;prefix&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;gcs-storage-migration&#34;&gt;GCS Storage Migration&lt;/h3&gt;
&lt;p&gt;When migrating from the existing 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#gcs_storage_config&#34;&gt;Google Cloud Storage (GCS)&lt;/a&gt; storage client to the new Thanos-based client, you&amp;rsquo;ll need to update your configuration parameters as follows:&lt;/p&gt;
&lt;div class=&#34;responsive-table-wrapper&#34;&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;Existing Parameter&lt;/th&gt;
              &lt;th&gt;New Parameter&lt;/th&gt;
              &lt;th&gt;Required Changes&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;bucket_name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;bucket_name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;service_account&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;service_account&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;chunk_buffer_size&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;chunk_buffer_size&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;enable_retries&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;max_retries&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Replace &lt;code&gt;enable_retries&lt;/code&gt; (bool) with &lt;code&gt;max_retries&lt;/code&gt; (int). Set a value &amp;gt; 1 to enable retries, or 1 to disable&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;request_timeout&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed&lt;/td&gt;
              &lt;td&gt;Remove parameter&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;enable_opencensus&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed&lt;/td&gt;
              &lt;td&gt;Remove parameter&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;enable_http2&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed&lt;/td&gt;
              &lt;td&gt;Remove parameter&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example configuration migration (GCS):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Existing configuration:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage_config:
  gcs:
    bucket_name: example-bucket
    chunk_buffer_size: 10MB
    enable_retries: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;New configuration&lt;/strong&gt;&lt;/em&gt; (Thanos-based):&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage_config:
  use_thanos_objstore: true
  object_store:
    gcs:
      bucket_name: example-bucket
      chunk_buffer_size: 10MB
      max_retries: 5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;amazon-s3-storage-migration&#34;&gt;Amazon S3 Storage Migration&lt;/h3&gt;
&lt;p&gt;When migrating from the existing 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#aws_storage_config&#34;&gt;Amazon S3&lt;/a&gt; storage client to the new Thanos-based client, update or remove parameters as follows:&lt;/p&gt;
&lt;div class=&#34;responsive-table-wrapper&#34;&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;Existing Parameter&lt;/th&gt;
              &lt;th&gt;New Parameter&lt;/th&gt;
              &lt;th&gt;Required Changes&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;bucket_names&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;bucket_name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Rename this parameter. If you previously used multiple buckets, you must consolidate to a single bucket (Thanos supports only one).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;endpoint&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;endpoint&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;region&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;region&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;access_key_id&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;access_key_id&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;secret_access_key&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;secret_access_key&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;session_token&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;session_token&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;insecure&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;insecure&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;disable_dualstack&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;dualstack_enabled&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Renamed and inverted. If you had &lt;code&gt;disable_dualstack: false&lt;/code&gt;, set &lt;code&gt;dualstack_enabled: true&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;storage_class&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;storage_class&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;s3&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed&lt;/td&gt;
              &lt;td&gt;Remove or replace with &lt;code&gt;endpoint&lt;/code&gt; if you used the URL-based setup.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;S3ForcePathStyle&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed or replaced&lt;/td&gt;
              &lt;td&gt;If you need path-based addressing, set &lt;code&gt;bucket_lookup_type: path&lt;/code&gt; in the new config. Otherwise, remove it.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;signature_version&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Removed&lt;/td&gt;
              &lt;td&gt;Remove parameter. Thanos always uses Signature Version 4 (V4).&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;http_config&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Move subfields (such as timeouts, CA file, etc.) into the &lt;code&gt;http:&lt;/code&gt; block in the Thanos configuration.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;sse&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;sse&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Migrate any SSE settings (e.g., &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;kms_key_id&lt;/code&gt;) into the &lt;code&gt;sse:&lt;/code&gt; block in the Thanos configuration.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;backoff_config&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;max_retries&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Replace the advanced backoff settings with a single integer (&lt;code&gt;max_retries&lt;/code&gt;). Set to 1 to disable retries, or a higher value to enable them.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example configuration migration (S3):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Existing configuration&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage_config:
  aws:
    bucket_names: my-bucket1,my-bucket2   # multiple buckets no longer supported
    endpoint: s3.amazonaws.com
    region: us-west-2
    access_key_id: example-key
    secret_access_key: example-secret
    signature_version: v4
    disable_dualstack: true
    storage_class: STANDARD
    http_config:
      timeout: 1m
      insecure_skip_verify: false
    # ...
    backoff_config:
      max_retries: 5
    sse:
      type: SSE-KMS
      kms_key_id: mySSEKey&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;New configuration&lt;/strong&gt; (Thanos-based)&lt;/em&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage_config:
  use_thanos_objstore: true
  object_store:
    s3:
      bucket_name: my-bucket1                       # single bucket
      endpoint: s3.amazonaws.com
      region: us-west-2
      access_key_id: example-key
      secret_access_key: example-secret
      dualstack_enabled: false                        # was disable_dualstack: true
      storage_class: STANDARD
      max_retries: 5
      http:
        insecure_skip_verify: false
      sse:
        type: SSE-KMS
        kms_key_id: mySSEKey&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For more advanced configuration options (such as &lt;code&gt;list_objects_version&lt;/code&gt;, &lt;code&gt;bucket_lookup_type&lt;/code&gt;, etc.), see the 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#thanos_object_store_config&#34;&gt;Thanos S3 configuration reference&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;azure-storage-migration&#34;&gt;Azure Storage Migration&lt;/h3&gt;
&lt;p&gt;When migrating from the existing 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#azure_storage_config&#34;&gt;Azure&lt;/a&gt; storage client to the new Thanos-based client, no changes are required if you are using the following parameters:&lt;/p&gt;
&lt;div class=&#34;responsive-table-wrapper&#34;&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;Existing Parameter&lt;/th&gt;
              &lt;th&gt;New Parameter&lt;/th&gt;
              &lt;th&gt;Required Changes&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;account_name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;account_name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;account_key&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;account_key&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;container_name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;container_name&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;endpoint_suffix&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;endpoint_suffix&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;user_assigned_id&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;user_assigned_id&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;connection_string&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;connection_string&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;max_retries&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;max_retries&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;chunk_delimiter&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;chunk_delimiter&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;No changes required&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;

&lt;p&gt;If you are using an authentication method other than storage account key or user-assigned managed identity, you&amp;rsquo;ll have to pass the neccessary credetials using environment variables.
For more details, refer to &lt;a href=&#34;https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Azure Identity Client Module for Go&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;filesystem-storage-migration&#34;&gt;Filesystem Storage Migration&lt;/h3&gt;
&lt;p&gt;When migrating from the existing 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#local_storage_config&#34;&gt;Filesystem storage&lt;/a&gt;
client to the new Thanos-based client, update or remove parameters as follows:&lt;/p&gt;
&lt;div class=&#34;responsive-table-wrapper&#34;&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;Existing Parameter&lt;/th&gt;
              &lt;th&gt;New Parameter&lt;/th&gt;
              &lt;th&gt;Required Changes&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;directory&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;dir&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Rename &lt;code&gt;directory&lt;/code&gt; to &lt;code&gt;dir&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example configuration migration (Filesystem):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Existing configuration&lt;/strong&gt; (&lt;code&gt;FSConfig&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage_config:
  filesystem:
    directory: /var/loki/chunks&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;New configuration&lt;/strong&gt; (Thanos-based)&lt;/em&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;storage_config:
  use_thanos_objstore: true
  object_store:
    filesystem:
      dir: /var/loki/chunks&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;For providers not listed here, refer to the 
    &lt;a href=&#34;/docs/loki/v3.7.x/configure/#thanos_object_store_config&#34;&gt;Thanos storage configuration reference&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

]]></content><description>&lt;h1 id="migrate-to-thanos-storage-clients">Migrate to Thanos storage clients&lt;/h1>
&lt;p>Loki release 3.4 introduces new object storage clients based on the &lt;a href="https://github.com/thanos-io/objstore" target="_blank" rel="noopener noreferrer">Thanos Object Storage Client Go module&lt;/a>.&lt;/p>
&lt;p>One of the reasons for making this change is to have a consistent storage configuration across Grafana Loki, Mimir and other telemetry databases from Grafana Labs. If you are already using Grafana Mimir or Pyroscope, you can reuse the storage configuration for setting up Loki.&lt;/p></description></item></channel></rss>