المراقبة في JavaScript: التتبع، المقاييس والسجلات لـ Node.js

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

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

ابدأ الدورة

تطبيقك صندوق أسود؟ حان الوقت لإصلاح ذلك

\n\n

هل سبق لك أن أمسكت بنفسك تفكر: "لماذا خدمتي على Node.js بطيئة على الرغم من أن الكود مثالي؟" أو تلقيت شكوى من مستخدم ولكنك لم تستطع فهم ما حدث خطأ؟ مألوف؟ مرحبًا بك في عالم حيث بدون المراقبة في JavaScript تعمل وأنت أعمى.

\n\n

المراقبة (Observability) ليست مجرد كلمة رنانة. إنها نهج يحول كودك من صندوق أسود إلى نظام شفاف. سنتعلم كيف نطرح عليه أسئلة: "من المخطئ؟" (التتبع)، "ماذا يحدث الآن؟" (المقاييس)، و"ماذا حدث أمس في الساعة 3:15؟" (السجلات).

\n\n

في هذه المقالة، سنستعرض الأركان الثلاثة للمراقبة في Node.js: التتبع، المقاييس، والسجلات. ستحصل على أمثلة كود جاهزة وستفهم كيفية تطبيق هذه الممارسات اليوم. هيا بنا!

\n\n

التتبع في JavaScript: رحلة الطلب

\n\n

تخيل أن المستخدم يضغط على زر "إتمام الطلب". هذا الطلب يمر عبر بوابة API، خدمة المصادقة، سلة التسوق، بوابة الدفع، وقاعدة البيانات. إذا تعطل شيء ما - أين تبحث؟ التتبع (أو التتبع الموزع) يمنحك خريطة لهذه الرحلة.

\n\n

ما هو التتبع بكلمات بسيطة

\n\n

التتبع هو طريقة لتتبع مسار طلب معين عبر جميع الخدمات المصغرة والوظائف. كل خطوة هي span، والسلسلة بأكملها هي trace. ترى كم من الوقت استغرقت كل مرحلة وأين حدث الخطأ.

\n\n

OpenTelemetry: معيار المراقبة في JavaScript

\n\n

OpenTelemetry (OTel) هو المعيار الصناعي لجمع التتبعات والمقاييس والسجلات. وهو مدعوم من قبل جميع الخدمات السحابية والأدوات الرئيسية (Jaeger, Zipkin, Grafana).

\n\n

التثبيت:

\n
npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node
\n\n

مثال أساسي للتتبع لتطبيق Express:

\n
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');\nconst { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');\nconst { ConsoleSpanExporter } = require('@opentelemetry/exporter-console');\nconst { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express');\nconst { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');\n\nconst provider = new NodeTracerProvider();\nprovider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));\nprovider.register();\n\nconst { getTracer } = require('@opentelemetry/api');\nconst tracer = getTracer('my-app');\n\n// التتبع التلقائي لـ HTTP و Express\nconst { registerInstrumentations } = require('@opentelemetry/instrumentation');\nregisterInstrumentations({\n  tracerProvider: provider,\n  instrumentations: [\n    new ExpressInstrumentation(),\n    new HttpInstrumentation()\n  ]\n});\n\n// الآن كل طلب سينشئ trace مع spans\nconst express = require('express');\nconst app = express();\n\napp.get('/api/order', async (req, res) => {\n  // span يدوي لمنطق الأعمال\n  const span = tracer.startSpan('processPayment');\n  try {\n    // ... منطقك\n    await new Promise(r => setTimeout(r, 100)); // محاكاة\n    span.setStatus({ code: 1 }); // OK\n  } catch (err) {\n    span.setStatus({ code: 2, message: err.message }); // ERROR\n    throw err;\n  } finally {\n    span.end();\n  }\n  res.send('Order created');\n});\n\napp.listen(3000);
\n\n

الآن في وحدة التحكم سترى بيانات منظمة: أي طلب، كم من الوقت استغرق كل middleware، أين كان الخطأ. هذا هو المراقبة في JavaScript قيد التنفيذ.

\n\n

المقاييس: نبض تطبيقك

\n\n

التتبع جيد للطلبات الفردية، ولكن ماذا عن الصورة العامة؟ كم عدد الطلبات في الثانية؟ ما هو التأخير؟ كم من الذاكرة يستهلك Node.js الخاص بك؟ المقاييس هي المسؤولة عن ذلك.

\n\n

Prometheus والعميل لـ Node.js

\n\n

Prometheus هو المعيار الفعلي لجمع المقاييس. يقوم "بسحب" البيانات من تطبيقك عبر HTTP.

المدونات

توصيات الكتب