مقدمة: لماذا مراقبة تطبيقات Java هي الأساس
\nتطبيق Java الحديث هو نظام موزع معقد. بدون مراقبة، أنت تعمل بشكل أعمى: انخفاض سرعة الاستجابة، تسرب الذاكرة، أو خطأ OutOfMemoryError المفاجئ قد يمر دون أن يلاحظه أحد حتى شكوى المستخدم. تتيح لك المراقبة المهيأة بشكل جيد للمقاييس والتنبيهات ليس فقط الاستجابة السريعة للحوادث، بل أيضًا توقع نقاط الضعف قبل أن تصبح حرجة.
\nفي هذه المقالة، سنستعرض الدورة الكاملة: من جمع مقاييس JVM الأساسية إلى إعداد التنبيهات في Prometheus والتصور في Grafana. جميع أمثلة الكود مكتوبة بلغة Java باستخدام المكتبة الشائعة Micrometer.
\n\n1. المقاييس الرئيسية لتطبيق Java
\nتبدأ المراقبة باختيار المقاييس الصحيحة. يمكن تقسيمها إلى ثلاث مجموعات: مقاييس JVM، مقاييس الأعمال، ومقاييس البنية التحتية.
\n\n1.1. مقاييس JVM
\nتُظهر هذه المقاييس حالة الآلة الافتراضية Java. أهمها:
\n- \n
- Heap memory usage — استخدام الكومة (الذاكرة المستخدمة / القصوى). قد يشير الارتفاع الحاد إلى تسرب. \n
- GC pauses — تكرار ومدة جمع القمامة. فترات التوقف الطويلة (أكثر من ثانية واحدة) هي علامة على وجود مشاكل. \n
- Thread states — عدد الخيوط في حالات RUNNABLE، BLOCKED، WAITING. كثرة BLOCKED تشير إلى احتمال وجود حظر. \n
- CPU usage — تحميل المعالج بواسطة عملية JVM. \n
1.2. مقاييس الأعمال
\nتعكس منطق تطبيقك. أمثلة:
\n- \n
- عدد الطلبات المعالجة في الدقيقة. \n
- وقت استجابة API الخارجي. \n
- عدد أخطاء التحقق. \n
1.3. مقاييس البنية التحتية
\n- \n
- استخدام القرص، الشبكة، ذاكرة المضيف. \n
- حالة الاتصالات بقاعدة البيانات (تجمع الاتصالات). \n
- تأخير قوائم انتظار الرسائل (Kafka، RabbitMQ). \n
2. أدوات جمع المقاييس: Micrometer + Prometheus
\nبالنسبة لتطبيقات Java، المعيار الفعلي هو مكتبة Micrometer. توفر واجهة لأنظمة مراقبة مختلفة (Prometheus، Datadog، Graphite). بالاقتران مع Prometheus (مخزن المقاييس) و Grafana (التصور)، تحصل على نظام بيئي قوي ومجاني.
\n\n2.1. توصيل Micrometer في Spring Boot
\nإذا كنت تستخدم Spring Boot 2.x أو 3.x، أضف التبعية التالية إلى pom.xml:
<dependency>\n <groupId>io.micrometer</groupId>\n <artifactId>micrometer-registry-prometheus</artifactId>\n</dependency>\nبعد ذلك، سيقوم Spring Boot Actuator تلقائيًا بتمكين نقطة النهاية /actuator/prometheus، والتي ستقدم المقاييس بتنسيق Prometheus.
2.2. إنشاء مقياس مخصص
\nلنفترض أنك تريد حساب عدد الاستدعاءات الناجحة والفاشلة للدالة. أنشئ عدادًا:
\nimport io.micrometer.core.instrument.MeterRegistry;\nimport io.micrometer.core.instrument.Counter;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class OrderService {\n\n private final Counter successCounter;\n private final Counter errorCounter;\n\n public OrderService(MeterRegistry registry) {\n this.successCounter = Counter.builder("orders.success")\n .description("Number of successful orders")\n .register(registry);\n this.errorCounter = Counter.builder("orders.error")\n .description("Number of failed orders")\n .register(registry);\n }\n\n public void processOrder(String orderId) {\n try {\n // منطق معالجة الطلب\n successCounter.increment();\n } catch (Exception e) {\n errorCounter.increment();\n throw e;\n }\n }\n}\nفي Prometheus، سيظهر المقياس كـ orders_succ