Métriques Prometheus en Kotlin : des bases aux solutions de production
Les applications backend modernes nécessitent une surveillance constante. Prometheus est la norme de facto pour la collecte de métriques dans le monde des microservices. Dans cet article, nous allons voir comment intégrer Prometheus dans des applications Kotlin à l'aide de la bibliothèque Micrometer et du framework Ktor. Vous apprendrez à créer des compteurs personnalisés, des histogrammes et des minuteurs, ainsi qu'à configurer un point de terminaison pour la collecte de métriques.
1. Pourquoi Micrometer ?
Micrometer est une façade de monitoring, analogue à SLF4J pour la journalisation. Il prend en charge de nombreux backends : Prometheus, Graphite, Datadog, InfluxDB et autres. En utilisant Micrometer, vous ne vous liez pas à un système de monitoring spécifique — il suffit de changer la dépendance.
Pour Prometheus, Micrometer fournit un registre spécial PrometheusMeterRegistry, qui exporte les métriques dans un format texte compréhensible par Prometheus.
2. Ajout des dépendances
Ajoutez les dépendances suivantes dans build.gradle.kts :
dependencies { // Micrometer + Prometheus implementation("io.micrometer:micrometer-core:1.12.5") implementation("io.micrometer:micrometer-registry-prometheus:1.12.5")
// Pour Ktor implementation("io.ktor:ktor-server-core:2.3.9") implementation("io.ktor:ktor-server-netty:2.3.9") implementation("io.ktor:ktor-server-metrics-micrometer:2.3.9")}Si vous utilisez Spring Boot, il suffit d'ajouter spring-boot-starter-actuator et micrometer-registry-prometheus — Spring Boot configurera automatiquement le point de terminaison /actuator/prometheus.
3. Configuration de base dans Ktor
Créons une application Ktor simple avec des métriques Prometheus. Nous aurons besoin de :
PrometheusMeterRegistry— le registre de métriquesKtorMetricsPlugin— le plugin pour la collecte automatique des métriques HTTP- Le point de terminaison
/metricspour la collecte des données Prometheus
import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.response.*import io.ktor.server.routing.*import io.micrometer.prometheus.PrometheusConfigimport io.micrometer.prometheus.PrometheusMeterRegistryimport io.ktor.server.plugins.metrics.micrometer.*
fun main() { val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)
embeddedServer(Netty, port = 8080) { install(MicrometerMetrics) { registry = prometheusRegistry // Activation de la collecte des métriques par défaut (JVM, processeur, mémoire) meterBinders = listOf( JvmGcMetrics(), JvmMemoryMetrics(), ProcessorMetrics() ) }
routing { // Point de terminaison pour Prometheus get("/metrics") { call.respondText( contentType = ContentType.parse("text/plain; version=0.0.4"), text = prometheusRegistry.scrape() ) }
// Exemple de point de terminaison métier get("/hello") { call.respondText("Hello, Kotlin!") } } }.start(wait = true)}4. Métriques personnalisées
En plus des métriques automatiques, vous pouvez créer les vôtres. Examinons trois types principaux :
- Counter — un compteur (par exemple, le nombre de requêtes)
- Timer — le temps d'exécution d'une opération
- Gauge — une valeur courante (par exemple, le nombre d'utilisateurs actifs)
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.Timerimport io.micrometer.core.instrument.Gauge
// Création des métriquesval requestCounter: Counter = Counter .builder( Aussi dans la bibliothèque
Création d'applications CLI en TypeScript : aperçu des frameworks et outils
Guzzle pour PHP : guide complet avec exemples
Conteneur d'injection de dépendances pour Swift (iOS/macOS) : Swinject
Caffeine Java : guide complet avec exemples