Monitoreo de aplicaciones Java: métricas y alertas de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué el monitoreo de aplicaciones Java es fundamental

\n

Una aplicación Java moderna es un sistema distribuido complejo. Sin monitoreo, trabajas a ciegas: una caída en la velocidad de respuesta, una fuga de memoria o un OutOfMemoryError repentino pueden pasar desapercibidos hasta la queja de un usuario. Un monitoreo de métricas y alertas bien configurado no solo permite reaccionar rápidamente a los incidentes, sino también predecir cuellos de botella antes de que se vuelvan críticos.

\n

En este artículo, analizaremos el ciclo completo: desde la recopilación de métricas básicas de la JVM hasta la configuración de alertas en Prometheus y la visualización en Grafana. Todos los ejemplos de código están escritos en Java utilizando la popular biblioteca Micrometer.

\n\n

1. Métricas clave de una aplicación Java

\n

El monitoreo comienza con la selección de las métricas correctas. Se pueden dividir en tres grupos: métricas de la JVM, métricas de negocio y métricas de infraestructura.

\n\n

1.1. Métricas de la JVM

\n

Estas métricas muestran el estado de la máquina virtual de Java. Las más importantes son:

\n
    \n
  • Heap memory usage — uso del heap (memoria utilizada / máxima). Un aumento brusco puede indicar una fuga.
  • \n
  • GC pauses — frecuencia y duración de las recolecciones de basura. Pausas largas (más de 1 segundo) son señal de problemas.
  • \n
  • Thread states — cantidad de hilos en estados RUNNABLE, BLOCKED, WAITING. Muchos BLOCKED indican posible bloqueo.
  • \n
  • CPU usage — carga de la CPU por el proceso de la JVM.
  • \n
\n\n

1.2. Métricas de negocio

\n

Reflejan la lógica de tu aplicación. Ejemplos:

\n
    \n
  • Cantidad de pedidos procesados por minuto.
  • \n
  • Tiempo de respuesta de una API externa.
  • \n
  • Cantidad de errores de validación.
  • \n
\n\n

1.3. Métricas de infraestructura

\n
    \n
  • Uso de disco, red y memoria del host.
  • \n
  • Estado de las conexiones a la base de datos (pool de conexiones).
  • \n
  • Retrasos en colas de mensajes (Kafka, RabbitMQ).
  • \n
\n\n

2. Herramientas para la recopilación de métricas: Micrometer + Prometheus

\n

Para aplicaciones Java, el estándar de facto es la biblioteca Micrometer. Proporciona una fachada para varios sistemas de monitoreo (Prometheus, Datadog, Graphite). En combinación con Prometheus (almacenamiento de métricas) y Grafana (visualización), obtienes un ecosistema potente y gratuito.

\n\n

2.1. Integración de Micrometer en Spring Boot

\n

Si usas Spring Boot 2.x o 3.x, agrega la dependencia en pom.xml:

\n
<dependency>\n    <groupId>io.micrometer</groupId>\n    <artifactId>micrometer-registry-prometheus</artifactId>\n</dependency>
\n

Después de esto, Spring Boot Actuator habilitará automáticamente el endpoint /actuator/prometheus, que entregará las métricas en formato Prometheus.

\n\n

2.2. Creación de una métrica personalizada

\n

Supongamos que quieres contar la cantidad de llamadas exitosas y fallidas a un método. Crea un contador:

\n
import io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Counter;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class OrderService {\n\n    private final Counter successCounter;\n    private final Counter errorCounter;\n\n    public OrderService(MeterRegistry registry) {\n        this.successCounter = Counter.builder("orders.success")\n                .description("Number of successful orders")\n                .register(registry);\n        this.errorCounter = Counter.builder("orders.error")\n                .description("Number of failed orders")\n                .register(registry);\n    }\n\n    public void processOrder(String orderId) {\n        try {\n            // lógica de procesamiento del pedido\n            successCounter.increment();\n        } catch (Exception e) {\n            errorCounter.increment();\n            throw e;\n        }\n    }\n}
\n

En Prometheus, la métrica aparecerá como orders_succ

Blogs

Book Recommendations