Intégration des métriques Prometheus dans les applications Kotlin : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Métriques Prometheus en Kotlin : guide complet d'intégration

\n\n

Dans le développement moderne, la surveillance et la collecte de métriques sont essentielles pour maintenir la stabilité des applications. Prometheus est un système de surveillance leader à code source ouvert qui permet de collecter, stocker et analyser les données de performance. Dans cet article, nous verrons comment ajouter des métriques Prometheus aux applications Kotlin en utilisant la bibliothèque Micrometer et un serveur HTTP configurable.

\n\n

Pourquoi utiliser Prometheus avec Kotlin ?

\n
    \n
  • Flexibilité : Prometheus prend en charge plusieurs types de métriques : compteurs, histogrammes, résumés et jauges.
  • \n
  • Intégration native : Kotlin est entièrement compatible avec l'écosystème Java, ce qui permet d'utiliser Micrometer, un outil populaire pour la collecte de métriques.
  • \n
  • Évolutivité : Prometheus s'adapte facilement à la surveillance des microservices et des systèmes distribués.
  • \n
\n\n

Configuration du projet avec Gradle

\n

Pour commencer, ajoutez les dépendances dans le fichier build.gradle.kts :

\n
dependencies {\n    implementation("io.micrometer:micrometer-core:1.12.0")\n    implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")\n    // Pour le serveur HTTP (utilisation de Ktor)\n    implementation("io.ktor:ktor-server-netty:2.3.7")\n    implementation("io.ktor:ktor-server-content-negotiation:2.3.7")\n}
\n\n

Création du registre Prometheus

\n

La base de la collecte de métriques est le PrometheusMeterRegistry. Créez-le dans votre application :

\n
import io.micrometer.prometheus.PrometheusConfig\nimport io.micrometer.prometheus.PrometheusMeterRegistry\n\nval registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)
\n\n

Définition des métriques

\n

Examinons trois types principaux de métriques :

\n
    \n
  • Counter — un compteur qui ne fait qu'augmenter (par exemple, le nombre de requêtes).
  • \n
  • Gauge — une valeur courante (par exemple, le nombre d'utilisateurs actifs).
  • \n
  • Timer — le temps d'exécution des opérations.
  • \n
\n

Exemple de création de métriques :

\n
import io.micrometer.core.instrument.Counter\nimport io.micrometer.core.instrument.Gauge\nimport io.micrometer.core.instrument.Timer\n\nval requestCounter: Counter = Counter\n    .builder("api.requests.total")\n    .description("Nombre total de requêtes à l'API")\n    .register(registry)\n\nval activeUsersGauge: Gauge = Gauge\n    .builder("app.users.active")\n    .description("Nombre d'utilisateurs actifs")\n    .register(registry) { activeUsersCount }\n\nval requestTimer: Timer = Timer\n    .builder("api.requests.duration")\n    .description("Temps d'exécution des requêtes")\n    .register(registry)\n\nvar activeUsersCount = 0
\n\n

Exportation des métriques via HTTP

\n

Pour que Prometheus puisse collecter les métriques, elles doivent être exportées au format /metrics. Utilisons Ktor pour créer un point de terminaison :

\n
import io.ktor.server.engine.embeddedServer\nimport io.ktor.server.netty.Netty\nimport io.ktor.server.routing.get\nimport io.ktor.server.routing.routing\nimport io.ktor.server.response.respondText\n\nfun startMetricsServer(port: Int = 9090) {\n    embeddedServer(Netty, port = port) {\n        routing {\n            get("/metrics") {\n                val scrape = registry.scrape()\n                call.respondText(scrape, contentType = io.ktor.http.ContentType.Text.Plain)\n            }\n        }\n    }.start(wait = false)\n}
\n\n

Intégration avec la logique métier

\n

Mettez à jour les métriques dans le code de votre application :

\n
fun handleRequest() {\n    requestTimer.record {\n        // Simulation du traitement d'une requête\n        Thread.sleep(100)\n        requestCounter.increment()\n    }\n}\n\nfun userLoggedIn() {\n    activeUsersCount++\n}\n\nfun userLoggedOut() {\n    act                    

Recommendations