مكتبة prom-client: مراقبة تطبيقات Node.js باستخدام Prometheus
في تطوير الويب الحديث، أصبحت مراقبة أداء التطبيقات وحالتها ضرورة. أحد أشهر الحلول لجمع وتحليل المقاييس هو Prometheus - نظام مفتوح المصدر يجمع البيانات على شكل سلاسل زمنية. للتكامل مع Node.js، توجد مكتبة رسمية prom-client تتيح تصدير المقاييس بسهولة بتنسيق مفهوم لـ Prometheus.
في هذه المقالة، سنشرح بالتفصيل كيفية تثبيت واستخدام prom-client، وما هي أنواع المقاييس المتاحة، وكيفية دمجها مع إطار العمل Express.
التثبيت والاستيراد
للبدء، قم بتثبيت المكتبة عبر npm:
npm install prom-clientبعد التثبيت، قم باستيرادها في تطبيقك:
const prometheus = require('prom-client');const express = require('express');const app = express();الأنواع الرئيسية للمقاييس
تدعم مكتبة prom-client أربعة أنواع رئيسية من مقاييس Prometheus:
- Counter - عداد يزداد فقط (مثل عدد الطلبات).
- Gauge - قيمة يمكن أن تزيد أو تنقص (مثل عدد الاتصالات النشطة).
- Histogram - رسم بياني يقيس توزيع القيم (مثل وقت الاستجابة).
- Summary - إحصاءات موجزة مشابهة لـ Histogram ولكن بكميات أكثر دقة.
مثال: Counter (عداد الطلبات)
لنقم بإنشاء عداد لتتبع العدد الإجمالي لطلبات HTTP:
const httpRequestsTotal = new prometheus.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'route', 'status']});
// Middleware لحساب الطلباتapp.use((req, res, next) => { res.on('finish', () => { httpRequestsTotal.inc({ method: req.method, route: req.path, status: res.statusCode }); }); next();});مثال: Gauge (الاتصالات النشطة)
Gauge مفيد لتتبع الحالة الحالية، مثل عدد المستخدمين النشطين:
const activeUsers = new prometheus.Gauge({ name: 'active_users', help: 'Number of active users'});
app.get('/login', (req, res) => { activeUsers.inc(); // الزيادة عند الدخول res.send('Logged in');});
app.get('/logout', (req, res) => { activeUsers.dec(); // النقصان عند الخروج res.send('Logged out');});مثال: Histogram (وقت الاستجابة)
يسمح Histogram بقياس الوقت المستغرق في معالجة الطلبات:
const httpRequestDuration = new prometheus.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route'], buckets: [0.1, 0.5, 1, 2, 5] // حدود الحاويات بالثواني});
app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.path }); }); next();});تصدير المقاييس لـ Prometheus
لكي يتمكن Prometheus من جمع البيانات، يجب إنشاء نقطة نهاية (عادةً /metrics) تُرجع جميع المقاييس المسجلة:
app.get('/metrics', async (req, res) => { res.set('Content-Type', prometheus.register.contentType); res.end(await prometheus.register.metrics());});
app.listen(3000, () => { console.log('Server running on port 3000');});مقاييس مخصصة مع تسميات
يمكنك إضافة تسميات (labels) لتصفية أكثر تفصيلاً. على سبيل المثال، تقسيم المقاييس حسب إصدارات API:
const apiCalls = new prometheus.Counter({