<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ritesh Sonawane</title>
    <description>The latest articles on Forem by Ritesh Sonawane (@riteshs14112760).</description>
    <link>https://forem.com/riteshs14112760</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1029246%2F9b43b2ed-8b2a-4bbb-a1cb-70e02d710e49.jpeg</url>
      <title>Forem: Ritesh Sonawane</title>
      <link>https://forem.com/riteshs14112760</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/riteshs14112760"/>
    <language>en</language>
    <item>
      <title>Scaling Prometheus with Thanos</title>
      <dc:creator>Ritesh Sonawane</dc:creator>
      <pubDate>Tue, 23 Jul 2024 06:03:52 +0000</pubDate>
      <link>https://forem.com/riteshs14112760/scaling-prometheus-with-thanos-4j5j</link>
      <guid>https://forem.com/riteshs14112760/scaling-prometheus-with-thanos-4j5j</guid>
      <description>&lt;p&gt;Observability is a crucial pillar of any application, and monitoring is an essential component of it. Having a well-suited, robust monitoring system is crucial. It can help you detect issues in your application and provide insights once it is deployed. It aids in performance, resource management, and observability. Most importantly, it can help you save costs by identifying issues in your infrastructure. One of the most popular tools in monitoring is &lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It sets a de facto standard with its straightforward and powerful query language PromQL, but it has limitations that make it unsuitable for long-term monitoring. Querying historical metrics in Prometheus is challenging because it is not designed for this purpose. Obtaining a global metrics view in Prometheus can be complex. While Prometheus can scale horizontally with ease on a small scale, it faces challenges when dealing with hundreds of clusters. In such scenarios, Prometheus requires significant disk space to store metrics, typically retaining data for around 15 days. For instance, generating 1TB of metrics per week can lead to increased costs when scaling horizontally, especially with the Horizontal Pod Autoscaler (HPA). Additionally, querying data beyond 15 days without downsampling further escalates these costs.&lt;/p&gt;

&lt;p&gt;There are many Projects like &lt;a href="https://thanos.io/" rel="noopener noreferrer"&gt;Thanos&lt;/a&gt;, &lt;a href="https://m3db.io/" rel="noopener noreferrer"&gt;M3&lt;/a&gt;, &lt;a href="https://cortexmetrics.io/" rel="noopener noreferrer"&gt;Cortex&lt;/a&gt;, and &lt;a href="https://victoriametrics.com/" rel="noopener noreferrer"&gt;Victoriametrics&lt;/a&gt;. But &lt;a href="https://thanos.io/" rel="noopener noreferrer"&gt;Thanos&lt;/a&gt; is the most popular among these. Thanos addresses these issues with Prometheus and is the ideal solution for scaling Prometheus in environments with extensive metrics or multiple clusters where we require a global view of historical metrics. In this blog, we will explore the components of Thanos and will try to simplify its architecture by building it step by step, starting with the main components. We will also have a demo using &lt;a href="https://github.com/grafana/xk6-client-prometheus-remote" rel="noopener noreferrer"&gt;k6-metrics&lt;/a&gt;. Before diving into Thanos, I recommend reading our blog on Prometheus &lt;a href="https://www.cloudraft.io/blog/monitoring-with-prometheus" rel="noopener noreferrer"&gt;Monitoring with Prometheus&lt;/a&gt; if you are not already familiar with Prometheus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanos
&lt;/h2&gt;

&lt;p&gt;Started in November 2017, Thanos is an open-source CNCF incubating project with over 12.8k stars on GitHub. Built on top of Prometheus, Thanos aims to provide a highly available Prometheus environment with long-term storage support and a global view of metrics. Companies like &lt;a href="https://thanos.io/" rel="noopener noreferrer"&gt;Disney, Abode, eBay, SoundCloud&lt;/a&gt;, and &lt;a href="https://thanos.io/" rel="noopener noreferrer"&gt;ByteDance&lt;/a&gt; use Thanos for monitoring at scale. However, setting up Thanos can be complex and requires expertise with Prometheus and industry experience. If you want to overcome the limitations of Prometheus and set up Thanos for monitoring but don't know where to start, CloudRaft offers enterprise-grade consulting and support for Thanos that you should &lt;a href="https://www.cloudraft.io/thanos-support" rel="noopener noreferrer"&gt;check out&lt;/a&gt;. Now, let's delve into the components of Thanos and understand its complete architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanos Components and Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Thanos Query/Querier
&lt;/h3&gt;

