Überwachung von Kotlin-Anwendungen: Ktor Metrics und Micrometer

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Überwachung von Kotlin-Anwendungen: Ktor Metrics und Micrometer



Moderne serverseitige Kotlin-Anwendungen, die auf dem Framework Ktor basieren, erfordern eine ständige Überwachung der Leistung und des Zustands. Dazu wird eine Kombination aus zwei leistungsstarken Tools verwendet: dem Ktor Metrics Plugin (ein in Ktor integriertes Modul) und Micrometer (eine Fassade zur Erfassung von Metriken). In diesem Artikel werden wir besprechen, wie die Überwachung mit Export der Daten nach Prometheus und Anzeige in Grafana konfiguriert wird.



Warum ist Überwachung notwendig?

Überwachung ermöglicht:

  • Verfolgung der Antwortzeiten von Endpunkten (Latenz).
  • Zählung der Anzahl der Anfragen (RPS).
  • Identifizierung langsamer Anfragen und Fehler.
  • Beobachtung der Speicher- und CPU-Nutzung (über JVM-Metriken).
  • Einrichtung von Alarmen bei Überschreitung von Schwellenwerten.


Bibliotheken und Abhängigkeiten

Für die Arbeit werden die folgenden Abhängigkeiten in build.gradle.kts benötigt:



dependencies {    // Ktor Server    implementation("io.ktor:ktor-server-core:2.3.7")    implementation("io.ktor:ktor-server-netty:2.3.7")

// Metrik-Plugin implementation("io.ktor:ktor-server-metrics-micrometer:2.3.7")

// Export nach Prometheus implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")

// JVM-Metriken (optional) implementation("io.micrometer:micrometer-core:1.12.0")}


Grundlegende Konfiguration von Ktor Metrics

Betrachten wir ein einfaches Beispiel eines Servers mit Metriken. Erstellen wir eine Datei 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) { // Erstellen eines Prometheus-Metrikregisters val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)

// Installieren des Metrik-Plugins install(MicrometerMetrics) { registry = prometheusRegistry // Standard-Metriknamen meterBinders = listOf( // Hinzufügen von JVM-Metriken io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics(), io.micrometer.core.instrument.binder.system.ProcessorMetrics() ) }

// Routing routing { // Endpunkt zur Ausgabe von Prometheus-Metriken get("/metrics") { call.respond(prometheusRegistry.scrape()) }

// Test-Endpunkt get("/hello") { call.respondText("Hello, World!") }

// Endpunkt mit künstlicher Verzögerung get("/slow") { Thread.sleep(500) call.respondText("Slow response") } } }.start(wait = true)}


Nach dem Start des Servers öffnen Sie http://localhost:8080/metrics — Sie sehen Metriken im Prometheus-Format:



# 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.0


Erweiterte Konfiguration: Benutzerdefinierte Metriken

Sie können eigene Zähler und Timer hinzufügen. Zum Beispiel ein Zähler für verarbeitete Bestellungen:



import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.MeterRegistry

Empfehlungen