Aprende a configurar Thanos usando docker-compose

Jose Maria Hidalgo Garcia
6 min readJul 5, 2021

Antes de comenzar la instalación en un entorno como podría ser Kubernetes (AWS EKS, Azure AKS, Google, …) es importante entender los componentes principales que forman Thanos y que ventajas añade frente a una instalación de Prometheus “clásica”.

Lo que veremos en esta entrada se divide en dos partes una teórica y otra práctica:

  • Teoría: Que es Prometheus y Thanos
  • Práctica: Configuracion de Thanos usando docker-compose

Un poco de teoría

¿Que es Prometheus?

Es un sistema de monitorización que incluye:

  • Un modelo de datos multidimensional
  • Un lenguaje para poder realizar consultas sobre dicho modelo llamado PromQL
  • Una base de datos de series temporales que dispone de mas de 150 integraciones.

Prometheus es hoy en día una de las soluciones más usadas de monitorización sobre cluster de Kubernetes.

Uno de sus principales problemas es que maneja métricas de corta duración. Por esta razón su objetivo es almacenar y explotar las métricas más “live” / “hot”. Cuando se quiere consolidar metricas de diversas instalaciones de Prometheus no suele escalar muy bien y la arquitectura haciendo uso de las federaciones de Prometheus es algo compleja.

¿Que es Thanos?

Thanos es una configuracion sobre Prometheus que le incorpora capacidades para guardar datos y consultarlos durante un periodo de tiempo largo. A parte de ofrecer de caja la opción de una instalación de HA. Siendo un producto que se adapta mejor cuando se necesita una solución multicloud / multicluster para consolidar métricas de varias fuentes.

Thanos usa Object Store como puede ser AWS S3/Minio para las capacidades de almacenamiento de larga duración.

Thanos usa Object Store como puede ser AWS S3/Minio para las capacidades de almacenamiento de larga duración. El impacto en la reducción de coste del storage necesario es directo. Al ser un tipo de storage más barato.

Thanos tiene un vista global de búsquedas (Global Query View), que significa que se pueden lanzar queries desde solo un endpoint a multiples servidores de Prometheus o clusters. Además se puede seguir usando Grafana generando las consultas usando Prometheus Query API.

A parte de todo lo anterior Thanos, proporciona downsamplig y compactacion. Lo cual acelera las búsqueda cuando el rango temporal es muy amplio dando como resultado un mejor rendimiento.

Componentes de Thanos

Vista general de todos los componentes que tiene Thanos:

Thanos Components

Los componentes que forman Thanos se pueden categorizar de la siguiente manera.

Metric sources:

  • Thanos proporciona dos componente que cumplen la funcion de Data Source: Prometheus Sidecar y Rule Nodes.
  • El Sidecar implemente un servicio gRPC sobre Prometheus.
  • Rule Node directamente lo implementa sobre el Prometheus storage engine que está ejecutándose.
  • Los Data Sources que almacenan los dato a largo plazo, lo hacen usando el motor de almacenamiento Prometheus 2.0.
  • El Store Engine crea bloques inmutables de los datos durante un intervalo de tiempo fijo.
  • Un bloque se encuentra en el directorio principal e incluye los ficheros para chunks, index y meta.json.
  • Los ficheros chunks tienen un tamaño como máximo cientos de MB cada uno.
  • El fichero index contiene toda la informacion necesaria para buscar series por su labels y la posicion de sus fragmentos.
  • Por último meta.json almacena la metainformacion del bloque como: estadísticas, rango de tiempo, nivel de compactación.

