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 :
- Utilisez les étiquettes judicieusement : Les étiquettes sont puissantes mais peuvent rapidement conduire à une explosion des métriques si elles sont surutilisées.
- Agrégez lorsque c'est possible : Parfois, une somme ou une moyenne est plus utile que des points de données individuels.
- Choisissez les types de métriques appropriés : Les jauges, compteurs et histogrammes ont chacun leur place. Utilisez-les à bon escient.
- 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.