Monitoreo de aplicaciones Java: métricas y alertas a nivel avanzado
En el desarrollo moderno, el monitoreo de aplicaciones Java ha dejado de ser una opción para convertirse en una necesidad. Sin embargo, la recopilación básica de métricas (CPU, memoria, cantidad de solicitudes) a menudo no permite detectar a tiempo la degradación del rendimiento o errores ocultos. A nivel avanzado, no solo se requiere recopilar datos, sino también configurar alertas inteligentes que reaccionen a anomalías, no a umbrales estáticos.
En este artículo, analizaremos la arquitectura del monitoreo avanzado para Java: desde la recopilación de métricas con Micrometer hasta la configuración de alertas en Prometheus y la visualización en Grafana. El material está dirigido a desarrolladores que ya están familiarizados con los conceptos básicos del monitoreo.
1. Recopilación avanzada de métricas con Micrometer
Micrometer es una fachada para métricas que se integra con la mayoría de los sistemas (Prometheus, Datadog, New Relic). A nivel avanzado, es importante no solo conectar la biblioteca, sino diseñar correctamente métricas personalizadas.
Componentes clave:
- MeterRegistry — almacén central de métricas. Para Prometheus, usamos
PrometheusMeterRegistry. - Counter — contador (por ejemplo, número de errores).
- Timer — medición del tiempo de ejecución.
- Gauge — valor actual (por ejemplo, tamaño de la cola).
- DistributionSummary — distribución de valores (para percentiles).
Ejemplo de Timer personalizado con etiquetas:
import io.micrometer.core.instrument.MeterRegistry;import io.micrometer.core.instrument.Timer;import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Servicepublic class PaymentService {
private final Timer paymentTimer;
public PaymentService(MeterRegistry registry) { this.paymentTimer = Timer.builder("payment.processing.time") .description("Tiempo de procesamiento del pago") .publishPercentiles(0.5, 0.95, 0.99) // P50, P95, P99 .publishPercentileHistogram() .register(registry); }
public void processPayment(String userId, double amount) { Timer.Sample sample = Timer.start(); try { // lógica de negocio Thread.sleep((long) (Math.random() * 100)); } catch (Exception e) { // métrica de error } finally { sample.stop(paymentTimer); } }}Consejos para la recopilación avanzada:
- Use etiquetas (tags) para filtrar:
endpoint,status,region. - Evite la cardinalidad alta de etiquetas (por ejemplo, no agregue userId).
- Para métricas de negocio, use Counter con incremento en cada evento.
- Configure DistributionSummary para el tamaño de respuestas o latencias.
2. Integración con Prometheus y configuración de alertas
Prometheus es un sistema de recopilación y alertas que utiliza un modelo pull. Para aplicaciones Java, basta con agregar el endpoint /actuator/prometheus (a través de Spring Boot Actuator + Micrometer).
Configuración en application.yml:
management: endpoints: web: exposure: include: prometheus, health metrics: export: prometheus: enabled: true tags: application: my-java-app environment: productionAlertas avanzadas en Prometheus (rules.yml):
Las alertas estáticas (por ejemplo, CPU > 90%) son buenas, pero a menudo generan falsos positivos. Use umbrales dinámicos y anomalías.
groups: - name: java_app_advanced rules:\