Guía Completa para el Monitoreo de Aplicaciones con Spring Boot Actuator

Spring Boot Actuatro es un subproyecto esencial que proporciona capacidades de monitoreo y gestión listas para producción. Al integrar esta biblioteca, los desarrolladores pueden inspeccionar el estado de sus aplicaciones, recolectar métricas y comprender el tráfico o el estado de las bases de datos sin necesidad de implementar estas funciones desde cero.

Esta herramienta expone información operativa a través de puntos de enlace (endpoints) HTTP o JMX. Una vez que se añade al proyecto, varios endpoints quedan disponibles de inmediato para su configuración o extensión.

Configuración Inicial

Para habilitar Actuator en un proyecto Spring Boot, es necesario incluir la dependencia correspondiente en el gestor de paquetes. En el caso de Maven, se añade el siguiente bloque al archivo pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Spring Boot Actuator en la Versión 1.x

En la rama 1.x de Spring Boot, Actuator seguía un modelo de lectura y escritura basado principalmente en Spring MVC para la exposición de datos a través de HTTP.

Endpoints Comunes

La mayoría de los endpoints en esta versión estaban protegidos por defecto, requiriendo configuración adicional para mostrar detalles sensibles. Algunos de los más utilizados son:

  • /health: Muestra el estado de salud de la aplicación.
  • /info: Presenta información general definida por el desarrollador.
  • /metrics: Expone datos sobre el consumo de memoria, hilos y peticiones HTTP.
  • /trace: Muestra un historial de las últimas solicitudes HTTP.

Personalización del Indicador de Salud

Es posible crear indicadores de salud personalizados implementando la interfaz HealthIndicator. Esto permite agregar validaciones específicas del negocio al endpoint /health.

@Component
public class MonitorServicioExterno implements HealthIndicator {
  
    @Override
    public Health health() {
        long latencia = verificarConexion();
        if (latencia > 500) {
            return Health.down()
              .withDetail("Latencia Alta", latencia).build();
        }
        return Health.up().withDetail("Latencia OK", latencia).build();
    }
     
    private long verificarConexion() {
        // Lógica de validación
        return 100L;
    }
}

Métricas Personalizadas en 1.x

Para registrar eventos específicos, como intentos de autanticación, se utilizaba el servicio CounterService:

@Service
public class GestionAcceso {
 
    private final CounterService contador;
     
    public GestionAcceso(CounterService contador) {
        this.contador = contador;
    }
     
    public void autenticar(String usuario) {
        if ("root".equals(usuario)) {
            contador.increment("auth.exito");
        } else {
            contador.increment("auth.error");
        }
    }
}

Evolución en Spring Boot 2.x

Con el lanzamiento de Spring Boot 2.0, Actuator fue rediseñado para ser independiente de la tecnología subyacente, permitiendo su uso tanto en aplicaciones basadas en Servlet (MVC) como en modelos reactivos (WebFlux). Además, adoptó un modelo CRUD (Create, Read, Update, Delete) para sus operaciones.

Cambios en Seguridad y Acceso

A diferencia de la versión anterior, en 2.x casi todos los endpoints están deshabilitados por defecto, excepto /health e /info. Además, ahora se encuentran agrupados bajo la ruta base /actuator.

Para exponer todos los endpoints, se debe configurar la propiedad en application.properties:

management.endpoints.web.exposure.include=*

Gestión de Métricas con Micrometer

Spring Boot 2 sustituyó su sistema interno de métricas por Micrometer. Este cambio transformó la estructura del endpoint /metrics, que ahora funciona como un catálogo de nombres. Para consultar una métrica específica, se debe acceder a /actuator/metrics/{nombre.metrica}.

Creación de Endpoints Personalizados en 2.x

El nuevo modelo utiliza anotaciones para definir la tecnología de acceso de forma agnóstica. Aquí un ejemplo de un endpoint para gestionar banderas de características (feature toggles):

@Component
@Endpoint(id = "interruptores")
public class FeatureToggleEndpoint {
 
    private Map<String, Boolean> estados = new ConcurrentHashMap<>();
 
    @ReadOperation
    public Map<String, Boolean> obtenerTodos() {
        return estados;
    }
 
    @WriteOperation
    public void actualizarEstado(@Selector String nombre, boolean habilitado) {
        estados.put(nombre, habilitado);
    }
 
    @DeleteOperation
    public void eliminarInterruptor(@Selector String nombre) {
        estados.remove(nombre);
    }
}

Extensión de Endpoints Existentes

En ocasiones es necesario modificar el comportamiento de un endpoint nativo. Mediante @EndpointWebExtension, podemos interceptar y personalizar la respuesta de endpoints como /info para, por ejemplo, cambiar el código de estado HTTP basándonos en condiciones internas.

@Component
@EndpointWebExtension(endpoint = InfoEndpoint.class)
public class ExtensionInfoWeb {
 
    private final InfoEndpoint delegado;

    public ExtensionInfoWeb(InfoEndpoint delegado) {
        this.delegado = delegado;
    }
 
    @ReadOperation
    public WebEndpointResponse<Map> info() {
        Map<String, Object> datos = this.delegado.info();
        int codigoEstado = datos.containsKey("alerta") ? 503 : 200;
        return new WebEndpointResponse<>(datos, codigoEstado);
    }
}

Resumen de Configuración de Visibilidad

Para controlar qué información es visible y qué endpoints están activos, se utilizan las siguientes propiedades en el entorno de Spring Boot 2.x:

  • management.endpoint.health.show-details=always: Muestra detalles completos de salud (disco, DB, etc.).
  • management.endpoint.shutdown.enabled=true: Permite apagar la aplicación de forma remota (deshabilitado por seguridad por defecto).
  • management.endpoints.web.base-path=/gestion: Cambia la ruta raíz de los endpoints de Actuator.

Etiquetas: Spring Boot Spring Boot Actuator Micrometer java Microservices

Publicado el 7-25 10:47