Monitoramento de aplicações Java: métricas e alertas em nível avançado
No desenvolvimento moderno, o monitoramento de aplicações Java deixou de ser uma opção — é uma necessidade. No entanto, a coleta básica de métricas (CPU, memória, número de requisições) muitas vezes não permite detectar a tempo a degradação de desempenho ou erros ocultos. Em nível avançado, é necessário não apenas coletar dados, mas também configurar alertas inteligentes que reajam a anomalias, e não a limites estáticos.
Neste artigo, abordaremos a arquitetura de monitoramento avançado para Java: desde a coleta de métricas com Micrometer até a configuração de alertas no Prometheus e visualização no Grafana. O material é voltado para desenvolvedores já familiarizados com os fundamentos do monitoramento.
1. Coleta avançada de métricas com Micrometer
Micrometer é um facade para métricas que se integra com a maioria dos sistemas (Prometheus, Datadog, New Relic). Em nível avançado, é importante não apenas conectar a biblioteca, mas projetar corretamente métricas personalizadas.
Componentes-chave:
- MeterRegistry — repositório central de métricas. Para Prometheus, use
PrometheusMeterRegistry. - Counter — contador (por exemplo, número de erros).
- Timer — medição do tempo de execução.
- Gauge — valor atual (por exemplo, tamanho da fila).
- DistributionSummary — distribuição de valores (para percentis).
Exemplo de Timer personalizado com tags:
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("Tempo de processamento do pagamento") .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 negócio Thread.sleep((long) (Math.random() * 100)); } catch (Exception e) { // métrica de erro } finally { sample.stop(paymentTimer); } }}Dicas para coleta avançada:
- Use tags para filtragem:
endpoint,status,region. - Evite alta cardinalidade de tags (por exemplo, não adicione userId).
- Para métricas de negócio, use Counter com incremento a cada evento.
- Configure DistributionSummary para tamanho de respostas ou latências.
2. Integração com Prometheus e configuração de alertas
Prometheus é um sistema de coleta e alerting que usa o modelo pull. Para aplicações Java, basta adicionar o endpoint /actuator/prometheus (via Spring Boot Actuator + Micrometer).
Configuração em application.yml:
management: endpoints: web: exposure: include: prometheus, health metrics: export: prometheus: enabled: true tags: application: my-java-app environment: productionAlertas avançados no Prometheus (rules.yml):
Alertas estáticos (por exemplo, CPU > 90%) são bons, mas frequentemente geram falsos positivos. Use limites dinâmicos e anomalias.
groups: - name: java_app_advanced rules:\