Surveillance des applications Kotlin : Ktor Metrics et Micrometer
Les applications serveur modernes en Kotlin, construites sur le framework Ktor, nécessitent une surveillance constante des performances et de l'état. Pour cela, on utilise la combinaison de deux outils puissants : Ktor Metrics Plugin (module intégré à Ktor) et Micrometer (façade pour la collecte de métriques). Dans cet article, nous allons voir comment configurer la surveillance avec export des données vers Prometheus et affichage dans Grafana.
Pourquoi la surveillance est-elle nécessaire ?
La surveillance permet de :
- Suivre le temps de réponse des endpoints (latence).
- Compter le nombre de requêtes (RPS).
- Identifier les requêtes lentes et les erreurs.
- Observer l'utilisation de la mémoire et du CPU (via les métriques JVM).
- Configurer des alertes en cas de dépassement de seuils.
Bibliothèques et dépendances
Pour travailler, vous aurez besoin des dépendances suivantes dans build.gradle.kts :
dependencies { // Ktor Server implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7")
// Plugin de métriques implementation("io.ktor:ktor-server-metrics-micrometer:2.3.7")
// Export vers Prometheus implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")
// Métriques JVM (optionnel) implementation("io.micrometer:micrometer-core:1.12.0")}Configuration de base de Ktor Metrics
Considérons un exemple simple de serveur avec métriques. Créons le fichier Application.kt :
import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.server.response.*import io.ktor.server.metrics.micrometer.*import io.micrometer.prometheus.PrometheusMeterRegistryimport io.micrometer.prometheus.PrometheusConfig
fun main() { embeddedServer(Netty, port = 8080) { // Création du registre de métriques Prometheus val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)
// Installation du plugin de métriques install(MicrometerMetrics) { registry = prometheusRegistry // Noms des métriques par défaut meterBinders = listOf( // Ajout des métriques JVM io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics(), io.micrometer.core.instrument.binder.system.ProcessorMetrics() ) }
// Routage routing { // Endpoint pour fournir les métriques Prometheus get("/metrics") { call.respond(prometheusRegistry.scrape()) }
// Endpoint de test get("/hello") { call.respondText("Hello, World!") }
// Endpoint avec délai artificiel get("/slow") { Thread.sleep(500) call.respondText("Slow response") } } }.start(wait = true)}Après le démarrage du serveur, ouvrez http://localhost:8080/metrics — vous verrez les métriques au format Prometheus :
# HELP ktor_http_server_requests_seconds # TYPE ktor_http_server_requests_seconds summaryktor_http_server_requests_seconds_count{method="GET",route="/hello",status="2xx"} 3.0ktor_http_server_requests_seconds_sum{method="GET",route="/hello",status="2xx"} 0.012# HELP jvm_memory_used_bytes # TYPE jvm_memory_used_bytes gaugejvm_memory_used_bytes{area="heap",id="G1 Survivor Space"} 1048576.0Configuration avancée : métriques personnalisées
Vous pouvez ajouter vos propres compteurs et minuteries. Par exemple, un compteur de commandes traitées :
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.MeterRegistry
Aussi dans la bibliothèque
gRPC pour JavaScript (Node.js) : bibliothèques, configuration et exemples de code
Mise en cache en Go (Golang) : Redis et outils alternatifs
Rate Limiting en PHP : Limitation du taux de requêtes pour protéger le site
Envoi de SMS en C# (.NET) : Intégration avec l'API des services SMS via HttpClient