&lt;p&gt;Thanos Query serves as the backend for Thanos, utilising the &lt;a href="https://github.com/thanos-io/thanos/blob/35c0dbec856f97683a846e9c53f83156a3a44ff3/pkg/store/storepb/rpc.proto#L27" rel="noopener noreferrer"&gt;gRPC StoreAPI&lt;/a&gt; to retrieve data from various components. It is completely stateless and horizontally scalable, allowing it to query multiple sources and merge them into one, effectively avoiding duplicate metrics. With Thanos Query, data can be fetched from various sources. Below is an example of retrieving data from a Thanos Sidecar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Query_rnsxms.webp%26w%3D1920%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Query_rnsxms.webp%26w%3D1920%26q%3D75" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prometheus is unaware of StoreAPI, so Thanos Query requests metrics from the Thanos Sidecar. This way, Thanos Query indirectly communicates with the Prometheus instance in a sidecar architecture. While it is possible to deploy Thanos Query without a sidecar model, before that, let's explore the benefits and functionalities of a sidecar model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanos Sidecar
&lt;/h3&gt;

&lt;p&gt;The Thanos Sidecar can do more than just retrieve metrics from Prometheus. It can also store these metrics in an Object Store. Thanos Query can then use the Store Gateway component to fetch data directly from the Object Store, eliminating the need to request metrics from the Sidecar. This allows for reduced retention in Prometheus, resulting in lower disk space usage and cost savings. Sidecar sends TSDB block data from Prometheus to the Object Store every two hours by default, which reduces Prometheus's resource consumption.&lt;/p&gt;

&lt;p&gt;To avoid data loss within the two-hour window, Prometheus should remain stateful. However, to make Prometheus stateless, Thanos offers a component called Thanos Receiver. Using Thanos Receiver we can eliminate the sidecar model. Before delving into Receiver, let's explore the functionality of Thanos Store Gateway.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanos Store Gateway
&lt;/h3&gt;

&lt;p&gt;Thanos Store Gateway implements the &lt;a href="https://github.com/thanos-io/thanos/blob/35c0dbec856f97683a846e9c53f83156a3a44ff3/pkg/store/storepb/rpc.proto#L27" rel="noopener noreferrer"&gt;Store API&lt;/a&gt;, enabling Thanos Query to retrieve data from the remote Object Store. Acting as an API gateway between the Object Store and Thanos Query, the Thanos Store facilitates efficient data access. The Thanos Sidecar can directly push data to this Object Store. The Store Gateway component keeps some data from the Object Store on its local disk, ensuring proper synchronization with the Object Store. Check out the below illustration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Store_sawtot.webp%26w%3D1920%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Store_sawtot.webp%26w%3D1920%26q%3D75" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The use of an Object Store eliminates the need to store large amounts of data on disk, helping us save on costs. Whenever we require any data, we can query it using Thanos Query. The Thanos Query features a dashboard component named Thanos Query Frontend, very similar to that of Prometheus, where users can input a PromQL query. The Thanos Query then uses the gRPC Store API to retrieve the data via the Thanos Store.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanos Compactor
&lt;/h3&gt;

&lt;p&gt;While we can store infinite amounts of data in an Object Store, long-term storage can become costly. Downsampling our data helps mitigate this issue. When we downsample a block of data, we increase the time interval of the data points, for example, from a one-minute block to a five-minute block. This not only reduces storage costs but also enhances query performance using PromQL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Compactor_1_sdwjxt.webp%26w%3D1920%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Compactor_1_sdwjxt.webp%26w%3D1920%26q%3D75" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Compactor is the sole component in Thanos with the capability to delete data from the Object Store while all other components only have write permissions. The Compactor consolidates multiple blocks of data into one, optimizing storage efficiency. It's best practice to run only one instance of the Compactor against an Object Store.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanos Ruler
&lt;/h3&gt;

