مراقبة تطبيقات JavaScript: المقاييس والتنبيهات على المستوى المتقدم

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

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

ابدأ الدورة

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

\n

في تطوير الويب الحديث، تجاوزت المراقبة مجرد تسجيل الأخطاء البسيط. بالنسبة لتطبيقات Node.js الحيوية - من الخدمات المصغرة إلى واجهات API عالية التحميل - يلزم جمع استباقي للمقاييس، وتنبيهات ذكية، وتصور للبيانات. على المستوى المتقدم، نحن لا نتحدث فقط عن "التطبيق حي"، بل عن أدائه، ونقاط الاختناق، والتنبؤ بالأعطال.

\n

في هذه المقالة، سنشرح كيفية بناء نظام مراقبة كامل لتطبيق JavaScript (Node.js): من جمع المقاييس المخصصة إلى إعداد التنبيهات عبر Prometheus و Grafana. ستتعلم كيفية استخدام الإمكانيات المدمجة لـ Node.js والمكتبات الحديثة للتتبع الاستباقي لحالة الخدمة.

\n\n

1. جمع المقاييس المتقدمة: من Event Loop إلى العدادات المخصصة

\n

المقياس الأساسي هو وقت استجابة الخادم. المقياس المتقدم هو تأخير Event Loop، وعدد الواصفات النشطة، وتكرار جمع القمامة. دعنا نرى كيفية جمع هذه البيانات باستخدام process ومكتبة prom-client (عميل Prometheus).

\n\n

1.1. مقاييس Event Loop وموارد النظام

\n

Node.js أحادي الخيط، لذا فإن تأخير Event Loop أمر بالغ الأهمية. نقيسه عبر process.hrtime() ونصدره كمدرج تكراري.

\n
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\n

1.2. مقاييس مخصصة لمنطق الأعمال

\n

بالإضافة إلى مقاييس النظام، تتبع مؤشرات الأعمال: عدد الطلبات المعالجة، أخطاء التحقق، وقت تنفيذ الطلبات الخارجية.

\n
const 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\n

2. تصدير المقاييس والتكامل مع Prometheus

\n

لكي يتمكن Prometheus من جمع المقاييس، يجب إنشاء نقطة نهاية /metrics. نستخدم السجل القياسي prom-client.

\n\n

2.1. إنشاء نقطة نهاية للجمع

\n
const 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\n

2.2. تكوين Prometheus

\n

في ملف prometheus.yml، أضف هدفًا لتطبيقك:

\n
scrape_configs:\n  - job_name: 'nodejs-app'\n    static_configs:\n      - targets: ['localhost:3000']
\n

بعد إعادة تشغيل Prometheus، سيتم جمع المقاييس كل 15 ثانية افتراضيًا.

\n\n

3. إعداد التنبيهات: من العتبات البسيطة إلى تحليل الشذوذ

\n

التنبيهات هي رد فعل على خروج المقاييس عن الحدود الطبيعية. على المستوى المتقدم، نستخدم PromQL للشروط المعقدة ونقوم بتكوين القواعد في Alertmanager.

\n\n

3.1. قواعد التنبيهات الأساسية

\n

أنشئ ملف alerts.yml:

\n

المدونات

توصيات الكتب