المراقبة في Java: من "لماذا تعطل؟" إلى "أعرف ماذا سيحدث بعد دقيقة"
\n\nتخيل: تطبيق Java الخاص بك يعمل في بيئة الإنتاج. كل شيء على ما يرام. ثم فجأة! يشتكي المستخدمون من أن الصفحة تستغرق 10 ثوانٍ للتحميل. تتصفح الخادم، تنظر إلى السجلات، ترى الكثير من INFO ولا يوجد أي ERROR. ماذا تفعل؟ أين تنظر؟
في المراقبة التقليدية، تتحقق من: هل الخادم حي، كم الذاكرة المستخدمة، هل تعطلت العملية. لكن هذا مثل التحقق مما إذا كان المصباح الكهربائي يضيء على لوحة القيادة - مفيد ولكنه غير كافٍ. المراقبة (Observability) هي المستوى التالي. إنها القدرة على فهم الحالة الداخلية للنظام من خلال مخرجاته الخارجية: السجلات والمقاييس والتتبعات.
\n\nفي هذه المقالة، سأوضح كيفية تطبيق المراقبة في Java بأمثلة حقيقية. سنستخدم OpenTelemetry وMicrometer وSpring Boot Actuator وSLF4J الكلاسيكي. ستتعلم كيفية ربط السجلات والمقاييس والتتبعات في صورة واحدة موحدة، وليس مجرد "جمع كل شيء في كومة".
\n\nما هي المراقبة ولماذا ليست مجرد "جمع سجلات"؟
\n\nجاءت المراقبة من نظرية التحكم. النظام قابل للمراقبة إذا كان من الممكن استعادة حالته الداخلية من خلال مخرجاته. في عالم Java، هذا يعني ثلاثة أركان:
\n\n- \n
- السجلات - سجلات منظمة للأحداث (ماذا حدث؟); \n
- المقاييس - مؤشرات رقمية (كم؟ كم من الوقت؟); \n
- التتبعات - سلاسل الاستدعاءات (أي مسار سلكه الطلب؟). \n
بدون المراقبة، أنت أعمى. تعلم أن وحدة المعالجة المركزية مشغولة بنسبة 95%، لكنك لا تعلم أي نقطة نهاية تحديداً تسبب ذلك. ترى خطأً في السجل، لكنك لا تفهم أي مستخدم تسبب فيه وأي الخدمات شاركت. المراقبة في Java ليست مجرد "إضافة مكتبة"، بل هي ثقافة تطوير.
\n\nOpenTelemetry: أداة عالمية للمراقبة
\n\nفي السابق، كانت هناك حديقة حيوانات: Zipkin للتتبع، Prometheus للمقاييس، ELK للسجلات. كل منها مع SDK الخاص به. جاء OpenTelemetry (OTel) لتوحيدهم. إنه معيار مفتوح المصدر لجمع القياسات عن بُعد. يدعم Java بشكل أصلي ويمكن دمجه بسهولة في Spring Boot وMicronaut وQuarkus.
\n\nكيف يعمل؟ تضيف وكيلاً أو SDK إلى تطبيق Java الخاص بك، ويقوم OTel تلقائياً باعتراض طلبات HTTP واستدعاءات قواعد البيانات وصفوف الرسائل. لا تحتاج إلى كتابة كود لكل أداة على حدة.
\n\nمثال: إعداد OpenTelemetry في Spring Boot
\n\nأضف التبعية في pom.xml:
<dependency>\n <groupId>io.opentelemetry</groupId>\n <artifactId>opentelemetry-api</artifactId>\n <version>1.40.0</version>\n</dependency>\n<dependency>\n <groupId>io.opentelemetry</groupId>\n <artifactId>opentelemetry-sdk</artifactId>\n <version>1.40.0</version>\n</dependency>\n<dependency>\n <groupId>io.opentelemetry.instrumentation</groupId>\n <artifactId>opentelemetry-spring-boot-starter</artifactId>\n <version>2.6.0</version>\n</dependency>\n\nالآن في الإعدادات (application.yml)، حدد المُصدر، على سبيل المثال إلى Jaeger أو مجمع OTLP:
otel:\n exporter:\n otlp:\n endpoint: http://localhost:4317\n traces:\n exporter: otlp\n metrics:\n exporter: otlp\n logs:\n exporter: otlp\n\nهكذا! الآن كل طلب HTTP إلى وحدة التحكم الخاصة بك ينشئ تتبعاً تلقائياً. يمكنك رؤية المدة التي استغرقها كل استدعاء لقاعدة البيانات أو API خارجي أو مجرد تأخير في التدفق.
\n\nالتتبع في Java: كيفية العثور على "عنق الزجاجة"
\n\nالتتبع هو، ربما، الجزء الأقوى من المراقبة. عندما يتكون تطبيقك من عشرات الخدمات المصغرة، فإن التتبعات هي الطريقة الوحيدة لفهم سبب استغراق الطلب ثانيتين، على الرغم من أن كل خ