المقاييس والمراقبة
المقاييس والمراقبة
يخبرك التتبع الموزع أين استُغرق الوقت في طلب واحد. أما المقاييس فتخبرك مدى صحة خدمتك الآن — وعبر الزمن. في بيئة الإنتاج لا يمكنك إرفاق مُنقّح أخطاء أو قراءة كل سطر في السجلات؛ بل تحتاج إلى لوحات معلومات تلخّص آلاف الطلبات في الثانية إلى أرقام يمكنك التصرف بناءً عليها. يتناول هذا الدرس Micrometer، واجهة المقاييس المدمجة في Spring Boot 3، وكيف تُغذّي البيانات إلى Prometheus (خلفية التجميع) وGrafana (طبقة التصوير).
مكدس المقاييس في جملة واحدة
تعرض خدمة Spring Boot الخاصة بك نقطة النهاية /actuator/prometheus؛ يستطلع خادم Prometheus تلك النقطة وفق جدول زمني؛ يستعلم Grafana من Prometheus ويرسم لوحات المعلومات. لكل مكوّن مهمة واحدة بالضبط، وهذا الفصل يعني إمكانية استبدال أي طبقة باستقلالية تامة.
counter.increment() مرة واحدة؛ يترجمها Micrometer إلى صيغة Prometheus أو CloudWatch أو Datadog أو InfluxDB أو أي سجل آخر تضيفه إلى مسار الفئات. لا تستورد كود تطبيقك فئة Prometheus مباشرةً أبدًا.
إضافة التبعيات
يشحن Spring Boot Actuator نواة Micrometer. لتصدير مقاييس بصيغة Prometheus أضف تبعية واحدة إضافية:
ثم اكشف نقطة النهاية في application.yml:
ينتشر وسم application باسم خدمتك إلى كل مقياس تلقائيًا، وهو أمر ضروري حين تشترك خدمات متعددة في نفس نسخة Prometheus.
/actuator/prometheus للإنترنت العام أبدًا. تكشف نقطة النهاية عدّادات داخلية وأحجام تجمّعات الخيوط وإحصاءات تجمّع قاعدة البيانات وتفاصيل ذاكرة JVM — كنز لأي مهاجم يجري استطلاعًا. احمها بـ Spring Security أو منفذ إدارة مخصص (management.server.port: 9090) لا يمكن الوصول إليه إلا من داخل الكتلة، أو بقاعدة جدار حماية على مستوى الشبكة. يجب أن يستطلع Prometheus من شبكة داخلية لا عبر موازن الحمل العام.
أنواع المقاييس الأربعة الأساسية
يوفر Micrometer أربع أدوات قياس أساسية. يهم اختيار الأداة الصحيحة لأن Prometheus يجمّعها بطرق مختلفة:
- Counter (عدّاد) — قيمة لا تزيد إلا. استخدمه للأحداث: الطلبات المُنشأة، الأخطاء المُلقاة، إخفاقات ذاكرة التخزين المؤقت. لا تعيد ضبطه أبدًا؛ يحسب Prometheus المعدلات باستخدام
rate(). - Gauge (مقياس) — قيمة ترتفع وتنخفض. استخدمه للحالة الراهنة: الاتصالات النشطة وعمق الطابور والذاكرة المستخدمة. يُؤخذ نموذج منه عند وقت الاستطلاع لا بالتراكم.
- Timer (مؤقت) — يقيس المدة ويحسب الاستدعاءات في آنٍ واحد. ينتج مدرجًا تكراريًا لعشيريات زمن الاستجابة. الأداة الأهم لاتفاقيات مستوى الخدمة للزمن.
- DistributionSummary (ملخص توزيع) — مثل Timer لكن للقيم غير الزمنية: البايتات المنقولة وعناصر الدُفعة وحجم حمولة الطلب.
تسجيل المقاييس في خدمتك
أدخل MeterRegistry (يُهيَّأ تلقائيًا بواسطة Spring Boot) في أي Spring bean:
يحسب خيار publishPercentiles العشيريات على جانب العميل (مخزّنة في ذاكرة التطبيق). للتجميع الأدق عبر نسخ متعددة استخدم بدلًا منه publishPercentileHistogram(true) واحسب العشيريات في Prometheus باستخدام histogram_quantile().
التعليق @Timed — التوقيت التصريحي
لأساليب معالج HTTP، التعليق بـ @Timed أنظف من لفّ كل جسم أسلوب:
يهيّئ Spring Boot تلقائيًا bean باسم TimedAspect حين يكون Micrometer وSpring AOP في مسار الفئات. يتبع اسم المقياس الناتج الاصطلاح http.orders.create_seconds بصيغة Prometheus.
http.server.requests المهيَّأ تلقائيًا كل طلب وارد مع وسوم method وuri وstatus وoutcome. قبل إضافة مقاييس مخصصة، تحقق مما إذا كانت المدمجة تجيب على سؤالك بالفعل.
المقاييس للحالة الراهنة
المقاييس (Gauges) أفضل للقيم المتذبذبة. نمط شائع هو تتبع الحجم الحالي لطابور ما:
لاحظ أن المقياس يأخذ مرجعًا للطابور ودالة لقراءة حجمه. يستدعي Micrometer الدالة وقت الاستطلاع — لا حاجة لتحديث يدوي.
كيف يستطلع Prometheus نقطة النهاية
استجابة /actuator/prometheus نص عادي بصيغة OpenMetrics. إعداد Prometheus لاستطلاعها:
في Kubernetes تستخدم تعليقات اكتشاف الخدمة بدلًا من static_configs، لكن المبدأ واحد.
استعلامات PromQL المفيدة
بمجرد أن يجمع Prometheus البيانات، تشكّل هذه الاستعلامات العمود الفقري لمعظم لوحات المعلومات:
rate(orders_created_total[1m])— الطلبات في الثانية خلال الدقيقة الأخيرة.histogram_quantile(0.95, rate(orders_processing_time_seconds_bucket[5m]))— زمن الاستجابة عند العشيرية 95 على مدى 5 دقائق.rate(http_server_requests_seconds_count{status="5xx"}[1m])— معدل أخطاء 5xx في الثانية.jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"}— نسبة استخدام الكومة (heap).
الإشارات الذهبية الأربع في Grafana
تحدّد هندسة موثوقية المواقع (SRE) أربع إشارات ذهبية يجب أن تُظهرها كل لوحة معلومات: زمن الاستجابة (p50/p95/p99 لمدة الطلب)، وحركة المرور (الطلبات في الثانية)، والأخطاء (معدل الخطأ كنسبة مئوية من إجمالي حركة المرور)، والتشبّع (المعالج والكومة واكتمال تجمّع الخيوط). يتيح لك Grafana تأليف تعبيرات PromQL في لوحات وضبط عتبات التنبيه. نقطة بداية شائعة هي استيراد لوحة معلومات Spring Boot Statistics الرسمية (معرّف Grafana 6756) التي تغطي JVM وتجمّع HikariCP ومقاييس خادم HTTP جاهزة.
الخلاصة
يوفر Micrometer واجهة برمجية محايدة للموردين على كل أنواع المقاييس. يضيف micrometer-registry-prometheus نقطة نهاية للاستطلاع؛ يسحبها Prometheus وفق جدول زمني ويصوّر Grafana البيانات. سجّل العدّادات للأحداث والمؤقتات للزمن والمقاييس للحالة الراهنة. احمِ نقطة نهاية المحرّك — لا تكشفها للعموم أبدًا. ابنِ لوحات المعلومات حول الإشارات الذهبية الأربع. مجتمعةً مع التتبع الموزع من الدرس السابق، أصبح لديك الآن مكدس قابلية الملاحظة الكامل الذي تتطلبه خدمة مصغّرة في الإنتاج.