Einleitung: Warum Überwachung für Kotlin-Anwendungen lebenswichtig ist
\nModerne Kotlin-Anwendungen, die auf der JVM (Java Virtual Machine) laufen, werden oft zu kritischen Knotenpunkten der Infrastruktur. Ohne angemessene Überwachung riskieren Sie plötzliche Ausfälle, Speicherlecks oder Leistungseinbußen, die bis zum Vorfall unbemerkt bleiben. In diesem Artikel werden wir erläutern, wie Sie ein vollständiges Überwachungssystem für Kotlin-Anwendungen „von A bis Z“ aufbauen: von der Erfassung grundlegender Metriken (CPU, Speicher, GC) bis zur Einrichtung von Alerts in Grafana und Prometheus.
\nWir werden drei Schlüsselwerkzeuge betrachten: Micrometer (Fassade für Metriken), Prometheus (Speicher und Sammler) und Grafana (Visualisierung und Alerts). Alle Codebeispiele sind in Kotlin geschrieben.
\n\n1. Grundlagen der Metrikenerfassung: Micrometer und Prometheus
\nMicrometer ist der De-facto-Standard-Fassade für die Überwachung im Spring- und Kotlin-Ökosystem. Es bietet eine einheitliche API zum Senden von Metriken an verschiedene Systeme (Prometheus, Datadog, New Relic usw.).
\n\n1.1. Einbinden von Abhängigkeiten (Gradle)
\ndependencies {\n implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")\n implementation("org.springframework.boot:spring-boot-starter-actuator")\n}\nFür Ktor oder reines Kotlin ohne Spring können Sie nur micrometer-core und micrometer-registry-prometheus hinzufügen.
1.2. Grundlegende Micrometer-Konfiguration in Spring Boot
\nIn application.yml reicht es aus, Actuator und den Prometheus-Endpunkt zu aktivieren:
management:\n endpoints:\n web:\n exposure:\n include: health,info,prometheus\n metrics:\n export:\n prometheus:\n enabled: true\nNach dem Start der Anwendung sind die Metriken unter /actuator/prometheus verfügbar.
1.3. Erstellen eigener Metriken (Beispiel in Kotlin)
\nAngenommen, Sie möchten die Anzahl der verarbeiteten Bestellungen und deren Bearbeitungszeit zählen:
\nimport io.micrometer.core.instrument.MeterRegistry\nimport io.micrometer.core.instrument.Timer\nimport org.springframework.stereotype.Service\nimport java.util.concurrent.atomic.AtomicLong\n\n@Service\nclass OrderService(private val registry: MeterRegistry) {\n\n private val processedOrders: AtomicLong = registry.gauge(\n "orders.processed.count",\n AtomicLong(0)\n )\n private val orderProcessingTime: Timer = registry.timer("orders.processing.time")\n\n fun processOrder(orderId: String) {\n val sample = Timer.start()\n try {\n // Logik der Bestellverarbeitung\n Thread.sleep((50..200).random().toLong())\n processedOrders.incrementAndGet()\n } finally {\n sample.stop(orderProcessingTime)\n }\n }\n}\nJetzt erscheinen die Metriken orders_processed_count und orders_processing_time_seconds in Prometheus.
2. Einrichten von Prometheus zur Metrikenerfassung
\nPrometheus ist ein Server, der Metriken von Ihren Anwendungen nach einem Zeitplan „scraped“ (abfragt).
\n\n2.1. Konfiguration von prometheus.yml
\nFügen Sie Ihren Kotlin-Dienst als Ziel (target) hinzu:
\nscrape_configs:\n - job_name: 'kotlin-app'\n metrics_path: '/actuator/prometheus'\n static_configs:\n - targets: ['localhost:8080']\nWenn die Anwendung in Docker/Kubernetes läuft, verwenden Sie Service Discovery.
\n\n2.2. Wichtige JVM-Standardmetriken
\nMicrometer exportiert automatisch viele JVM-Metriken:
\n- \n
jvm_memory_used_bytes— verwendeter Speicher (Heap/Non-Heap) \n jvm_gc_pause_seconds— Dauer der GC-Pausen \n jvm_threads_live_threads— Anzahl aktiver Threads \n process_cpu_usage— CPU-Auslastung durch den Prozess \n
Diese Daten sind bereits in Prome