Nous construisons un exportateur Prometheus personnalisé en utilisant Quarkus Jakarta, en nous concentrant sur l'évitement de la haute cardinalité et en assurant des métriques efficaces. Préparez-vous pour un peu de magie métrique !

Pourquoi des exportateurs personnalisés ? Ne réinventons-nous pas la roue ?

Avant de plonger dans le vif du sujet, abordons la question évidente : pourquoi s'embêter avec un exportateur personnalisé alors qu'il existe de nombreuses solutions prêtes à l'emploi ?

  • Métriques sur mesure : Votre application est unique, et parfois vous avez besoin de métriques qui ne sont pas disponibles par défaut.
  • Optimisation des performances : Les exportateurs personnalisés vous permettent d'affiner ce que vous mesurez, réduisant potentiellement la surcharge.
  • Éviter l'explosion des métriques : Avec un grand pouvoir vient une grande responsabilité – et la capacité d'éviter les pièges de la haute cardinalité.

Mise en place du projet Quarkus Jakarta

Tout d'abord, lançons notre projet Quarkus. Si vous êtes nouveau sur Quarkus, pensez-y comme à la version super-héros de Jakarta EE – plus rapide qu'une balle et plus puissant qu'une locomotive.

Créez un nouveau projet Quarkus en utilisant la commande Maven suivante :

mvn io.quarkus:quarkus-maven-plugin:2.16.5.Final:create \
    -DprojectGroupId=com.example \
    -DprojectArtifactId=custom-prometheus-exporter \
    -DclassName="com.example.ExporterResource" \
    -Dpath="/exporter"

Ajoutons maintenant les dépendances nécessaires à notre pom.xml :

<dependencies>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-micrometer-registry-prometheus</artifactId>
    </dependency>
</dependencies>

Le cœur du sujet : Construire l'exportateur

Maintenant que notre projet est configuré, créons notre exportateur personnalisé. Nous nous concentrerons sur un scénario hypothétique où nous surveillons un système de commerce électronique complexe.

package com.example;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

import java.util.Random;

@Path("/exporter")
public class ExporterResource {

    @Inject
    MeterRegistry registry;

    private final Random random = new Random();

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        // Simuler quelques métriques
        recordOrderMetrics();
        recordUserMetrics();
        return "Métriques mises à jour !";
    }

    private void recordOrderMetrics() {
        // Au lieu d'enregistrer des métriques par produit (haute cardinalité),
        // nous enregistrerons des métriques agrégées par catégorie
        String[] categories = {"Électronique", "Vêtements", "Livres", "Maison"};
        for (String category : categories) {
            double orderValue = 100 + random.nextDouble() * 900; // Valeur de commande aléatoire entre 100 et 1000
            registry.gauge("ecommerce.order.value", Tags.of("category", category), orderValue);
        }
    }

    private void recordUserMetrics() {
        // Au lieu d'enregistrer des métriques par utilisateur, nous utiliserons des groupes
        int activeUsers = 1000 + random.nextInt(9000); // Nombre aléatoire entre 1000 et 10000
        String userBucket = activeUsers < 5000 ? "faible" : "élevé";
        registry.gauge("ecommerce.active.users", Tags.of("load", userBucket), activeUsers);
    }
}

Éviter le piège de la haute cardinalité

La haute cardinalité est le cauchemar des configurations Prometheus. C'est comme inviter toute votre ville à une fête chez vous – les choses risquent de devenir incontrôlables. Voici comment nous l'évitons :

  • Catégorisation : Au lieu de suivre les métriques pour chaque produit individuel (ce qui pourrait être des milliers), nous les regroupons en catégories.
  • Regroupement : Pour les métriques utilisateur, nous utilisons un simple groupe "faible" ou "élevé" au lieu de suivre chaque utilisateur individuellement.

Rappelez-vous, l'objectif est d'avoir suffisamment de détails pour être utile sans être submergé par les données.

Assurer des métriques efficaces

L'efficacité ne consiste pas seulement à éviter la haute cardinalité. Voici quelques autres conseils pour garder vos métriques légères et efficaces :

  1. Utilisez les étiquettes judicieusement : Les étiquettes sont puissantes mais peuvent rapidement conduire à une explosion des métriques si elles sont surutilisées.
  2. Agrégez lorsque c'est possible : Parfois, une somme ou une moyenne est plus utile que des points de données individuels.
  3. Choisissez les types de métriques appropriés : Les jauges, compteurs et histogrammes ont chacun leur place. Utilisez-les à bon escient.
  4. Définissez des politiques de rétention : Toutes les métriques n'ont pas besoin d'être conservées indéfiniment. Définissez des périodes de rétention appropriées dans Prometheus.

Tester votre exportateur

Avant de nous féliciter, assurons-nous que cela fonctionne réellement. Exécutez votre application Quarkus :

./mvnw quarkus:dev

Maintenant, accédez à l'endpoint pour générer quelques métriques :

curl http://localhost:8080/exporter

Enfin, consultez vos métriques à :

curl http://localhost:8080/q/metrics

Vous devriez voir quelque chose comme ceci :

# HELP ecommerce_order_value 
# TYPE ecommerce_order_value gauge
ecommerce_order_value{category="Électronique"} 543.21
ecommerce_order_value{category="Vêtements"} 321.54
ecommerce_order_value{category="Livres"} 123.45
ecommerce_order_value{category="Maison"} 987.65

# HELP ecommerce_active_users 
# TYPE ecommerce_active_users gauge
ecommerce_active_users{load="élevé"} 7523.0

La preuve est dans le pudding : Analyser vos métriques

Maintenant que notre exportateur est opérationnel, parlons de ce que nous pouvons faire avec ces métriques. Voici quelques requêtes Prometheus que vous pourriez trouver utiles :

# Valeur moyenne des commandes dans toutes les catégories
avg(ecommerce_order_value)

# Nombre total d'utilisateurs actifs
sum(ecommerce_active_users)

# Valeur de commande la plus élevée par catégorie
max(ecommerce_order_value) by (category)

Ces requêtes vous donnent un aperçu des informations que vous pouvez tirer de vos métriques soigneusement élaborées.

Conclusion : Leçons apprises

Construire un exportateur Prometheus personnalisé ne consiste pas seulement à assembler quelques métriques et à en rester là. C'est un art qui nécessite une réflexion attentive sur ce que vous mesurez et comment vous le mesurez. Voici les points clés à retenir :

  • Soyez toujours sur vos gardes contre la haute cardinalité. C'est le tueur silencieux des configurations Prometheus.
  • Agrégez et catégorisez autant que possible pour garder vos métriques significatives et gérables.
  • Choisissez vos étiquettes avec soin. Elles sont puissantes, mais avec un grand pouvoir vient une grande responsabilité.
  • Testez, itérez et affinez. Votre première tentative ne sera probablement pas parfaite, et c'est normal.

Rappelez-vous, l'objectif est d'avoir des métriques qui fournissent des informations exploitables, pas seulement une mer de chiffres. Bonne surveillance !

Réflexion

"Le but de l'informatique est l'insight, pas les chiffres." - Richard Hamming

Alors que vous continuez à affiner votre exportateur personnalisé, gardez cette citation à l'esprit. Il ne s'agit pas de savoir combien de métriques vous pouvez générer, mais des informations que vous pouvez en tirer.

Ressources supplémentaires

Envie d'approfondir ? Consultez ces ressources :

Maintenant, allez de l'avant et exportez ces métriques comme un pro ! Et rappelez-vous, dans le monde de la surveillance, moins c'est souvent plus. Sauf quand il s'agit de disponibilité – alors plus c'est définitivement plus.