&lt;p&gt;Thanos Ruler evaluates the Prometheus &lt;a href="https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/" rel="noopener noreferrer"&gt;recording&lt;/a&gt; and &lt;a href="https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/" rel="noopener noreferrer"&gt;alerting&lt;/a&gt; rule against the passed query and can be used for alerting purpose. By default, the evaluated results by Thanos Ruler are written back to the disk. The Thanos Ruler can be configured to store these results in a remote Object Store.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Ruler_t387rg.webp%26w%3D1920%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252FThanos-Ruler_t387rg.webp%26w%3D1920%26q%3D75" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanos Receiver
&lt;/h3&gt;

&lt;p&gt;Using Thanos Receiver simplifies the complexities associated with the Thanos Sidecar. When using the sidecar, permissions must be granted for sidecar components to push metrics to the object store, which involves opening a new port for communication with the store. Thanos Receiver eliminates this complexity.&lt;/p&gt;

&lt;p&gt;With Thanos Receiver, Prometheus is configured to use its remote write feature to send metrics directly to the receiver. The Thanos Receiver then pushes these metrics to the object store. The diagram below illustrates this setup. Prometheus continuously writes metrics to the Thanos Receiver, which, by default, pushes these metrics to the object store after two hours. To query metrics in real-time, the Thanos Receiver exposes a Store API for Thanos Query which can be useful for developers to see live metrics after deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252Fthanos-reciever_lusr0o.webp%26w%3D1920%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252Fthanos-reciever_lusr0o.webp%26w%3D1920%26q%3D75" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanos Receiver needs to determine how to distribute incoming timeseries data across different nodes. To address this, Thanos Receiver employs a hashring mechanism. When Thanos Receiver is configured on Kubernetes it takes the help of Thanos Receiver controller which automates the hashring management. This component keeps the hashring up-to-date when the Thanos receiver is scaled using HPA or other auto scalers&lt;/p&gt;

&lt;h3&gt;
  
  
  Thanos Query frontend
&lt;/h3&gt;

&lt;p&gt;The Thanos Query frontend is a dashboard provided by Thanos that is similar to the Prometheus Dashboard. It also uses PromQL as its query language. With this component, users can ask for metrics from the Thanos Query component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation and Demo
&lt;/h2&gt;

&lt;p&gt;In this demo, we will test Thanos and scale Thanos receiver using k6s-metrics.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installing Minio for object storage&lt;/li&gt;
&lt;li&gt;Installing Thanos and Prometheus&lt;/li&gt;
&lt;li&gt;Load test using &lt;a href="https://github.com/grafana/xk6-client-prometheus-remote" rel="noopener noreferrer"&gt;k6s-metrics&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's start by creating a kind cluster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kind create cluster &lt;span class="nt"&gt;--name&lt;/span&gt; my-cluster &lt;span class="nt"&gt;--config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Minio (Object Store)
&lt;/h3&gt;

&lt;p&gt;Minio is a popular open source object storage, an alternative of AWS S3 that we are using here in our local setup. If you have S3 or similar storage, you can use it here.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run below script to install Minio in thanos-test namespace
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;
kubectl create ns thanos-test
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing Minio using Helm charts..."&lt;/span&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami
helm &lt;span class="nb"&gt;install &lt;/span&gt;minio bitnami/minio &lt;span class="nt"&gt;--version&lt;/span&gt; 14.2.0 &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test
&lt;span class="nb"&gt;sleep &lt;/span&gt;40
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Exposing Minio on 127.0.0.1:8080"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Username for Minio: admin"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Password for Minio: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kubectl get secrets &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test minio  &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.data."root-password"'&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
kubectl port-forward svc/minio 8080:9001 &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test &amp;amp;
&lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Access the Minio dashboard at port 8080 and create a new bucket named “thanos” also create an access key and secret. Once done create a secret as of below and replace the access key and secret field
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;minio-thanos&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;thanos-test&lt;/span&gt;
&lt;span class="na"&gt;stringData&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;objstore.yml&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;type: S3&lt;/span&gt;
    &lt;span class="s"&gt;config:&lt;/span&gt;
      &lt;span class="s"&gt;bucket: "thanos"&lt;/span&gt;
      &lt;span class="s"&gt;endpoint: "minio.thanos-test.svc.cluster.local:9000"&lt;/span&gt;
      &lt;span class="s"&gt;insecure: true&lt;/span&gt;
      &lt;span class="s"&gt;access_key: &amp;lt;ACCESS_KEY&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;Secret_key: &amp;lt;SECRET_KEY&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Thanos and Prometheus
