مقاييس Prometheus في Kotlin: دليل شامل للدمج
\n\nفي التطوير الحديث، تعتبر المراقبة وجمع المقاييس أمرًا بالغ الأهمية للحفاظ على استقرار التطبيقات. Prometheus هو نظام مراقبة رائد مفتوح المصدر يسمح بجمع وتخزين وتحليل بيانات الأداء. في هذه المقالة، سننظر في كيفية إضافة مقاييس Prometheus إلى تطبيقات Kotlin باستخدام مكتبة Micrometer وخادم HTTP قابل للتخصيص.
\n\nلماذا استخدام Prometheus مع Kotlin؟
\n- \n
- المرونة: يدعم Prometheus أنواعًا متعددة من المقاييس: العدادات، الرسوم البيانية، الملخصات، وأجهزة الاستشعار. \n
- الدمج المدمج: Kotlin متوافق تمامًا مع نظام Java البيئي، مما يسمح باستخدام Micrometer - أداة شائعة لجمع المقاييس. \n
- قابلية التوسع: يمكن توسيع نطاق Prometheus بسهولة لمراقبة الخدمات المصغرة والأنظمة الموزعة. \n
إعداد المشروع باستخدام Gradle
\nللبدء، أضف التبعيات إلى ملف build.gradle.kts:
dependencies {\n implementation("io.micrometer:micrometer-core:1.12.0")\n implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")\n // لخادم HTTP (نستخدم 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
\nأساس جمع المقاييس هو PrometheusMeterRegistry. قم بإنشائه في تطبيقك:
\nimport io.micrometer.prometheus.PrometheusConfig\nimport io.micrometer.prometheus.PrometheusMeterRegistry\n\nval registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)\n\nتحديد المقاييس
\nلننظر إلى ثلاثة أنواع رئيسية من المقاييس:
\n- \n
- Counter - عداد يزداد فقط (مثل عدد الطلبات). \n
- Gauge - القيمة الحالية (مثل عدد المستخدمين النشطين). \n
- Timer - وقت تنفيذ العمليات. \n
مثال على إنشاء المقاييس:
\nimport 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("إجمالي عدد الطلبات إلى API")\n .register(registry)\n\nval activeUsersGauge: Gauge = Gauge\n .builder("app.users.active")\n .description("عدد المستخدمين النشطين")\n .register(registry) { activeUsersCount }\n\nval requestTimer: Timer = Timer\n .builder("api.requests.duration")\n .description("وقت تنفيذ الطلبات")\n .register(registry)\n\nvar activeUsersCount = 0\n\nتصدير المقاييس عبر HTTP
\nلكي يتمكن Prometheus من جمع المقاييس، يجب تصديرها بتنسيق /metrics. نستخدم Ktor لإنشاء نقطة النهاية:
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الدمج مع منطق الأعمال
\nقم بتحديث المقاييس في كود تطبيقك:
\nfun handleRequest() {\n requestTimer.record {\n // محاكاة معالجة الطلب\n Thread.sleep(100)\n requestCounter.increment()\n }\n}\n\nfun userLoggedIn() {\n activeUsersCount++\n}\n\nfun userLoggedOut() {\n act