Introducción: por qué el monitoreo de aplicaciones Java es fundamental
\nUna 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.
\nEn 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\n1. Métricas clave de una aplicación Java
\nEl 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\n1.1. Métricas de la JVM
\nEstas 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
1.2. Métricas de negocio
\nReflejan 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
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
2. Herramientas para la recopilación de métricas: Micrometer + Prometheus
\nPara 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\n2.1. Integración de Micrometer en Spring Boot
\nSi usas Spring Boot 2.x o 3.x, agrega la dependencia en pom.xml:
<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-prometheus</artifactId>\n</dependency>\nDespués de esto, Spring Boot Actuator habilitará automáticamente el endpoint /actuator/prometheus, que entregará las métricas en formato Prometheus.
2.2. Creación de una métrica personalizada
\nSupongamos que quieres contar la cantidad de llamadas exitosas y fallidas a un método. Crea un contador:
\nimport 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}\nEn Prometheus, la métrica aparecerá como orders_succ