En Mi Local Funciona

Technical thoughts, stories and ideas

Aprende a configurar Thanos usando docker-compose

Publicado por Jose Maria Hidalgo Garcia el

Dirección de Tecnología e InnovaciónthanosPrometheusDocker

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: Configuración 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 métricas de diversas instalaciones de Prometheus no suele escalar muy bien, y la arquitectura haciendo uso de las federaciones de Prometheus es algo compleja.

¿Qué es Thanos?

Thanos es una configuración sobre Prometheus que le incorpora capacidades para guardar datos y consultarlos durante un período de tiempo largo. Además ofrece 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 un Object Store como puede ser AWS S3/Minio para las capacidades de almacenamiento de larga duración. De esta forma, 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 múltiples servidores de Prometheus o clusters. Además se puede seguir usando Grafana generando las consultas con Prometheus Query API.

Aparte de todo lo anterior, Thanos proporciona downsampling y compactación, lo cual acelera las búsquedas 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:

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

Metric sources:

  • Thanos proporciona dos componente que cumplen la función de Data Source: Prometheus Sidecar y Rule Nodes.
  • El Sidecar implementa 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 datos 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 máximo de cientos de MB cada uno.
  • El fichero index contiene toda la información necesaria para buscar series por su labels y la posición 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 actúa 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 las métricas almacenadas en un bucket.
  • Constantemente sincroniza qué bloques existen en el Bucket, y traduce las búsquedas de métricas en queries sobre el almacenamiento de objetos.
  • Implementa varias estrategias para reducir el número de peticiones al Object Storage.
  • La capa de almacenamiento de Prometheus 2.0 está optimizada para minimizar las lecturas.
  • Sólo la información de índice 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 meta-informació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 instalación, o dos si se han configurado en HA.

Los puntos anteriores son un resumen de la documentación oficial de Thanos que se debe consultar para más detalle de alguno de los puntos.

Configuración de Thanos usando docker-compose

Como se ha comprobado, Thanos dispone de muchos más componentes que lo hacen mucho más versátil 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 y entender mejor cada uno de los componentes. En el siguiente repositorio encontrareis todos los ficheros que usaremos para configurar: Thanos Cluster con Minio, Node-Exporter, Grafana:

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

La siguiente imagen es un resumen de todos los contenedores que se instanciarán .

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

Paso 2: Se puede acceder a la Thanos Query UI, que es idéntica a la de Prometheus en la siguiente URL http://localhost:10904/graph

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.

Configurando Grafana

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

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

Una vez comprobada la conexión con el Thanos Query ya tendríamos 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 puedes 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.

Si te ha gustado este post ¡síguenos en Twitter para estar al día de próximas entregas!

Enlaces de interés: