مراقبة تطبيقات JavaScript: المقاييس والتنبيهات في Node.js

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا المراقبة ضرورية لتطبيقات Node.js



تطبيقات الويب الحديثة بلغة JavaScript (Node.js) تعمل تحت أحمال عالية وهياكل موزعة. حتى الكود المكتوب بشكل مثالي قد يتعطل بسبب تسرب الذاكرة، أو انخفاض الأداء، أو أخطاء في العمليات غير المتزامنة. مراقبة تطبيقات JavaScript تتيح ليس فقط اكتشاف المشكلة، بل منعها قبل أن تؤثر على المستخدمين.



في هذه المقالة، سنشرح المقاييس التي يجب تتبعها، وكيفية إعداد جمع البيانات باستخدام أدوات شائعة (Prometheus, Grafana)، وكيفية تنظيم نظام التنبيهات لتطبيقات Node.js. جميع أمثلة الكود مكتوبة بلغة JavaScript وجاهزة للاستخدام.



المقاييس الرئيسية لتطبيقات Node.js



يمكن تقسيم مراقبة تطبيقات Node.js إلى ثلاثة مستويات: البنية التحتية، والتطبيق، ومقاييس الأعمال. سنناقش كل منها.



مقاييس البنية التحتية

تُظهر هذه المقاييس حالة الخادم وبيئة التشغيل:

  • CPU و Memory (RSS, Heap Total, Heap Used) — تسرب الذاكرة وارتفاع تحميل المعالج.
  • Event Loop Lag — تأخير دورة الأحداث (إذا تجاوز 50ms، يبدأ التطبيق في التباطؤ).
  • Garbage Collection (GC) — تكرار ومدة جمع القمامة.
  • File Descriptors — عدد الملفات والمآخذ المفتوحة.


مقاييس التطبيق

تُظهر كيفية معالجة التطبيق للطلبات:

  • RPS (Requests Per Second) — عدد الطلبات في الثانية.
  • Latency (p50, p95, p99) — تأخير الاستجابة.
  • Error Rate — نسبة الأخطاء (4xx, 5xx).
  • Active Connections — عدد اتصالات WebSocket/HTTP النشطة.


مقاييس الأعمال

خاصة بتطبيقك:

  • عدد المستخدمين المسجلين.
  • سرعة معالجة المدفوعات.
  • وقت استجابة واجهات برمجة التطبيقات الخارجية.


جمع المقاييس باستخدام Prometheus و Node.js



Prometheus هو المعيار الفعلي لجمع المقاييس في البنية التحتية الحديثة. بالنسبة لـ Node.js، توجد مكتبة prom-client التي تتيح تصدير المقاييس بسهولة.



تثبيت وتهيئة prom-client

npm install prom-client express


لنقم بإنشاء خادم أساسي مع المقاييس:

const express = require('express');const client = require('prom-client');const app = express();

// إنشاء سجل للمقاييسconst register = new client.Registry();client.collectDefaultMetrics({ register });

// إنشاء رسم بياني مخصص للتأخيراتconst httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'], buckets: [0.1, 0.5, 1, 2, 5]});register.registerMetric(httpRequestDuration);

// Middleware لقياس التأخيراتapp.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status_code: res.statusCode }); }); next();});

// نقطة نهاية للمقاييسapp.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.end(await register.metrics());});

app.get('/', (req, res) => { res.send('Hello World');});

app.listen(3000, () => console.log('Server running on port 3000'));


جمع مقاييس Event Loop

لمراقبة دورة الأحداث، نستخدم process.hrtime() أو مكتبة event-loop-lag:

const eventLoopLag = new client.Gauge({    name: 'nodejs_event_loop_lag_seconds',    help: 'Event loop lag in seconds'});register.re                

المدونات

توصيات الكتب