تطبيقك صندوق أسود؟ حان الوقت لإصلاح ذلك
\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\nOpenTelemetry: معيار المراقبة في JavaScript
\n\nOpenTelemetry (OTel) هو المعيار الصناعي لجمع التتبعات والمقاييس والسجلات. وهو مدعوم من قبل جميع الخدمات السحابية والأدوات الرئيسية (Jaeger, Zipkin, Grafana).
\n\nالتثبيت:
\nnpm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node\n\nمثال أساسي للتتبع لتطبيق Express:
\nconst { 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\nPrometheus والعميل لـ Node.js
\n\nPrometheus هو المعيار الفعلي لجمع المقاييس. يقوم "بسحب" البيانات من تطبيقك عبر HTTP.