La aplicación Springboot arroja una excepción cuando el demonio de AWS X-ray no está en funcionamiento.
Estoy trabajando en la integración de Springboot y AWS X-Ray, como parte de esto, hemos empujado nuestro código y desplegado la aplicación Springboot y el demonio de X-Ray como un contenedor “sidecar” en la tarea ESC Fargate en el entorno de producción y todo funciona bien. Sin embargo, no necesitamos soporte de X-Ray para entornos más bajos como QA y STAGE, por lo que no estamos desplegando el demonio de X-Ray; debido a esto, el código existente no puede conectar con el demonio de X-Ray y arroja la siguiente excepción:
04:54:12.364 [pool-2-thread-1] ERROR com.amazonaws.xray.strategy.sampling.pollers.RulePoller – Se ha producido un error al sondear GetSamplingRules:
com.amazonaws.xray.internal.XrayClientException: No se pudo serializar y enviar la solicitud.
en com.amazonaws.xray.internal.UnsignedXrayClient.sendRequest (UnsignedXrayClient.java: 142) ~ [core-commons-qa2-1.0.0.jar! /: ?]
en com.amazonaws.xray.internal.UnsignedXrayClient.getSamplingRules (UnsignedXrayClient.java: 112) ~ [core-commons-qa2-1.0.0.jar! /: ?]
en com.amazonaws.xray.strategy.sampling.pollers.RulePoller.pollRule (RulePoller.java: 100) ~ [core-commons-qa2-1.0.0.jar! /: ?]
en com.amazonaws.xray.strategy.sampling.pollers.RulePoller.lambda $ start $ 0 (RulePoller.java: 72) ~ [core-commons-qa2-1.0.0.jar! /: ?]
en java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java: 515) [?:?]
en java.util.concurrent.FutureTask.runAndReset (FutureTask.java: 305) [?:?]
en java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java: 305) [?:?]
en java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java: 1128) [?:?]
en java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java: 628) [?:?]
en java.lang.Thread.run (Thread.java: 829) [?:?]
Causado por: java.net.ConnectException: conexión rechazada (conexión rechazada)
en java.net.PlainSocketImpl.socketConnect (Nativo Método) ~ [?:?]
en java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java: 399) ~ [?:?]
en java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketImpl.java: 242) ~ [?:?]
en java.net.AbstractPlainSocketImpl.connect (AbstractPlainSocketImpl.java: 224) ~ [?:?]
en java.net.Socket.connect (Socket.java: 609) ~ [?:?]
¿Cómo manejamos este tipo de escenario donde podemos ejecutar con éxito la misma base de código en entornos más bajos sin eliminar el código X-Ray SDK? ¿Existe alguna configuración para comprobar e instrumentar solo si se está ejecutando el demonio de X-Ray? Por favor, ilumínenos sobre ello.
davy.ai
Una forma de manejar este escenario es habilitar condicionalmente el código de X-Ray SDK basado en el entorno. En la aplicación de Spring Boot, esto se puede lograr utilizando perfiles.
Primero, cree un perfil para el entorno de producción que incluya la configuración de X-Ray SDK. En el archivo
application.properties
para el perfil de producción, agregue las siguientes propiedades:Luego, en el código de la aplicación, anote las clases y métodos que desea instrumentar con
@XRayEnabled
. Por ejemplo:A continuación, cree un perfil
qa
ystage
que excluya la configuración de X-Ray SDK. En los archivosapplication-qa.properties
yapplication-stage.properties
, agregue las siguientes propiedades:Tenga en cuenta que
aws.xray.contextMissingStrategy
está configurado enLOG_ERROR
, lo que significa que si X-Ray no está disponible, la aplicación registrará un mensaje de error y continuará.Finalmente, al implementar la aplicación en el entorno
qa
ostage
, active el perfil utilizando la opción de línea de comandos-Dspring.profiles.active
:De esta manera, el código de X-Ray SDK solo se habilitará cuando se ejecute en producción con el perfil correspondiente activado. En los entornos inferiores, el código se ejecutará sin X-Ray SDK sin que se produzcan excepciones.