¡Compártelo!

Spring boot 3.0: Observabilidad a un nuevo nivel

Con la llegada de la nueva versión de Spring boot se ha introducido una nueva manera de entender la observabilidad de un aplicativo de modo que podamos tener un mayor control sobre lo que sucede dentro de él, minimizando el número de dependencias a usar para llevar a cabo esta tarea. En este artículo, vamos a descubrir cómo manejar observabilidad con Spring boot 3. ¡Comenzamos!

Significado de Observabilidad

Podemos definir el significado completo de observabilidad con la siguiente frase

“Cómo de bien podemos comprender las partes internas de nuestros aplicativos a partir de sus salidas.”

Para ello existen diferentes tipos de técnicas: Monitoring, Tracing y Logging. Todas ellas en conjunto nos permiten ayudar a garantizar el correcto funcionamiento del sistema, poder rastrear lo que puede haber ido mal cuando se localizan problemas, así como detectar los diferentes cuellos de botella que podamos tener. 

observabilidad con Spring Boot 3
  • Monitoring: sistema de diagnóstico y alertas encargado de recopilar, agregar y analizar métricas de cada aplicativo para mejorar poder consultar el comportamiento del sistema a lo largo del tiempo.
  • Tracing:  sistema de diagnóstico que permite la trazabilidad para toda petición existente en nuestros sistema desde que entra hasta que es respondida.  Debe permitir identificar todos y cada uno de los componentes que ha usado así como su comportamiento para en cada uno de ellos (tiempos de respuesta y resultado).
  • Logging: sistema de diagnóstico que permite centralizar la consulta de logs de aplicación mediante una herramienta que permita consultar todas y cada una de las entradas generadas para una petición dada. 

Observabilidad: Centraliza y vencerás

Uno de los principales problemas que nos podemos encontrar cuando intentamos realizar un sistema de observabilidad dentro de nuestro sistema es la existencia de innumerables herramientas que nos permiten obtener cada unos de los aspectos por separado pero no existe una manera sencilla y directa de poder navegar en la información a través de ellas (al disponer de diferentes herramientas).

A modo de ejemplo para poder ilustrar mejor la problemática usamos un ejemplo práctico. Si observamos que en nuestro sistema de métricas las peticiones están tardando más de lo esperado en ser atendidas necesitamos poder navegar a través de esa métrica al correspondiente tracing asociado para poder visualizar el comportamiento en cada uno de los puntos que interacciona con sistemas externos para poder localizar la falla. En el caso de que fuera necesario debemos poder localizar de manera directa  el logging asociado para poder visualizar qué ha sucedido internamente dentro de nuestro aplicativo a más bajo nivel.

Para poder realizar esta correspondencia es necesario poder etiquetar todos los datos con el mismo trace_id para nuestras soluciones de tracing, monitoring y logging

En el siguiente diagrama podemos ver cómo se va a realizar la interoperabilidad entre los distintos conceptos de observabilidad existentes para la aplicación Spring boot de ejemplo que mostraremos más adelante:

observabilidad con Spring Boot 3

Cómo manejar Observabilidad en Spring boot 3.0

En versiones anteriores de Spring boot si queríamos monitorizar la trazabilidad usábamos Spring Cloud Sleuth que nos permitía identificar las peticiones de forma unívoca sobre nuestra arquitectura. Por otro lado usábamos Micrometer para poder monitorizar las métricas importantes dentro de nuestro aplicativo.

El nuevo cambio que nos brinda Spring boot 3 consiste en unificar ambos aspectos dentro de Micrometer (Metrics+Tracing) con lo que la librería Spring Cloud Sleuth deja de ser necesaria.

Para poder entender completamente el cambio tan disruptivo que implica esa unificación procederemos a implementar una aplicación de ejemplo donde vamos a monitorizar todos estos aspectos que nos permitirá comprender de manera más sencilla la nueva manera de configurar la observabilidad dentro de nuestras aplicaciones Spring boot.

Aplicativo Spring boot 3: “Talk is cheap. Show me the code

La aplicación de ejemplo (Repositorio github código fuente) contiene un api rest creado con Spring Boot 3.0 usando Kotlin (en Profile es JDK first language) con la que podemos visualizar los datos de observabilidad mediante Grafana como fuente única de verdad para poder rastrear cualquier problema en nuestro sistema definiendo un api rest con los siguiente endpoints:

Grafana: única fuente de la verdad

Para aquellos aún  no conozcan esta herramienta, Grafana consiste en una interfaz de usuario que permite a partir de consultas a diferentes fuentes de datos poder visualizarlos para su posterior interpretación. Para nuestro caso de uso podemos navegar entre todos los datos existentes de manera bidireccional.

observabilidad con Spring Boot 3
* Vista general de Grafana

Para permitir visualizar todos los datos de observabilidad en Grafana se utilizan las siguientes tecnologías:

* Grafana Loki : sistema de agregación de logs creado por Grafana que nos permite consultar los logs en Grafana de manera visual. Spring Micrometer nos posibilita correlacionar de manera automática todas las peticiones y que puedan ser enviados directamente a Loki definiendo un appender dentro del fichero logback-spring.xml

observabilidad con Spring Boot 3

* Grafana Tempo: solución de almacenamiento de datos de tracing creada por el equipo de Grafana. Para poder enviar dicha información debemos definir el uso de Micrometer mediante la definición de las siguientes dependencia en el pom.xml: 

observabilidad con Spring Boot 3

* Prometheus: una de las consideradas mejor base de datos basadas en secuencias temporales que permite almacenar todas las métricas expuestas mediante Spring boot actuator para su posterior explotación en Grafana. Para ello debemos definir la siguiente dependencia en el fichero pom.xml:

observabilidad con Spring Boot 3

* Exemplar: datos adicionales añadidos a una métrica que permite poder categorizarlas. En nuestro caso Spring añade trace_id y span_id de manera transparente a los datos almacenados en prometheus:

http get http://localhost:8081/actuator/prometheus 

cabecera accept= application/openmetrics-text; version=1.0.0; charset=utf-8

observabilidad con Spring Boot 3

Docker compose infraestructura Spring boot

Para poder facilitar la tarea de arrancar todas las herramientas necesarias en el entorno local será necesario tener instalado Docker en la máquina local y usar el fichero docker-compose existente en la raíz del proyecto con el siguiente comando docker:

docker-compose up

Una vez tengamos todo arrancado en local podremos entrar en Grafana y consultar toda la información existente (http://localhost:3000: ) en el panel llamado Logs, Traces, Metrics :

Metrics

Traces

Logs

¿Qué  debemos pedir a la observabilidad en 2023?

Acabamos de introducir una solución que nos permite monitorizar nuestros aplicativos donde utilizamos Grafana para poder consultar toda la información referente a la observabilidad. Asimismo, hemos repasado cómo realizar la observabilidad con Sprint Boot 3.

Existen muchos productos en el mercado que permiten realizar el seguimiento de la información de monitorización por lo que si quieres minimizar el tiempo para poder conocer lo que sucede en tus aplicativos deberíamos implementar una solución donde se debería priorizar que dispongamos una única fuente de la verdad para poder localizar las fallas de nuestro sistema.

Artículos ​ relacionados