Trazabilidad con SpringBoot 3 y Zipkin

Discusión

Hoy en día la trazabilidad de las aplicaciones se ha vuelto indispensable (por más mínima que sea), por ende el seguimiento de toda la traza de la aplicación (Desde la petición hasta la respuesta de cada clase o componente) es vital, en especial cuando existen componentes de alta transaccionalidad.

¿Que es Zipkin?

Es un sistema distribuido que tiene el enfoque de realizar seguimiento y recopilación de datos a tiempo real, de tal forma se realiza un seguimiento a latencia y secuencia de alguna operación que se realice a algún servicio desplegado.

Pruebas

Para realizar la prueba e implementación correspondiente se hace el uso de:

  • Zipkin (Docker)

  • Springboot 3

Despliegue de Zipkin

Para levantar el servicio de Zipkin se ejecuta la siguiente línea de comando:

docker run -d -p 9411:9411 openzipkin/zipkin

Implementación de código

Para esta implementación, no se utilizó Sleuth o alguna implementación antigua que normalmente existe en internet, primero al crear un proyecto en SpringBoot añadimos las siguientes dependencias:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
</dependency>

¿Que es Brave?

Brave es una biblioteca que ayuda a identificar las peticiones que puede realizar un componente o una aplicación. Esto se puede ver en la página oficial de Zipkin (librerías). Por lo tanto, Spring hizo una implementación de esta librería.

Para el archivo application.properties se define las siguientes lineas, (1) mostrar solo el 10% de las solicitudes, (2) nombre del servicio y (3) patrón de como se verá la traza en Zipkin.

management.tracing.sampling.probability=1.0
spring.application.name=ms-spring-service
logging.pattern.correlation=[${spring.application.name:},%X{traceId:-},%X{spanId:-}]

Una vez realizada la configuración e implementar algunos servicios para prueba se podrá obtener las trazas respectivamente de cada uno de ellos, en nuestro caso se implementa tres métodos, en la clase ControllerTracer: (1) con respuesta correcta, (2) con ResTemplate y (3) generando un error.

@Autowired
    private Tracer tracer;

    @GetMapping(value = "hello")
    public ResponseObject hellWorld(){
        ResponseObject responseObject = new ResponseObject();
        responseObject.setResponse("Hello world, this is trace: " + tracer.currentSpan().context().traceId());
        responseObject.setTraceId(tracer.currentSpan().context().traceId());
        return responseObject;
    }

    @GetMapping(value ="joke")
    public Joke getJoke() {
        RestTemplate restTemplate = new RestTemplate();
        Joke joke = restTemplate.getForObject("https://official-joke-api.appspot.com/random_joke", Joke.class);
        ResponseObject responseObject = new ResponseObject();
        responseObject.setResponse(joke);
        responseObject.setTraceId(tracer.currentSpan().context().traceId());
        return joke;
    }

    @GetMapping(value = "hello-error")
    public String helloWorld2(){
        throw new RuntimeException(tracer.currentSpan().context().traceId());
    }

Pruebas

Se puede ingresar a swagger-ui para obtener la lista de servicios para probar de manera más fácil:

Se ejecutó los tres métodos aleatoriamente en rangos de 5 minutos, se detalla lo siguiente:

  1. Es el número de resultados permitidos configurado en el application.properties, al igual que la linea resaltada de color verde, el tiempo es más largo (700ms) debido a que realiza una petición como cliente.

  2. formato de la traza igualmente, configurado en el archivo: application.properties.

  3. Servicio exitoso

  4. Servicio con Error

Aclaraciones

  • No se realizó ninguna configuración o anotación adicional más que solo en el archivo de configuración.

  • Para acceder a Zipkin UI de forma local: ingrese a http://127.0.0.1:941

  • En caso de que la página o URL de Zipkin sea remota o distinta puede añadir la propiedad siguiente: management.zipkin.tracing.endpoint=<<URL>>

Conclusiones

  • El número de entradas (10%) es una limitando, por ende es necesario que viaje la información a otro componente de lectura completa y mayor, como Prometheus y Grafana, para tener mejores indices y métricas correspondientes con respecto a volumen de datos e historico.

Recursos

Did you find this article valuable?

Support Christian Loza Peralta by becoming a sponsor. Any amount is appreciated!