Surveillance des applications Java : métriques et alertes de niveau avancé
Dans le développement moderne, la surveillance des applications Java a cessé d'être une option — c'est une nécessité. Cependant, la collecte de base des métriques (CPU, mémoire, nombre de requêtes) ne permet souvent pas de détecter à temps une dégradation des performances ou des erreurs cachées. Au niveau avancé, il ne suffit pas de collecter des données, il faut aussi configurer des alertes intelligentes qui réagissent aux anomalies, et non à des seuils statiques.
Dans cet article, nous analyserons l'architecture de la surveillance avancée pour Java : de la collecte de métriques avec Micrometer à la configuration d'alertes dans Prometheus et à la visualisation dans Grafana. Le contenu est destiné aux développeurs déjà familiarisés avec les bases de la surveillance.
1. Collecte avancée de métriques avec Micrometer
Micrometer est une façade pour les métriques qui s'intègre avec la plupart des systèmes (Prometheus, Datadog, New Relic). Au niveau avancé, il est important non seulement d'ajouter la bibliothèque, mais aussi de concevoir correctement des métriques personnalisées.
Composants clés :
- MeterRegistry — le référentiel central des métriques. Pour Prometheus, utilisez
PrometheusMeterRegistry. - Counter — un compteur (par exemple, le nombre d'erreurs).
- Timer — mesure du temps d'exécution.
- Gauge — la valeur actuelle (par exemple, la taille de la file d'attente).
- DistributionSummary — distribution des valeurs (pour les percentiles).
Exemple de Timer personnalisé avec des 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("Temps de traitement du paiement") .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 { // logique métier Thread.sleep((long) (Math.random() * 100)); } catch (Exception e) { // métrique d'erreur } finally { sample.stop(paymentTimer); } }}Conseils pour la collecte avancée :
- Utilisez des tags pour le filtrage :
endpoint,status,region. - Évitez la cardinalité élevée des tags (par exemple, n'ajoutez pas userId).
- Pour les métriques métier, utilisez Counter avec incrémentation à chaque événement.
- Configurez DistributionSummary pour la taille des réponses ou les latences.
2. Intégration avec Prometheus et configuration des alertes
Prometheus est un système de collecte et d'alerting qui utilise un modèle pull. Pour les applications Java, il suffit d'ajouter un endpoint /actuator/prometheus (via Spring Boot Actuator + Micrometer).
Configuration dans application.yml :
management: endpoints: web: exposure: include: prometheus, health metrics: export: prometheus: enabled: true tags: application: my-java-app environment: productionAlertes avancées dans Prometheus (rules.yml) :
Les alertes statiques (par exemple, CPU > 90%) sont bonnes, mais génèrent souvent de fausses alertes. Utilisez des seuils dynamiques et des anomalies.
groups: - name: java_app_advanced rules:\