مقدمة: لماذا تعتبر المراقبة المتقدمة ضرورة لـ Node.js
\nفي تطوير الويب الحديث، تجاوزت المراقبة مجرد تسجيل الأخطاء البسيط. بالنسبة لتطبيقات Node.js الحيوية - من الخدمات المصغرة إلى واجهات API عالية التحميل - يلزم جمع استباقي للمقاييس، وتنبيهات ذكية، وتصور للبيانات. على المستوى المتقدم، نحن لا نتحدث فقط عن "التطبيق حي"، بل عن أدائه، ونقاط الاختناق، والتنبؤ بالأعطال.
\nفي هذه المقالة، سنشرح كيفية بناء نظام مراقبة كامل لتطبيق JavaScript (Node.js): من جمع المقاييس المخصصة إلى إعداد التنبيهات عبر Prometheus و Grafana. ستتعلم كيفية استخدام الإمكانيات المدمجة لـ Node.js والمكتبات الحديثة للتتبع الاستباقي لحالة الخدمة.
\n\n1. جمع المقاييس المتقدمة: من Event Loop إلى العدادات المخصصة
\nالمقياس الأساسي هو وقت استجابة الخادم. المقياس المتقدم هو تأخير Event Loop، وعدد الواصفات النشطة، وتكرار جمع القمامة. دعنا نرى كيفية جمع هذه البيانات باستخدام process ومكتبة prom-client (عميل Prometheus).
1.1. مقاييس Event Loop وموارد النظام
\nNode.js أحادي الخيط، لذا فإن تأخير Event Loop أمر بالغ الأهمية. نقيسه عبر process.hrtime() ونصدره كمدرج تكراري.
const client = require('prom-client');\nconst eventLoopDelay = new client.Histogram({\n name: 'nodejs_event_loop_delay_seconds',\n help: 'تأخير Event Loop بالثواني',\n buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1]\n});\n\nfunction measureEventLoop() {\n const start = process.hrtime.bigint();\n setImmediate(() => {\n const duration = Number(process.hrtime.bigint() - start) / 1e9;\n eventLoopDelay.observe(duration);\n });\n}\nsetInterval(measureEventLoop, 5000);\n\n1.2. مقاييس مخصصة لمنطق الأعمال
\nبالإضافة إلى مقاييس النظام، تتبع مؤشرات الأعمال: عدد الطلبات المعالجة، أخطاء التحقق، وقت تنفيذ الطلبات الخارجية.
\nconst orderCounter = new client.Counter({\n name: 'app_orders_total',\n help: 'إجمالي عدد الطلبات المعالجة',\n labelNames: ['status'] // success, failed\n});\n\n// مثال على الاستخدام في المعالج\napp.post('/api/order', async (req, res) => {\n try {\n await processOrder(req.body);\n orderCounter.inc({ status: 'success' });\n res.send('OK');\n } catch (err) {\n orderCounter.inc({ status: 'failed' });\n res.status(500).send('Error');\n }\n});\n\n2. تصدير المقاييس والتكامل مع Prometheus
\nلكي يتمكن Prometheus من جمع المقاييس، يجب إنشاء نقطة نهاية /metrics. نستخدم السجل القياسي prom-client.
2.1. إنشاء نقطة نهاية للجمع
\nconst express = require('express');\nconst app = express();\nconst client = require('prom-client');\n\n// جمع المقاييس القياسية لـ Node.js\nclient.collectDefaultMetrics({ timeout: 5000 });\n\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', client.register.contentType);\n res.end(await client.register.metrics());\n});\n\napp.listen(3000, () => console.log('خادم المقاييس على :3000'));\n\n2.2. تكوين Prometheus
\nفي ملف prometheus.yml، أضف هدفًا لتطبيقك:
scrape_configs:\n - job_name: 'nodejs-app'\n static_configs:\n - targets: ['localhost:3000']\nبعد إعادة تشغيل Prometheus، سيتم جمع المقاييس كل 15 ثانية افتراضيًا.
\n\n3. إعداد التنبيهات: من العتبات البسيطة إلى تحليل الشذوذ
\nالتنبيهات هي رد فعل على خروج المقاييس عن الحدود الطبيعية. على المستوى المتقدم، نستخدم PromQL للشروط المعقدة ونقوم بتكوين القواعد في Alertmanager.
\n\n3.1. قواعد التنبيهات الأساسية
\nأنشئ ملف alerts.yml:
المدونات
توصيات الكتب
اقرأ أيضًا