مراقبة تطبيقات Kotlin: مكتبة Ktor Metrics و Micrometer

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مراقبة تطبيقات Kotlin: Ktor Metrics و Micrometer



تتطلب تطبيقات الخادم الحديثة بلغة Kotlin، المبنية على إطار العمل Ktor، مراقبة مستمرة للأداء والحالة. لهذا الغرض، يُستخدم مزيج من أداتين قويتين: إضافة Ktor Metrics (وحدة مدمجة في Ktor) و Micrometer (واجهة لجمع المقاييس). في هذا المقال، سنشرح كيفية إعداد المراقبة مع تصدير البيانات إلى Prometheus وعرضها في Grafana.



لماذا نحتاج إلى المراقبة؟

تتيح المراقبة ما يلي:

  • تتبع زمن استجابة نقاط النهاية (latency).
  • حساب عدد الطلبات (RPS).
  • اكتشاف الطلبات البطيئة والأخطاء.
  • مراقبة استخدام الذاكرة ووحدة المعالجة المركزية (من خلال مقاييس JVM).
  • إعداد التنبيهات عند تجاوز الحدود.


المكتبات والتبعيات

للعمل، ستحتاج إلى التبعيات التالية في ملف build.gradle.kts:



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

// إضافة المقاييس implementation("io.ktor:ktor-server-metrics-micrometer:2.3.7")

// التصدير إلى Prometheus implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")

// مقاييس JVM (اختياري) implementation("io.micrometer:micrometer-core:1.12.0")}


الإعداد الأساسي لـ Ktor Metrics

لنلقِ نظرة على مثال بسيط لخادم مع مقاييس. سننشئ ملف 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) { // إنشاء سجل مقاييس Prometheus val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)

// تثبيت إضافة المقاييس install(MicrometerMetrics) { registry = prometheusRegistry // أسماء المقاييس الافتراضية meterBinders = listOf( // إضافة مقاييس JVM io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics(), io.micrometer.core.instrument.binder.system.ProcessorMetrics() ) }

// التوجيه routing { // نقطة نهاية لتقديم مقاييس Prometheus get("/metrics") { call.respond(prometheusRegistry.scrape()) }

// نقطة نهاية اختبارية get("/hello") { call.respondText("Hello, World!") }

// نقطة نهاية مع تأخير اصطناعي get("/slow") { Thread.sleep(500) call.respondText("Slow response") } } }.start(wait = true)}


بعد تشغيل الخادم، افتح http://localhost:8080/metrics — ستظهر المقاييس بتنسيق Prometheus:



# 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


إعداد متقدم: مقاييس مخصصة

يمكنك إضافة عدادات ومؤقتات خاصة بك. على سبيل المثال، عداد الطلبات المعالجة:



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

توصيات