Monitoreo con actuador Spring Boot

    Visi贸n general

    En este art铆culo, analizaremos Actuador de arranque de resorte, que proporciona puntos finales integrados listos para la producci贸n que se pueden usar para monitorear y controlar su aplicaci贸n.

    Las aplicaciones de monitoreo pueden incluir algo tan simple como conocer el estado y la informaci贸n de algunos datos complejos, como comprender el tr谩fico y las m茅tricas para nuestra aplicaci贸n. Por ejemplo, cu谩ntos recursos (CPU, RAM, etc.) est谩 utilizando la aplicaci贸n.

    Puede optar por interactuar con actuadores con puntos finales HTTP o con beans JMX. En este tutorial, estar铆amos usando los puntos finales HTTP.

    En Spring Boot 1, el actuador solo se pod铆a usar con Spring MVC. Pero con Spring Boot 2 y la introducci贸n de WebFlux, su soporte se ha ampliado y tambi茅n se puede utilizar con el Jersey framework sin la necesidad de Spring MVC en el classpath.

    Actuador de arranque de resorte

    Para demostrar el funcionamiento del actuador, utilizaremos un servicio simple basado en Spring REST, que se ejecuta en el puerto predeterminado (8080) con un 煤nico punto final de /hello que devuelve un mensaje de cadena.

    Para agregar actuador, simplemente agregamos la dependencia a nuestro pom.xml archivo:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>${VERSION}</version>
    </dependency>
    

    Todos los puntos finales caen bajo un prefijo com煤n de /actuator. Para comprobarlo, naveguemos por nuestro navegador hasta http://localhost:8080/actuator:

    Nota: En Spring Boot 1, todos los puntos finales del actuador estaban en la ruta base ra铆z, es decir /, pero en Spring Boot 2, todos ellos est谩n agrupados por defecto en /actuator.

    Puede cambiar la ruta base de los puntos finales del actuador agregando las siguientes propiedades en el application.properties:

    management.endpoints.web.base-path=/admin
    management.server.port=8090
    

    Ahora, todos los puntos finales del actuador estar谩n bajo el /admin prefijo, lo cual tiene sentido ya que solo un administrador debe tener acceso a m茅tricas como estas. Para este tutorial, lo dejaremos bajo el valor predeterminado /actuator.

    De forma predeterminada, los puntos finales de administraci贸n est谩n disponibles en el mismo puerto que el de su aplicaci贸n, pero puede optar por exponerlos en un puerto HTTP diferente configurando el management.server.port a un puerto HTTP de su elecci贸n.

    No lo cambiaremos, ya que es preferible el comportamiento predeterminado, especialmente si est谩 ejecutando en la nube.

    Puntos finales del actuador

    Se puede ver una lista completa de los puntos finales disponibles en el documentaci贸n oficial. Es posible que haya notado que, aunque hay muchos puntos finales disponibles, el resultado de http://localhost:8080/actuator solo muestra /health y /info.

    Dado que los puntos finales del actuador contienen informaci贸n confidencial, hemos tenido que exponer expl铆citamente cada uno de ellos; de lo contrario, solo podremos ver informaci贸n rudimentaria que ya es evidente.

    Navegue nuestro navegador a http://localhost:8080/actuator/health:

    Ahora, revisemos el /info de manera similar y notar谩 que devuelve una respuesta vac铆a.

    Esto se debe a que no hemos proporcionado ninguna informaci贸n al respecto a Spring. Esto se puede hacer agregando propiedades al info prefijo en el application.properties:

    info.name= Test Spring Service
    info.more.detail= This is a demo for Spring Actuator
    

    Puede estructurar la clave JSON seg煤n sus necesidades.

    Exponer puntos finales

    Para exponer los puntos finales, Spring proporciona 2 propiedades que podemos usar individualmente o en combinaci贸n:

    • management.endpoints.web.exposure.exclude: Se utiliza para excluir una lista de puntos finales que no queremos exponer. El valor predeterminado est谩 vac铆o.
    • management.endpoints.web.exposure.include: Se utiliza para incluir una lista de puntos finales que queremos exponer. El valor predeterminado es info, health. Es por eso que ambos puntos finales estaban disponibles de forma predeterminada.

    Nota: exclude tiene prioridad sobre include

    Entonces, modifiquemos la configuraci贸n para que queramos exponer todos los puntos finales excepto info y health:

    management.endpoints.web.exposure.include=*
    management.endpoints.web.exposure.exclude=info,health
    

    Nota: Si est谩 utilizando un archivo de propiedades basado en YAML, * tiene un significado especial y solo se puede usar con comillas:

    management:
      endpoints:
        web:
          exposure:
            exclude: "*"
    

    Para este tutorial, expondremos todos los puntos finales de nuestro actuador. As铆 que agreguemos el siguiente punto final en nuestro application.properties:

    management.endpoints.web.exposure.include= *
    

    Ahora, revisemos el punto final del actuador nuevamente abriendo http://localhost:8080/actuator:

    Habilitaci贸n de terminales

    Adem谩s de exponer los puntos finales, tambi茅n podemos habilitarlos y deshabilitarlos. Mientras que exponer solo regula si podemos verlos o no, habilitar regula si existen como un bean en el contexto de Spring.

    De forma predeterminada, todos los puntos finales est谩n habilitados excepto uno, el shutdown punto final. Puede habilitar / deshabilitar cada punto final configurando el management.endpoint.<id>.enabled propiedad:

    management.endpoint.shutdown.enabled=true
    management.endpoint.beans.enabled=false
    

    Tambi茅n puede deshabilitar todos los puntos finales configurando management.endpoints.enabled-by-default a false y luego habilite individualmente las propiedades que desee. Para este tutorial, ir铆amos con la configuraci贸n predeterminada.

    Nota: La desactivaci贸n de los puntos finales los eliminar谩 como beans del contexto por completo y no importar铆a si los ha expuesto.

    Soporte de cach茅

    Todos los puntos finales (que son operaciones READ y no toman ning煤n par谩metro) tambi茅n tienen soporte b谩sico de almacenamiento en cach茅.

    Cada punto final tiene una propiedad de cache.time-to-live que se genera autom谩ticamente para usted, que puede usarse para especificar el tiempo de cach茅:

    management.endpoint.beans.cache.time-to-live=10s
    

    Asegurar los puntos finales del actuador

    A estas alturas, habr铆a quedado claro que estos puntos finales almacenan informaci贸n confidencial sobre nuestra aplicaci贸n y ser铆a una buena idea protegerlos.

    Para hacerlo, simplemente podemos agregar seguridad de Spring a nuestra aplicaci贸n agregando el spring-boot-starter-security dependencia en nuestra pom.xml:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <version>${VERSION}</version>
    </dependency>
    

    De forma predeterminada, con solo importarlo, todos los puntos finales de nuestra aplicaci贸n estar谩n protegidos.

    Pero supongamos que queremos nuestro /health punto final disponible para todos, pero el resto de ellos para ser seguro. Esto garantiza un filtro personalizado para permitir que ciertos usuarios pasen y retener a otros.

    Para eso tenemos que agregar un @Configuration clase que extiende el WebSecurityConfigurerAdapter, como con cualquier otra aplicaci贸n Spring Boot que queramos proteger con Spring Security.

    Entonces necesitamos anular el .configure() m茅todo donde definimos la configuraci贸n de seguridad para nuestra aplicaci贸n:

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                .authorizeRequests()
                .requestMatchers(EndpointRequest.to(HealthEndpoint.class)).permitAll()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).authenticated()
                .and()
                .httpBasic();
        }
    }
    

    El c贸digo anterior se explica por s铆 mismo, donde permitimos cualquier HealthEndpoint para estar disponible p煤blicamente, mientras que otros requieren cierta autenticaci贸n b谩sica. Adem谩s, tenga en cuenta que EndpointRequest.to() es un m茅todo conveniente que se encarga autom谩ticamente de la URL final de los puntos finales de su actuador porque es posible que haya cambiado la ruta base de la misma en su aplicaci贸n.

    Reiniciemos nuevamente y revisemos los registros:

    Debido a que Spring Security est谩 en la ruta de clases, crea autom谩ticamente un nombre de usuario de user y una contrase帽a que se genera aleatoriamente al inicio de la aplicaci贸n, como se muestra en los registros.

    Vamos a comprobar el /health endpoint y ver谩 la salida sin ning煤n cuadro de autenticaci贸n. Ahora intentemos cualquier otro punto final, digamos /env y se le pedir谩 que se autentique:

    Ingrese el nombre de usuario y la contrase帽a y podr谩 ver la respuesta adecuada:

    Si desea definir su propio nombre de usuario y contrase帽a, puede hacerlo f谩cilmente a trav茅s del application.properties:

    spring.security.user.name=user
    spring.security.user.password=password
    

    Crear puntos finales personalizados

    Esto se puede lograr agregando el @Endpoint y @Component anotaci贸n a tu clase. Despu茅s de eso, puede crear m茅todos y anotarlos con @ReadOperation, @WriteOperationo @DeleteOperation en consecuencia. Por supuesto, puede tener varios m茅todos con diferentes operaciones.

    La idea de tener m煤ltiples operaciones es mapear a diferentes m茅todos de solicitud HTTP:

    • @ReadOperation se asigna a HTTP GET
    • @WriteOperation se asigna a HTTP POST
    • @DeleteOperation se asigna a HTTP DELETE

    Creemos un punto final personalizado simple:

    @Component
    @Endpoint(id = "details")
    public class DetailsEndpoint {
    
        @ReadOperation
        public String details() {
            return "My App Details";
        }
    }
    

    Reinicie la aplicaci贸n y navegue hasta su navegador para http://localhost:8080/actuator/details:

    Conclusi贸n

    Las aplicaciones de monitoreo pueden incluir algo tan simple como conocer el estado y la informaci贸n de algunos datos complejos, como comprender el tr谩fico y las m茅tricas para nuestra aplicaci贸n. Por ejemplo, cu谩ntos recursos (CPU, RAM, etc.) est谩 utilizando la aplicaci贸n.

    Spring Boot Actuator proporciona puntos finales integrados listos para la producci贸n que se pueden usar para monitorear y controlar su aplicaci贸n, como /info, /health, /scheduledTasksetc.

    Tambi茅n podemos definir nuestros propios puntos finales para cumplir con ciertos requisitos simplemente anotando clases con el @Endpoint anotaci贸n.

    Como siempre, el c贸digo de los ejemplos utilizados en este art铆culo se puede encontrar en GitHub.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *