We bouwen een aangepaste Prometheus-exporter met Quarkus Jakarta, waarbij we ons richten op het vermijden van hoge cardinaliteit en het waarborgen van efficiënte metrieken. Maak je klaar voor wat metrische magie!
Waarom Aangepaste Exporters? Zijn We Niet Het Wiel Opnieuw Aan Het Uitvinden?
Voordat we beginnen, laten we de olifant in de kamer aanpakken: waarom de moeite nemen voor een aangepaste exporter als er genoeg kant-en-klare oplossingen zijn?
- Aangepaste metrieken: Jouw app is uniek en soms heb je metrieken nodig die niet standaard beschikbaar zijn.
- Prestatieoptimalisatie: Aangepaste exporters laten je precies meten wat je nodig hebt, wat de overhead kan verminderen.
- Vermijden van metrische explosie: Met grote kracht komt grote verantwoordelijkheid – en de mogelijkheid om valkuilen van hoge cardinaliteit te vermijden.
Het Opzetten van het Quarkus Jakarta Project
Laten we eerst ons Quarkus-project opzetten. Als je nieuw bent met Quarkus, zie het als de superheldversie van Jakarta EE – sneller dan een kogel en krachtiger dan een locomotief.
Maak een nieuw Quarkus-project met de volgende Maven-opdracht:
mvn io.quarkus:quarkus-maven-plugin:2.16.5.Final:create \
-DprojectGroupId=com.example \
-DprojectArtifactId=custom-prometheus-exporter \
-DclassName="com.example.ExporterResource" \
-Dpath="/exporter"
Voeg nu de benodigde afhankelijkheden toe aan onze 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>
De Kern van de Zaak: Het Bouwen van de Exporter
Nu ons project is opgezet, laten we onze aangepaste exporter maken. We richten ons op een hypothetisch scenario waarin we een complex e-commerce systeem monitoren.
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() {
// Simuleer enkele metrieken
recordOrderMetrics();
recordUserMetrics();
return "Metrieken bijgewerkt!";
}
private void recordOrderMetrics() {
// In plaats van per product metrieken op te nemen (hoge cardinaliteit),
// nemen we geaggregeerde metrieken per categorie op
String[] categories = {"Electronics", "Clothing", "Books", "Home"};
for (String category : categories) {
double orderValue = 100 + random.nextDouble() * 900; // Willekeurige orderwaarde tussen 100 en 1000
registry.gauge("ecommerce.order.value", Tags.of("category", category), orderValue);
}
}
private void recordUserMetrics() {
// In plaats van per gebruiker metrieken op te nemen, gebruiken we buckets
int activeUsers = 1000 + random.nextInt(9000); // Willekeurig aantal tussen 1000 en 10000
String userBucket = activeUsers < 5000 ? "low" : "high";
registry.gauge("ecommerce.active.users", Tags.of("load", userBucket), activeUsers);
}
}
Het Vermijden van de Hoge Cardinaliteit Val
Hoge cardinaliteit is de boeman van Prometheus-opstellingen. Het is alsof je iedereen in je stad uitnodigt voor een huisfeest – het loopt gegarandeerd uit de hand. Hier is hoe we het vermijden:
- Categorisatie: In plaats van metrieken voor elk individueel product bij te houden (wat er duizenden kunnen zijn), groeperen we ze in categorieën.
- Bucketting: Voor gebruikersmetrieken gebruiken we een eenvoudige "low" of "high" bucket in plaats van elke gebruiker individueel bij te houden.
Onthoud, het doel is om genoeg detail te hebben om nuttig te zijn zonder te verdrinken in data.
Zorgen voor Efficiënte Metrieken
Efficiëntie gaat niet alleen over het vermijden van hoge cardinaliteit. Hier zijn nog enkele tips om je metrieken slank en krachtig te houden:
- Gebruik labels spaarzaam: Labels zijn krachtig maar kunnen snel leiden tot metrische explosie als ze te veel worden gebruikt.
- Aggregateer waar mogelijk: Soms is een som of gemiddelde nuttiger dan individuele datapunten.
- Kies geschikte metriektypen: Meters, tellers en histogrammen hebben elk hun plaats. Gebruik ze verstandig.
- Stel retentiebeleid in: Niet alle metrieken hoeven voor altijd bewaard te blijven. Stel passende retentieperiodes in Prometheus in.
Je Exporter Testen
Voordat we onszelf op de schouder kloppen, laten we ervoor zorgen dat dit ding daadwerkelijk werkt. Start je Quarkus-applicatie:
./mvnw quarkus:dev
Roep nu het eindpunt aan om enkele metrieken te genereren:
curl http://localhost:8080/exporter
Controleer ten slotte je metrieken op:
curl http://localhost:8080/q/metrics
Je zou iets als dit moeten zien:
# HELP ecommerce_order_value
# TYPE ecommerce_order_value gauge
ecommerce_order_value{category="Electronics"} 543.21
ecommerce_order_value{category="Clothing"} 321.54
ecommerce_order_value{category="Books"} 123.45
ecommerce_order_value{category="Home"} 987.65
# HELP ecommerce_active_users
# TYPE ecommerce_active_users gauge
ecommerce_active_users{load="high"} 7523.0
Het Bewijs Zit in de Pudding: Je Metrieken Analyseren
Nu onze exporter draait, laten we eens kijken wat we met deze metrieken kunnen doen. Hier zijn enkele Prometheus-query's die je nuttig kunt vinden:
# Gemiddelde orderwaarde over alle categorieën
avg(ecommerce_order_value)
# Totaal aantal actieve gebruikers
sum(ecommerce_active_users)
# Hoogste orderwaarde per categorie
max(ecommerce_order_value) by (category)
Deze query's geven je een idee van de inzichten die je kunt halen uit je zorgvuldig samengestelde metrieken.
Afronden: Geleerde Lessen
Een aangepaste Prometheus-exporter bouwen is niet zomaar wat metrieken samenvoegen en het een dag noemen. Het is een kunstvorm die zorgvuldige overweging vereist van wat je meet en hoe je het meet. Hier zijn de belangrijkste punten:
- Wees altijd op je hoede voor hoge cardinaliteit. Het is de stille moordenaar van Prometheus-opstellingen.
- Aggregateer en categoriseer waar mogelijk om je metrieken zinvol en beheersbaar te houden.
- Kies je labels zorgvuldig. Ze zijn krachtig, maar met grote kracht komt grote verantwoordelijkheid.
- Test, herhaal en verfijn. Je eerste poging zal waarschijnlijk niet perfect zijn, en dat is oké.
Onthoud, het doel is om metrieken te hebben die bruikbare inzichten bieden, niet alleen een zee van cijfers. Veel succes met monitoren!
Stof tot Nadenken
"Het doel van computing is inzicht, niet cijfers." - Richard Hamming
Terwijl je je aangepaste exporter blijft verfijnen, houd deze quote in gedachten. Het gaat niet om hoeveel metrieken je kunt genereren, maar om de inzichten die je eruit kunt halen.
Aanvullende Bronnen
Wil je dieper duiken? Bekijk deze bronnen:
Ga nu verder en exporteer die metrieken als een professional! En onthoud, in de wereld van monitoring is minder vaak meer. Tenzij we het over uptime hebben – dan is meer zeker meer.