مقاييس Prometheus في Node.js: مكتبة prom-client
\n\nPrometheus هو نظام مراقبة وتنبيه قوي مفتوح المصدر، يقوم بجمع المقاييس من تطبيقاتك والبنية التحتية. لدمج Prometheus مع تطبيقات Node.js، توجد المكتبة الرسمية والأكثر شيوعًا prom-client. توفر هذه المكتبة أدوات جاهزة لإنشاء وتسجيل وتصدير المقاييس بتنسيق يفهمه Prometheus.
\n\nفي هذه المقالة، سنشرح بالتفصيل كيفية تثبيت واستخدام prom-client، وما هي أنواع المقاييس المتاحة، وكيفية إعداد نقطة نهاية لجمع البيانات.
\n\nتثبيت prom-client
\n\nيتم تثبيت المكتبة باستخدام مدير الحزم القياسي npm:
\n\nnpm install prom-client\n\nبعد التثبيت، يمكنك استيراد المكتبة إلى مشروعك:
\n\nconst client = require('prom-client');\n\nالأنواع الرئيسية لمقاييس Prometheus
\n\nيدعم Prometheus أربعة أنواع رئيسية من المقاييس، كل منها يحل مشكلة محددة:
\n\n- \n
- Counter — عداد يمكنه فقط الزيادة (مثل عدد الطلبات، الأخطاء). \n
- Gauge — قيمة يمكن أن تزيد وتنقص (مثل عدد المستخدمين النشطين، حجم الذاكرة). \n
- Histogram — رسم بياني لقياس توزيع القيم (مثل وقت استجابة الطلبات). \n
- Summary — مشابه للرسم البياني، لكنه يحسب الكميات (quantiles) من جانب التطبيق. \n
أمثلة على استخدام prom-client
\n\nلننظر إلى إنشاء كل نوع من المقاييس باستخدام تطبيق Express بسيط كمثال.
\n\n1. Counter (عداد)
\n\nالعداد مثالي لحساب عدد الأحداث، مثل طلبات HTTP أو الأخطاء.
\n\nconst httpRequestsCounter = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'status']\n});\n\n// الاستخدام:\nhttpRequestsCounter.inc({ method: 'GET', status: 200 });\nhttpRequestsCounter.inc({ method: 'POST', status: 500 });\n\n2. Gauge (مقياس)
\n\nيسمح Gauge بتتبع القيمة الحالية التي يمكن أن تتغير في كلا الاتجاهين.
\n\nconst activeUsersGauge = new client.Gauge({\n name: 'active_users',\n help: 'Number of active users'\n});\n\n// الزيادة بمقدار 1:\nactiveUsersGauge.inc();\n// النقصان بمقدار 1:\nactiveUsersGauge.dec();\n// تعيين قيمة محددة:\nactiveUsersGauge.set(42);\n\n3. Histogram (رسم بياني)
\n\nيساعد الرسم البياني في تحليل توزيع وقت تنفيذ العمليات.
\n\nconst requestDurationHistogram = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duration of HTTP requests in seconds',\n labelNames: ['method', 'route'],\n buckets: [0.1, 0.5, 1, 2, 5] // حدود الحاويات (بالثواني)\n});\n\n// قياس الوقت:\nconst end = requestDurationHistogram.startTimer();\n// ... تنفيذ الطلب ...\nend({ method: 'GET', route: '/api/users' });\n\n4. Summary (ملخص)
\n\nيشبه Summary الرسم البياني، لكنه يوفر كميات دقيقة (مثل الوسيط، المئين 95).
\n\nconst requestDurationSummary = new client.Summary({\n name: 'http_request_duration_summary_seconds',\n help: 'Summary of HTTP request duration in seconds',\n labelNames: ['method', 'route'],\n percentiles: [0.5, 0.9, 0.99] // الكميات للحساب\n});\n\n// الاستخدام مشابه للرسم البياني:\nconst endSummary = requestDurationSummary.startTimer();\n// ... تنفيذ الطلب ...\nendSummary({ method: 'GET', route: '/api/data' });\n\nإعداد نقطة النهاية لـ Prometheus
\n\nلكي يتمكن Prometheus من جمع المقاييس، يجب إنشاء نقطة نهاية HTTP منفصلة (عادةً /metrics) تقوم بإرجاع ال