&lt;/h3&gt;

&lt;p&gt;Please execute the following script to install Thanos and Prometheus.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing Thanos in &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kubectl config current-context&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
helm repo add bitnami https://charts.bitnami.com/bitnami
helm &lt;span class="nb"&gt;install &lt;/span&gt;thanos bitnami/thanos &lt;span class="nt"&gt;--version&lt;/span&gt; 15.1.0 &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test
&lt;span class="nb"&gt;sleep &lt;/span&gt;60
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"thanos is installed"&lt;/span&gt;
kubectl get all &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Exposing thanos on 127.0.0.1:8081"&lt;/span&gt;
kubectl port-forward svc/thanos-query-frontend &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test 8081:9090 &amp;amp;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Exposing grafana on 127.0.0.1:8082"&lt;/span&gt;
kubectl port-forward svc/grafana &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test 8082:3000 &amp;amp;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Password for grafana: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kubectl get secrets &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test grafana-admin &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.data."GF_SECURITY_ADMIN_PASSWORD"'&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Username for grafana: admin"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"For mointoring purpose installing kube-prometheus-stack"&lt;/span&gt;
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm &lt;span class="nb"&gt;install &lt;/span&gt;kube-prometheus-stack prometheus-community/kube-prometheus-stack &lt;span class="nt"&gt;--version&lt;/span&gt; 58.2.1 &lt;span class="nt"&gt;-n&lt;/span&gt; thanos-test &lt;span class="nt"&gt;-f&lt;/span&gt; kube-prometheus-stack-values.yaml
&lt;span class="nb"&gt;sleep &lt;/span&gt;60
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Prometheus installed connect with grafana at port 8082"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing using K6s-metrics
&lt;/h2&gt;

&lt;p&gt;Use the below script to test Thanos. You can change the virtual users and other fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;check&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;k6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;remote&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;k6/x/remotewrite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;vus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;800s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://127.0.0.1:8085/api/v1/receive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__name__&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`test_metric_&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;__VU&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;is status 200&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use Grafana to visualize the Thanos receiver consumption. More Grafana dashboards are available &lt;a href="https://github.com/thanos-io/thanos/blob/main/examples/dashboards/dashboards.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252Fgrafana-dashboard_f51u3y.webp%26w%3D1080%26q%3D75" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.cloudraft.io%2F_next%2Fimage%3Furl%3Dhttps%253A%252F%252Fres.cloudinary.com%252Fdfee67kdq%252Fimage%252Fupload%252Fq_auto%252Cf_auto%252Fblogs%252Fgrafana-dashboard_f51u3y.webp%26w%3D1080%26q%3D75" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Some of the benefits of using Thanos are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-term metrics Storage&lt;/li&gt;
&lt;li&gt;Save cost by using Object Store&lt;/li&gt;
&lt;li&gt;Efficient Query with Global View&lt;/li&gt;
&lt;li&gt;HA Prometheus instance&lt;/li&gt;
&lt;li&gt;Data deduplication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Integrating Thanos into your monitoring setup can enhance your application by providing access to historical data and overcoming the limitations of a standalone Prometheus setup. Additionally, Thanos can help reduce the costs associated with Prometheus. However, Thanos may not be the ideal solution for everyone. To determine what’s best for your infrastructure and how you can save costs, &lt;a href="https://www.cloudraft.io/contact-us" rel="noopener noreferrer"&gt;contact us&lt;/a&gt;. If Thanos is right for you, we’ll ensure a smooth, secure, and reliable installation process and long term support&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>monitoring</category>
      <category>prometheus</category>
      <category>observability</category>
    </item>
  </channel>
</rss>