Stores:

  • Un Store Node actua como Gateway para bloques de información que están almacenados en un Object Storage Bucket.
  • Implementa la misma gRPC API como Data Source para proveer el acceso a todas lasmétricas almacenadas en un bucket.
  • Constantemente sincroniza que bloques existen en el Bucket y traduce las busquedas de metricas en queries sobre el almacenamiento de objectos.
  • Implementa varias estrategias para reducir el numero de peticiones a el Object Storage.
  • La capa de almacenamiento de Prometheus 2.0 esta optimizada para minimizar las lecturas.
  • Solo la información de indice se cachea.
  • Stores y Data Sources son lo mismo. Exponen el mismo gRPC Store API.
  • Store API permite buscar información por un conjunto de etiquetas que coinciden en un intervalo de tiempo.
  • Despues se devuelven esos fragmentos comprimidos tal como se encuentran almacenados en los bloques de datos.
  • Store API es una API de recuperación de datos y no proporciona una ejecución de consultas complejas.

Query Layer:

  • Los Queriers son instancias sin estado y escalables horizontalmente que implementan PromQL sobre el Store APIs expuesto en el cluster.
  • Los Queriers dotan a Thanos de resiliencia para descubrir todos los Data Sources y Store Nodes.
  • Los Rules Nodes en cambio pueden descubrir nodos de consulta (Queriers) para evaluar las reglas de registro y alerta.
  • Basándose en la metainformación de los nodos de origen y de almacenamiento se intenta minimizar el número de peticiones para obtener los datos de una consulta.
  • Los únicos componentes escalables de Thanos son los nodos de consulta, ya que ninguno de los componentes de Thanos proporciona sharding.
  • El escalado de la capacidad de almacenamiento se garantiza confiando en un sistema de almacenamiento de objetos externo.
  • Store, Rule y Compactor Nodes escalan dentro de una sola instalacion o dos si se han configurado en HA.

Los puntos anteriores son un resumen de la documentación oficial de Thanos

Configuracion de Thanos usando docker-compose

Como se ha comprobado, Thanos dispone de muchos mas componentes que lo hacen mucho más versatil pero a la vez algo más complicado de configurar.

Antes de pasar a configurarlo dentro de un Kubernetes es intersante configurarlo en nuestra máquina local con el objetivo de aprender. En el siguiente repositorio:

https://github.com/jhidalgo3/config-thanos-docker-compose

Encontrareis todos los ficheros que usaremos para configurar: Thanos Cluster con Minio, Node-Exporter, Grafana.

vista general de los contenedores creados por el docker-compose

Paso 1: realizar un clone del repositorio de Github y dentro del directorio donde se encuentra el docker-compose.yml realizar:

$ docker-compose up

Comprobamos que el arranque de todos los contenedores fue correcto.

$ docker-compose ps
Estado de los contenedores y puertos

Paso 2: Acceder a la Thanos Query UI, que es idéntica a la de prometheus http://localhost:10904/graph

Thanos Query UI

Paso 3: Thanos guarda las métricas en Object Store Buckets en el ejemplo se ha configurado Minio con este objetivo. Se puede consultar su Web UI en la siguiente URL http://localhost:9000/minio y comprobar los objetos persistidos por Thanos.

Minio Web UI

Configurarando Grafana

Por último toca crear unos dashboard de explotación de las métricas almacenadas dentro de Grafana accedemos a http://localhost:3000/

Paso 4: Crear un Data Sources de tipo Prometheus y simplemente lo apuntamos al Query0 que corre en la URL http://query0:10904

Config a Thanos Query

Una vez comprobada la conexión con el Thanos Query ya tendriamos nuestro Datasource configurado.

Último paso: Sólo queda configurar el Dashboard de Grafana para poder visualizar datos. En el directorio https://github.com/jhidalgo3/config-thanos-docker-compose/tree/master/thanos-dashboard puede encontrar varios dashboard.

Node exporter dashboard

Cualquier duda o pregunta puedes lanzarla en los comentarios o si lo prefieres en mi perfil de twitter @jhidalgo3. Estaré encantado de resolverlas y todo feedback es siempre bienvenido.

--

--

Jose Maria Hidalgo Garcia

Disfruto creando software e infraestructura Cloud. Asegurando que la definición de los recursos, su configuración esté versionado y poder así automatizar todo