Ir al contenido principal

Destacado

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 prox…

Ejecutar Stored Procedures con JPA 2.1



Hoy generamos en mi trabajo una nueva versión para UAT (User Acceptance Test) y nos dimos con este problema.

Problema

Teníamos que llamar a dos stored procedures usando SimpleJdbcCall.
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(spJdbcTemplate).withProcedureName(“DELETE_LANE”);
Map in = new HashMap<>();
in.put(“V_LANE_ID”, laneId);

Map out = jdbcCall.execute(in);
El Stored procedure solo recibe un parámetro y no retorna nada, pero, si ejecuta varias operaciones intermedias que omito para este post.


Si bien en nuestro entorno de desarrollo trabajo muy bien, en UAT nos dio este problema:



Que se resume en: “Unable to determine the correct call signature - no procedure/function/signature for ‘DELETE_LANE'”.

Solución

Deduje que no resolvía bien el tipo del parámetro de entrada y que debía ser más explícito. Por suerte, ya sabía que en la versión de JPA 2.1 había soporte para stored procedures, así que procedí a implementarlo:
En la entidad Lane.java añadí el nuevo @NamedStoredProcedureQuery. El atributo name es el nombre interno que usarás en tu aplicación, el valor en procedureName es el nombre real del procedimiento almacenado y luego vienen los parameters donde debes indicar si es IN o OUT , tipo y nombre. Lo cual ya “adivinaba” me ayudaría a resolver mi problema.


Luego tocaba dejar de usar SimpleJdbcCall y usar esta nueva forma de ejecución de stored procedure:


Con 3 simples líneas:
StoredProcedureQuery query = this.em.createNamedStoredProcedureQuery(“deleteLane”);
query.setParameter(“V_LANE_ID”, laneId);
query.execute();
Eso sí como ven necesitan el EntityManager.  Pero en proyectos con Spring Boot es muy sencillo basta un @PersistenceContext private EntityManager em y eso es todo.



Y bueno eso es todo, se volvió a probar, desplegar en UAT y está funcionando muy bien.
Enjoy!





Comentarios

  1. José, gracias por compartir tus conocimientos a través de tu blog, un consejo quizá podría compartir un link de descarga en cada entrada, que contenga el código fuente ya que muchas veces uno se suele perder un poco y a veces hay problemas con la configuración y versiones. Muy buen blog, lo compartiré

    ResponderEliminar
    Respuestas
    1. Tienes mucha razón , voy a seguir tus recomendaciones, post publicado y si involucra código lo tendré listo y publicado en github.com/joedayz.

      Eliminar

Publicar un comentario