Integration von Prometheus-Metriken in Kotlin-Anwendungen: Vollständige Anleitung

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

Prometheus-Metriken in Kotlin: Vollständige Anleitung zur Integration

\n\n

In der modernen Softwareentwicklung sind Überwachung und Metriksammlung entscheidend für die Aufrechterhaltung der Anwendungsstabilität. Prometheus ist ein führendes Open-Source-Überwachungssystem, mit dem Sie Leistungsdaten sammeln, speichern und analysieren können. In diesem Artikel betrachten wir, wie Sie Prometheus-Metriken in Kotlin-Anwendungen hinzufügen, indem Sie die Bibliothek Micrometer und einen konfigurierbaren HTTP-Server verwenden.

\n\n

Warum Prometheus mit Kotlin verwenden?

\n
    \n
  • Flexibilität: Prometheus unterstützt viele Metriktypen: Zähler, Histogramme, Zusammenfassungen und Messfühler.
  • \n
  • Integrierte Integration: Kotlin ist vollständig kompatibel mit dem Java-Ökosystem, sodass Sie Micrometer nutzen können – ein beliebtes Tool zur Metriksammlung.
  • \n
  • Skalierbarkeit: Prometheus lässt sich leicht für die Überwachung von Mikrodiensten und verteilten Systemen skalieren.
  • \n
\n\n

Projekt mit Gradle einrichten

\n

Fügen Sie zunächst die Abhängigkeiten in der Datei build.gradle.kts hinzu:

\n
dependencies {\n    implementation("io.micrometer:micrometer-core:1.12.0")\n    implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")\n    // Für den HTTP-Server (wir verwenden 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

Prometheus-Registrierung erstellen

\n

Die Grundlage der Metriksammlung ist der PrometheusMeterRegistry. Erstellen Sie ihn in Ihrer Anwendung:

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

Metriken definieren

\n

Betrachten wir drei Hauptmetriktypen:

\n
    \n
  • Counter – ein Zähler, der nur erhöht wird (z. B. Anzahl der Anfragen).
  • \n
  • Gauge – ein aktueller Wert (z. B. Anzahl aktiver Benutzer).
  • \n
  • Timer – die Ausführungszeit von Operationen.
  • \n
\n

Beispiel für die Erstellung von Metriken:

\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("Gesamtzahl der API-Anfragen")\n    .register(registry)\n\nval activeUsersGauge: Gauge = Gauge\n    .builder("app.users.active")\n    .description("Anzahl aktiver Benutzer")\n    .register(registry) { activeUsersCount }\n\nval requestTimer: Timer = Timer\n    .builder("api.requests.duration")\n    .description("Ausführungszeit der Anfragen")\n    .register(registry)\n\nvar activeUsersCount = 0
\n\n

Metriken über HTTP exportieren

\n

Damit Prometheus Metriken sammeln kann, müssen sie im Format /metrics exportiert werden. Wir verwenden Ktor, um einen Endpunkt zu erstellen:

\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

Integration mit der Geschäftslogik

\n

Aktualisieren Sie die Metriken im Code Ihrer Anwendung:

\n
fun handleRequest() {\n    requestTimer.record {\n        // Simulation der Anfrageverarbeitung\n        Thread.sleep(100)\n        requestCounter.increment()\n    }\n}\n\nfun userLoggedIn() {\n    activeUsersCount++\n}\n\nfun userLoggedOut() {\n    act                    

Empfehlungen