Ü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.0Erweiterte 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
Auch in der Bibliothek
PDF-Generierung in Java: Überblick über die Bibliotheken iText, Apache PDFBox, OpenPDF
Caching in Java: Redis, Caffeine und andere Tools
SMS-Versand mit Java: Überblick über API-Bibliotheken (Twilio, Nexmo, SMS-Gateways)