Monitoramento Avançado de Aplicações Java: Métricas e Alertas
\n\nNo desenvolvimento moderno de software, o monitoramento de aplicações Java deixou de ser uma opção — é uma necessidade. A coleta básica de métricas (CPU, memória) já não evita incidentes em sistemas distribuídos complexos. Em um nível avançado, é necessária uma observabilidade profunda: compreensão do estado interno da aplicação, identificação de gargalos e análise preditiva. Neste artigo, vamos abordar como organizar o monitoramento profissional de aplicações Java usando métricas e alertas, com ferramentas modernas e melhores práticas.
\n\n1. Coleta Avançada de Métricas em Java: Micrometer e Prometheus
\n\nA biblioteca Micrometer é o padrão de facto para coleta de métricas em Spring Boot e outros frameworks Java. Ela fornece uma API unificada que pode exportar métricas para vários sistemas de monitoramento (Prometheus, Datadog, New Relic). Para monitoramento avançado, usaremos a combinação Micrometer + Prometheus.
\n\nPor que este é um nível avançado? Em vez de simplesmente coletar requisições HTTP, configuraremos métricas personalizadas: histogramas de tempo de execução da lógica de negócio, contadores de erros com tags, temporizadores para operações assíncronas.
\n\nExemplo de configuração do Micrometer no Spring Boot:
\n\n// Dependência no pom.xml\n<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-prometheus</artifactId>\n</dependency>\n\n// application.yml\nmanagement:\n endpoints:\n web:\n exposure:\n include: "health,prometheus"\n metrics:\n export:\n prometheus:\n enabled: true\n\n\nAgora, adicionaremos uma métrica personalizada — um histograma do tempo de execução do método:
\n\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Timer;\nimport org.springframework.stereotype.Service;\n\nimport java.util.concurrent.TimeUnit;\n\n@Service\npublic class OrderService {\n\n private final Timer orderProcessingTimer;\n\n public OrderService(MeterRegistry registry) {\n this.orderProcessingTimer = Timer.builder("order.processing.time")\n .description("Time taken to process an order")\n .publishPercentiles(0.5, 0.95, 0.99) // p50, p95, p99\n .register(registry);\n }\n\n public void processOrder(String orderId) {\n Timer.Sample sample = Timer.start();\n try {\n // Lógica de processamento do pedido\n Thread.sleep(200); // Simulação de trabalho\n } catch (InterruptedException e) {\n Thread.currentThread().interrupt();\n } finally {\n sample.stop(orderProcessingTimer);\n }\n }\n}\n\n\nEssa métrica mostrará não apenas o tempo médio, mas percentis, o que é crítico para identificar requisições "lentas" (tail latency).
\n\n2. Configuração de Alertas Avançados: Alertmanager e Regras
\n\nA coleta de métricas é inútil sem um sistema de notificações. O Prometheus Alertmanager permite configurar regras de alerta complexas com agrupamento, supressão e roteamento de notificações (Slack, PagerDuty, Email).
\n\nAbordagem avançada: em vez de um simples "CPU > 90%", usamos alertas preditivos e agregação por serviços.
\n\nExemplo de regra de alerta para uma aplicação Java (arquivo rules.yml):
groups:\n - name: java_app_alerts\n rules:\n # Alerta para alta taxa de erros 5xx\n - alert: HighErrorRate\n expr: |\n rate(http_requests_total{status=~"5.."}[5m])\n /\n rate(http_requests_total[5m]) > 0.05\n for: 2m\n labels:\n severity: critical\n annotations:\n summary: "High HTTP 5xx error rate ({{ $value | humanizePercentage }})"\n description: "Error rate for {{ $labels.instance }} is above 5% for 2