مقاييس Prometheus في Kotlin: من الأساسيات إلى حلول الإنتاج
تتطلب تطبيقات الواجهة الخلفية الحديثة مراقبة مستمرة. يُعد Prometheus المعيار الفعلي لجمع المقاييس في عالم الخدمات المصغرة. في هذه المقالة، سنشرح كيفية دمج Prometheus في تطبيقات Kotlin باستخدام مكتبة Micrometer وإطار العمل Ktor. ستتعلم كيفية إنشاء عدادات مخصصة، ومخططات بيانية، ومؤقتات، بالإضافة إلى إعداد نقطة نهاية لجمع المقاييس.
1. لماذا نحتاج Micrometer؟
Micrometer هو واجهة أمامية للمراقبة، مماثلة لـ SLF4J في التسجيل. يدعم العديد من الأنظمة الخلفية: Prometheus و Graphite و Datadog و InfluxDB وغيرها. باستخدام Micrometer، لا ترتبط بنظام مراقبة معين - يكفي تغيير التبعية.
بالنسبة لـ Prometheus، يوفر Micrometer سجلاً خاصًا PrometheusMeterRegistry يقوم بتصدير المقاييس بتنسيق نصي تفهمه Prometheus.
2. إضافة التبعيات
أضف التبعيات التالية إلى ملف build.gradle.kts:
dependencies { // Micrometer + Prometheus implementation("io.micrometer:micrometer-core:1.12.5") implementation("io.micrometer:micrometer-registry-prometheus:1.12.5")
// لـ 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")}إذا كنت تستخدم Spring Boot، يكفي إضافة spring-boot-starter-actuator و micrometer-registry-prometheus - سيقوم Spring Boot تلقائيًا بإعداد نقطة النهاية /actuator/prometheus.
3. الإعداد الأساسي في Ktor
لنقم بإنشاء تطبيق Ktor بسيط مع مقاييس Prometheus. سنحتاج إلى:
PrometheusMeterRegistry- سجل المقاييسKtorMetricsPlugin- إضافة لجمع مقاييس HTTP تلقائيًا- نقطة النهاية
/metricsلجمع بيانات Prometheus
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 // تفعيل جمع المقاييس الافتراضية (JVM، المعالج، الذاكرة) meterBinders = listOf( JvmGcMetrics(), JvmMemoryMetrics(), ProcessorMetrics() ) }
routing { // نقطة النهاية لـ Prometheus get("/metrics") { call.respondText( contentType = ContentType.parse("text/plain; version=0.0.4"), text = prometheusRegistry.scrape() ) }
// مثال على نقطة نهاية تجارية get("/hello") { call.respondText("Hello, Kotlin!") } } }.start(wait = true)}4. المقاييس المخصصة
بالإضافة إلى المقاييس التلقائية، يمكنك إنشاء مقاييسك الخاصة. دعنا نستعرض ثلاثة أنواع رئيسية:
- Counter - عداد (مثل عدد الطلبات)
- Timer - وقت تنفيذ العملية
- Gauge - القيمة الحالية (مثل عدد المستخدمين النشطين)
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.Timerimport io.micrometer.core.instrument.Gauge
// إنشاء المقاييسval requestCounter: Counter = Counter .builder(