مراقبة تطبيقات JavaScript: المقاييس والتنبيهات من الألف إلى الياء
\n\nفي عالم التطوير الحديث، لا يكفي مجرد كتابة كود يعمل. من المهم جدًا فهم كيفية تصرف تطبيقك في بيئة الإنتاج. مراقبة تطبيقات JavaScript (خاصة على Node.js) ليست مجرد موضة، بل ضرورة. فهي تسمح لك بتحديد نقاط الضعف، ومنع الأعطال، وضمان توفر الخدمات العالي. في هذه المقالة، سنستعرض الدورة الكاملة: من جمع المقاييس الرئيسية إلى إعداد التنبيهات، باستخدام مجموعة أدوات حديثة.
\n\nلماذا تعتبر مراقبة Node.js مهمة؟
\nتطبيقات Node.js غالبًا ما تعمل في وضع غير متزامن، معالجة آلاف الطلبات في الثانية. بدون مراقبة، أنت تخاطر بـ:
\n- \n
- تفويت تسرب الذاكرة (memory leak) الذي قد يؤدي إلى انهيار الخادم. \n
- عدم ملاحظة زيادة وقت الاستجابة (latency)، مما يضعف تجربة المستخدم. \n
- فقدان البيانات بسبب أخطاء غير معالجة. \n
نظام المراقبة يمنحك الرؤية (visibility) ويسمح لك باتخاذ القرارات بناءً على البيانات، وليس التخمينات.
\n\nالمقاييس الرئيسية لتطبيقات JavaScript
\nيمكن تقسيم جميع المقاييس إلى ثلاث مجموعات: مقاييس البنية التحتية، مقاييس الأعمال، ومقاييس التطبيق. دعنا نستعرضها بالتفصيل.
\n\n1. مقاييس البنية التحتية (طريقة USE)
\nهذه هي المؤشرات الأساسية لصحة الخادم: وحدة المعالجة المركزية (CPU)، الذاكرة، القرص، الشبكة. بالنسبة لـ Node.js، تعتبر الذاكرة (heap، non-heap) وعدد واصفات الملفات المفتوحة مهمة بشكل خاص.
\n\n2. مقاييس التطبيق (طريقة RED)
\nطريقة RED (المعدل، الأخطاء، المدة) هي المعيار الذهبي للخدمات المصغرة:
\n- \n
- المعدل (Rate): عدد الطلبات في الثانية (RPS). \n
- الأخطاء (Errors): النسبة المئوية للطلبات التي انتهت بخطأ (4xx، 5xx). \n
- المدة (Duration): وقت تنفيذ الطلب (النسب المئوية p50، p95، p99). \n
3. مقاييس الأعمال
\nخاصة بمنتجك: عدد المستخدمين المسجلين، الطلبات المكتملة، الجلسات النشطة، إلخ.
\n\nجمع المقاييس باستخدام Prometheus و Node.js
\nPrometheus هو المعيار الفعلي لجمع المقاييس. لـ Node.js، نستخدم مكتبة prom-client. لنستعرض مثالاً على الإعداد.
التثبيت والإعداد الأساسي
\nnpm install prom-client express\n\nلننشئ خادمًا مع نقطة نهاية /metrics:
const express = require('express');\nconst client = require('prom-client');\n\nconst app = express();\nconst port = 3000;\n\n// إنشاء سجل المقاييس\nconst register = new client.Registry();\n\n// إضافة مقاييس Node.js الافتراضية\nclient.collectDefaultMetrics({ register });\n\n// إنشاء رسم بياني مخصص لوقت الاستجابة\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'مدة طلبات HTTP بالثواني',\n labelNames: ['method', 'route', 'status'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5]\n});\nregister.registerMetric(httpRequestDuration);\n\n// Middleware لقياس الوقت\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.route?.path || 'غير معروف', status: res.statusCode });\n });\n next();\n});\n\n// نقطة نهاية للمقاييس\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\napp.get('/', (req, res) => {\n res.send('مرحبًا، مراقبة!');\n});\n\napp.listen(port, () => {\n console.log(`التطبيق يستمع على http://localhost:${port}`);\n});\n\nعدادات مخصصة
\nلنضف عداد الأخطاء:
\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',