Spring Cloud Sleuth y StackDriver Trace




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












Share:

SPRING CLOUD GCP - Config Starter


Ahora vamos a ver esta opción que tiene GCP para guardar nuestras configuraciones. El Spring Cloud GCP Config Starter.

1. Primero hay que habilitar el Cloud Runtime Configuration API.


El resultado es:



2. Vamos al cloud shell para crear un nuevo runtime configuration:

 gcloud beta runtime-config configs create joedayz_prod

El resultado es:


NOTA: Google recomienda que se siga este formato para nombre de runtime configuration: "application-name"_"environment".

3. El siguiente paso es crear algunas variables de configuración:


$ gcloud beta runtime-config configs variables set \
  token_expire 30 --config-name joedayz_prod
$ gcloud beta runtime-config configs variables set \
  validar_x_ldap true --config-name joedayz_prod

El resultado es:


Si deseas comprobar que fueron registradas, puedes listarlas con:

gcloud beta runtime-config configs variables list \
  --config-name joedayz_prod

Obteniendose:



4. Creamos una aplicación Spring Boot

5. Agregamos una controladora  y con @Value tratamos de acceder a dichos valores.




6. Modificamos el pom.xml para agregar las dependencias de spring cloud gcp.









7. Modificar el application.properties y configurar el bootstrap.properties.








8. Para Refrescar la configuración en runtime tendríamos que agregar la dependencia de actuator.

     
            org.springframework.boot
            spring-boot-starter-actuator
       

9. Cambiamos el parametro que querramos a otro valor:

gcloud beta runtime-config configs variables set   token_expire 90 --config-na
me joedayz_prod



10. Probamos el proyecto again, pero, sigue saliendo el resultado anterior.

¿Porque?

11. Hay que hacer un POST actuator/refresh. Use postman o curl. En esta oportunidad usaremos curl.

curl -XPOST http://localhost:8080/actuator/refresh
["token_expire"]%

12. Revisamos y el resultado es:


Obviamente es un micro servicio. Si tienes muchos micro servicios que necesitan ser refrescados, una mejor opción es Spring Cloud Bus.


Enjoy!!

Joe











Share:

Spring Cloud GCP - Google Cloud Storage

Hoy quiero hablarles del Spring Cloud GCP.

El proyecto Spring Cloud GCP nos ofrece las siguientes características:


  • Bill of Materials (BOM) for dependency version management
  • Spring Cloud GCP Pub/Sub, including PubSubTemplate
  • Spring Resource Abstraction for Google Cloud Storage
  • Spring Integration Channel Adapters for Google Cloud Pub/Sub and Google Cloud Storage
  • Spring Cloud Stream Binder for Pub/Sub
  • Spring Data Spanner (BETA)
  • Spring Boot starters
  • GCP Support
    • Google Cloud Config (BETA)
    • Google Cloud Spanner (BETA)
    • Google Cloud Logging
    • Google Cloud Pub/Sub
    • Google Cloud SQL
    • Google Cloud Storage
    • Stackdriver Trace with Spring Cloud Sleuth

Y según la documentación solo es necesario esta dependencia en nuestro proyecto:


   
        org.springframework.cloud
        spring-cloud-gcp
        1.0.0.RELEASE
   


Y Gradle:

dependencies {
    compile 'org.springframework.cloud:spring-cloud-gcp:1.0.0.RELEASE'
}


La intención de este y sucesivos post es mostrarles como usar estos proyectos.

Requisitos 


  • Tener Java 8+
  • Intellij IDEA o el IDE de su preferencia
  • Cuenta activa (trial o pagada) en Google Cloud Platform


Trabajando con Google Cloud Storage (GCS)

1. Primero acceder al Google Cloud Shell ( >_) que es una linea de comandos que se ejecuta en el cloud.




El resultado es:


2. Si colocas el comando gcloud auth list podras ver si estas autenticado. El gcloud es una herramienta de linea de comandos que te permite crear/configurar recursos en GCP , pero , en este shell ya viene instalado por defecto.



3. Verificamos que estamos trabajando con el proyecto correcto:


OJO: Si no estuvieras con el proyecto correcto, deberás setear el proyecto así:

gcloud config set project

Ese PROJECT_ID lo obtienes en:


Y al hacer clic en ese icoono a la derecha te saldrá la lista de proyectos:


4. Creamos un archivo en google cloud storage con echo "Hola desde Peru a GCP lovers" > sample.txt



5. Creamos un bucket en GCS y transferimos nuestro archivo con gsutil

BUCKET=joe-bucket-$USER

gsutil makebucket gs://$BUCKET

gsutil copy sample.txt gs://$BUCKET



Si vamos a la consola GCP, en buckets veremos nuestro archivo:



6. Creamos nuestro proyecto boot con las siguientes dependencias:    web, GCP Storage

7. Creamos una controladora para Leer nuestro archivo:


8. Ejecutamos el proyecto y obtenemos....


Error. Esto se debe a que estamos en nuestra pc y no hemos configurado nuestras credenciales. El mensaje es claro: "GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials"

9. Para solucionar este problema necesitas generar para tu cuenta una clave y descargar el archivo json correspondiente. 


10. Creas una variable de entorno GOOGLE_APPLICATION_CREDENTIALS apuntando a tu archivo json.




11.  Copias el contenido de ese json en un archivo application_default_credentials.json ubicado en ~/.config/gcloud


12. Refresca tu terminal y vuelve a probar.


Perfecto!!. Ahora si todo anda bien.

13.  Invocamos el URL http://localhost:8080

Wala!!! o como se diga jajaja.

14. Si quieres agregar contenido al archivo, tendras que manejar un POST. 


15. Reinicias  y pruebas con postman:



Listo, hasta el próximo proyecto.

Enjoy!

Joe
Share: