Siguiendo con nuestra saga de proyectos de Spring GCP, ahora, nos toca ver Spring Cloud Sleuth.
En proyectos de Arquitectura de Micro servicios es muy importante la información y observabilidad de todo. Si se están realizando llamadas entre servicios A, B y C; es importante entender si estas fueron exitosas o existe latencia entre dichas llamadas.
Nosotros podemos agregar esta dependencia de Sleuth a nuestro proyecto Spring Boot para darle ese "super poder" de tracing distribuido y luego exponer dicha información en un Zipkin o Jaegger por ejemplo.
GCP tiene Stackdriver trace, que es un servicio que nos permite guardar esta data de tracing sin tener que administrar nosotros mismos nuestro Zipking o storage. Stackdriver puede productir reportes de latencia y/o detectar anamalías en la performance.
Existen dos formas de usar Stackdriver Trace en nuestra aplicación Spring Boot:
1. Usas un Stackdriver Trace Zipkin proxy y configurar el Spring Cloud Sleuth para que use este proxy como el Zipkin endpoint.
2. O usas el Spring Cloud GCP Trace, que se integra con Spring Cloud Sleuth, para enviar toda la data directamente a Stackdriver trace.
Requisitos
1. Escoge tu proyecto a trabajar y selecciona Cloud Shell
Con gcloud auth list ves si estas ya autenticado.
2. Crear una aplicación con Spring Boot: web, lombok, GCP support
3. Crear Servicio REST. Creamos un ComiteController para simular las reuniones de trabajo que tenemos con nuestros equipos.
4. Ejecutamos el proyecto y llamamos a localhost:8080
5. Habilitamos el Stackdriver Trace API
Clic en Habilitar.
6. Crear un Application Default Credential.
Este paso ya lo había explicado en mi primer post sobre Google Cloud Storage.
Es por eso, que si lo aplicas en tu PC te saldrá:
Dile N.
Y si lo aplicas en Cloud Shell:
Clic en el link, abre un tab en el navegador, dile Allow y luego copia el codigo que te da y regresa al cloud shell y presiona ENTER.
7. Agregar Spring Cloud GCP Trace.
Por defecto, Spring Cloud Sleuth no muestra todos los request. Pero lo vamos a forzar para que trabaje al 100% e ignoramos algunos URLs. Para eso se configura lo siguiente en el src/main/resources/application.properties.
spring.sleuth.sampler.probability=1.0spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
7. Vamos a la consola Stackdriver - trace - trace list
Usa el Auto Reload y verás como las trazas llegan.
Clic en el URI y verás el detalle de la traza:
8. Creamos un segundo proyecto spring boot:
curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp \
-d baseDir=segundo-servicio | tar -xzvf - \
&& cd segundo-servicio
Abricamos con Intellij y creamos su segunda controller.
9. Creamos ComiteTetris.java
10. Agregamos la dependencia spring-cloud-gcp-starter-trace:
spring.sleuth.sampler.probability=1.0spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*) server.port=8081
11. Probamos
12. Modificamos el primer servicio para que llame al segundo servicio.
13. Volvemos a stack driver trace list y vemos unos puntos azules:
Esos puntos azules son las llamadas del segundo servicio.
14. Como punto final, cabe mencionar que si usas el Stackdriver Trace como el trace data storage, el puede usar estos datos para construir reportes de distribución de latencia. Asimismo puede detectar problemas de performance del mismo servicio en diferentes momentos del tiempo.
Enjoy!
Joe