Prometheus-Metriken in Kotlin: Von den Grundlagen bis zu Produktionslösungen
Moderne Backend-Anwendungen erfordern eine ständige Überwachung. Prometheus ist der De-facto-Standard für die Metrikenerfassung in der Welt der Mikroservices. In diesem Artikel werden wir uns ansehen, wie man Prometheus mit der Bibliothek Micrometer und dem Framework Ktor in Kotlin-Anwendungen integriert. Sie erfahren, wie Sie benutzerdefinierte Zähler, Histogramme und Timer erstellen und einen Endpunkt für die Metrikenerfassung konfigurieren.
1. Warum Micrometer?
Micrometer ist eine Fassade für das Monitoring, vergleichbar mit SLF4J für das Logging. Es unterstützt viele Backends: Prometheus, Graphite, Datadog, InfluxDB und andere. Durch die Verwendung von Micrometer binden Sie sich nicht an ein bestimmtes Monitoring-System – ein Abhängigkeitswechsel genügt.
Für Prometheus bietet Micrometer ein spezielles Register PrometheusMeterRegistry, das Metriken in einem für Prometheus verständlichen Textformat exportiert.
2. Einbinden der Abhängigkeiten
Fügen Sie die folgenden Abhängigkeiten zu Ihrer build.gradle.kts hinzu:
dependencies { // Micrometer + Prometheus implementation("io.micrometer:micrometer-core:1.12.5") implementation("io.micrometer:micrometer-registry-prometheus:1.12.5")
// Für 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")}Wenn Sie Spring Boot verwenden, reicht es aus, spring-boot-starter-actuator und micrometer-registry-prometheus hinzuzufügen – Spring Boot konfiguriert automatisch den Endpunkt /actuator/prometheus.
3. Grundlegende Konfiguration in Ktor
Erstellen wir eine einfache Ktor-Anwendung mit Prometheus-Metriken. Dazu benötigen wir:
PrometheusMeterRegistry– das MetrikregisterKtorMetricsPlugin– ein Plugin zur automatischen Erfassung von HTTP-Metriken- Den Endpunkt
/metricszur Erfassung der Prometheus-Daten
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 // Standard-Metriken aktivieren (JVM, CPU, Speicher) meterBinders = listOf( JvmGcMetrics(), JvmMemoryMetrics(), ProcessorMetrics() ) }
routing { // Endpunkt für Prometheus get("/metrics") { call.respondText( contentType = ContentType.parse("text/plain; version=0.0.4"), text = prometheusRegistry.scrape() ) }
// Beispiel für einen Geschäfts-Endpunkt get("/hello") { call.respondText("Hello, Kotlin!") } } }.start(wait = true)}4. Benutzerdefinierte Metriken
Zusätzlich zu den automatischen Metriken können Sie Ihre eigenen erstellen. Betrachten wir drei Haupttypen:
- Counter – ein Zähler (z. B. Anzahl der Anfragen)
- Timer – die Ausführungszeit einer Operation
- Gauge – ein aktueller Wert (z. B. Anzahl aktiver Benutzer)
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.Timerimport io.micrometer.core.instrument.Gauge
// Metriken erstellenval requestCounter: Counter = Counter .builder( Auch in der Bibliothek
Elasticsearch-Client für Kotlin: Integration, Beispiele und Möglichkeiten
Reaktive Programmierung in Rust: Bibliotheken, Frameworks und praktische Beispiele
Arbeiten mit Kafka in Swift (iOS/macOS): Bibliotheken, Clients und Beispiele