مراقبة تطبيقات JavaScript (Node.js): المكتبات والأدوات
في تطوير الويب الحديث، مراقبة تطبيقات Node.js ليست مجرد خيار، بل ضرورة. بدونها، لا يمكن ضمان الاستقرار والأداء والكشف السريع عن الأخطاء. في هذه المقالة، سنقوم بتحليل مفصل للأدوات والمكتبات الرئيسية لبناء نظام قابلية الملاحظة (observability) في بيئة Node.js.
لماذا نحتاج إلى مراقبة Node.js؟
Node.js هي بيئة أحادية الخيط مع إدخال/إخراج غير محظور. هذا يعني أن خطأ واحدًا أو تسربًا للذاكرة يمكن أن يشل التطبيق بأكمله. تساعد المراقبة في:
- تتبع المقاييس (وحدة المعالجة المركزية، الذاكرة، عدد الطلبات، وقت الاستجابة).
- اكتشاف الحالات الشاذة (الارتفاع المفاجئ في الأخطاء، انخفاض الأداء).
- إجراء التنميط (اختناقات الكود، تسربات الذاكرة).
- إعداد التنبيهات (إشعارات في Slack، Telegram، البريد الإلكتروني).
المكتبات الرئيسية لمراقبة Node.js
1. عميل Prometheus (prom-client)
هذا هو المُصدر القياسي للمقاييس لـ Node.js، المتوافق مع نظام جمع المقاييس الشهير Prometheus. تسمح المكتبة بإنشاء عدادات مخصصة، رسوم بيانية ومقاييس إجمالية.
const client = require('prom-client');const express = require('express');const app = express();
// إنشاء عداد الطلباتconst httpRequestsTotal = new client.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'route', 'status']});
// Middleware لجمع المقاييسapp.use((req, res, next) => { const start = Date.now(); res.on('finish', () => { httpRequestsTotal.inc({ method: req.method, route: req.route?.path || 'unknown', status: res.statusCode }); }); next();});
// نقطة نهاية لـ Prometheusapp.get('/metrics', async (req, res) => { res.set('Content-Type', client.register.contentType); res.end(await client.register.metrics());});
app.listen(3000);2. OpenTelemetry لـ Node.js
OpenTelemetry هو معيار حديث لجمع القياسات عن بعد (التتبع، المقاييس، السجلات). بالنسبة لـ Node.js، تتوفر الحزمة @opentelemetry/sdk-node. تقوم بأتمتة تزويد المكتبات الشائعة (Express، HTTP، gRPC) وجمع التتبعات الموزعة.
const { NodeSDK } = require('@opentelemetry/sdk-node');const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-node');const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const sdk = new NodeSDK({ traceExporter: new ConsoleSpanExporter(), instrumentations: [getNodeAutoInstrumentations()]});
sdk.start();
// مثال على التتبع التلقائي لـ Expressconst express = require('express');const app = express();app.get('/', (req, res) => res.send('Hello'));app.listen(3000);3. PM2 — مدير العمليات مع المراقبة
PM2 لا يدير فقط تشغيل عمليات Node.js، بل يوفر أيضًا مراقبة مدمجة. الأمر pm2 monit يعرض وحدة المعالجة المركزية والذاكرة وعدد مرات إعادة التشغيل في الوقت الفعلي. للمراقبة المتقدمة، استخدم pm2-plus أو pm2-metrics.
// ecosystem.config.jsmodule.exports = { apps: [{ name: 'my-app', script: 'app.js', instances: 2, exec_mode: 'cluster', env: { NODE_ENV: 'production' } }]};4. Clinic.js — التنميط والتشخيص
Clinic.js هي مجموعة أدوات للتحليل العميق لأداء Node.js. تتضمن Doctor (تشخيص سريع)، Bubbleprof (تأخيرات غير متزامنة) و Flame (مخطط اللهب لوحدة المعالجة المركزية).
// التثبيت: npm install -g clinic// التشغيل مع التنميط