مراقبة Node.js وأداء التطبيقات (APM)
تتبعات Node.js تنقطع عند كل await. وكيل ARMS من علي بابا يعيد تجميعها
تعمل خدمات Node.js الآن كواجهات خلفية للتطبيقات الأمامية (BFFs) وبوابات وطبقات تنسيق للذكاء الاصطناعي، لذا يعبر الطلب الواحد قواعد البيانات وذاكرة التخزين المؤقت والطوابير واستدعاءات LLM. يدمج وكيل ARMS Node.js من Alibaba Cloud تتبعات OpenTelemetry وفحوصات سلامة وقت التشغيل ومراقبة الذكاء الاصطناعي في حزمة npm واحدة.
Emmanuel Fabrice Omgbwa Yasse بمساعدة الذكاء الاصطناعي
2026-08-05 · قراءة 5 دقائق

يبلّغ مستخدم أن «المساعد الذكي استغرق وقتًا طويلًا جدًا في الرد هذه المرة». تُظهر واجهة API المدخلة زمن استجابة مرتفعًا. لا تُظهر قاعدة البيانات أي استعلام SQL بطيء. معدل إصابة Redis طبيعي. السجلات نظيفة. كانت هذه القائمة المرجعية تكفي لإغلاق القضية. أما في خدمة Node.js تنسّق وكلاء الذكاء الاصطناعي، فقد يكون التفسير مختبئًا في أي مكان: داخل استدعاء أداة من LangChain، أو في ارتفاعٍ في زمن وصول النموذج إلى أول رمز (TTFT)، أو في حجبٍ يستمر 200 ميلي ثانية على حلقة الأحداث.
هذا السيناريو هو السبب في وجود وكيل ARMS Node.js من Alibaba Cloud، وهو يستهدف مشكلة لم تُبنَ أدوات مراقبة الأداء (APM) من أجلها. لم تعد خدمات Node.js تكتفي باستقبال الطلبات والاستعلام من قواعد البيانات وإرجاع JSON. فهي تعمل كواجهات خلفية للتطبيقات الأمامية (BFF)، وبوابات API، ومحاور اتصال لحظي، ومستهلكاتٍ للطوابير، وطبقات تنسيق لوكلاء الذكاء الاصطناعي. يمكن للطلب الواحد أن يعبر HTTP وقواعد البيانات وذاكرة التخزين المؤقت وRPCs وطوابير الرسائل وموارد وقت التشغيل ونماذج اللغة الكبيرة. لم يكن النقص يومًا في بيانات المراقبة، بل في السياق.
مشكلة تقارب التتبعات
عندما تقع Node.js بين المستخدم وكل تبعية في اتجاه المصب، يظهر أي بطء في نقطة الدخول كمشكلة Node.js حتى لو كان السبب الجذري في قاعدة البيانات أو ذاكرة التخزين المؤقت أو استدعاء RPC في اتجاه المصب أو استدعاء نموذج. تصميم بيئة التشغيل نفسها يجعل الربط أصعب. بُنيت Node.js حول Promises وasync/await والمؤقتات ودوال الاستدعاء (callbacks) وحلقة الأحداث، وكلٌّ من هذه موضع يمكن أن يضيع فيه معرّف التتبعة. فبمجرد فقدان المعرّف عبر حدٍّ غير متزامن، تتفكك التتبعة إلى أجزاء، ولا تبقى سوى أجزاء معزولة (spans) وسجلات متناثرة.
لماذا تظهر صحة وقت التشغيل في زمن استجابة API

لا يكون زمن الاستجابة البطيء دائمًا نتيجة استعلام SQL بطيء. فقد يكون حلقة أحداث محجوبة بعمل متزامن لمدة 200 ميلي ثانية، أو كومة V8 تتصاعد باستمرار حتى ترتجف عملية جمع القمامة (garbage collection)، أو استخدامًا غير طبيعي لوحدة المعالجة المركزية، أو استنفاد عمليةٍ لمواردها. لا تستطيع سجلات API التقليدية الإجابة عن السؤال عما إذا كانت بيئة التشغيل نفسها سليمة. يجمع الوكيل مقاييس وقت التشغيل عبر MeterManager ويبلغ عنها مضغوطة بتقنيتي gzip وprotobuf، بحيث يمكنك السؤال عن أي تتبعة بطيئة وعن سبب بطء الخدمة بأكملها معًا. عدد الخيوط المُبلَّغ عنه تقديري يعتمد على نوى وحدة المعالجة المركزية وحجم تجمع خيوط libuv، وهو مخصص لمراقبة الاتجاهات لا للقيم الدقيقة.
استدعاءات الذكاء الاصطناعي هدف مراقبة جديد
تتحول Node.js إلى الطبقة الخادمية لتطبيقات الذكاء الاصطناعي. تبني الفرق خدمات عملاء ذكية ومساعدي برمجة ووكلاء تحليل بيانات وأدوات إنتاجية داخلية بالاعتماد على OpenAI SDK وLangChain.js وLangGraph وVercel AI SDK وAnthropic Claude SDK. أصبح الطلب الآن HTTP إضافة إلى قاعدة بيانات واستدعاءات نماذج وتنسيقًا وبثًا واستدعاءات أدوات وتضمينات (embeddings) وعمليات بحث RAG.
تغطي القياسات المدمجة للذكاء الاصطناعي في الوكيل تلك الأطر وتثري التتبعات بدلالات الذكاء الاصطناعي التوليدي (GenAI): استدعاءات النماذج، واستهلاك الرموز (tokens)، والاستجابات المتدفقة، واستدعاءات الأدوات، وتفاصيل الأخطاء. والنتيجة أن لا أحد يضطر إلى الربط بين سجلات منصة النماذج وسجلات الأعمال وسجلات التتبعات للإجابة عن سؤال واحد حول استعلام مستخدم واحد.
حزمة npm واحدة، ثلاثة مسارات تكامل
الحزمة هي @loongsuite/cms_node_sdk، حيث «cms» اصطلاح تسمية قديم؛ وعلى مستوى المنتج تعمل كوكل ARMS Node.js. وهي مبنية على نموذج بيانات OpenTelemetry الأساسي وموصولة من طرف إلى طرف بـARMS. مشاريع CommonJS تحمّلها مسبقًا، ومشاريع ESM تستخدم خطاف تحميل (load hook)، والمشاريع التي تريد تحكمًا صريحًا تشغّل SDK داخل الكود:
# CommonJS: preload before the app starts
export ARMS_APP_NAME=your-app
export ARMS_REGION_ID=cn-hangzhou
export ARMS_LICENSE_KEY=your-license-key
node -r @loongsuite/cms_node_sdk/register app.js
# ESM: loader injection
node, experimental-loader=@loongsuite/cms_node_sdk/import-hooks app.mjs
const { NodeSDK } = require('@loongsuite/cms_node_sdk');
const sdk = new NodeSDK({
serviceName: 'your-app',
licenseKey: 'your-license-key',
regionId: 'cn-hangzhou',
workspace: 'your-workspace',
});
sdk.start();
يستخدم مسار ESM أداة import-in-the-middle لاعتراض الوحدات، وتنصح الوثائق بالتحقق من تسلسل تحميل الوحدات في بيئة اختبار إذا كان مشروعك يجمع بين عدة محمّلات. يجب أن يُشغَّل المسار البرمجي قبل استيراد أي وحدة أعمال، وإلا فلن تخضع وحدات HTTP وقواعد البيانات وذاكرة التخزين المؤقت للقياس. يحقن الوكيل أيضًا سياق التتبعة في أدوات التسجيل مثل Console وPino وWinston وBunyan، بحيث يمكن الاستعلام عن السجلات والتتبعات معًا.
يعتمد السياق على AsyncLocalStorage افتراضيًا، ولا يتراجع إلى AsyncHooks إلا على بيئات التشغيل الأقدم، لذا تنجو الأجزاء (spans) من الـPromises ودوال الاستدعاء والمؤقتات. يتيح نشر W3C Trace Context وBaggage لخدمة Node.js الانضمام إلى خدمات Java أو Go أو Python في طوبولوجيا واحدة بدلًا من أن تقف منفردة. تغطي القياسات المدمجة المسارات التي يلمسها عمل Node.js الخادمي فعليًا:
| الفئة | الأهداف المدعومة |
|---|---|
| الويب والشبكة | HTTP/HTTPS, Express, Koa, Undici, Net, DNS |
| RPC والاتصال اللحظي | gRPC, Socket.IO |
| قواعد البيانات | MySQL, MySQL2, PostgreSQL, MongoDB, Mongoose |
| ذاكرة التخزين المؤقت | Redis, ioredis |
| طوابير الرسائل | Kafka |
المفاضلة: لبنات بناء مقابل منتج مكتمل
أوضح طريقة لقراءة هذا الوكيل هي اعتباره قرارًا على مستوى المنتج بشأن OpenTelemetry. يوفر المعيار مفتوح المصدر لبنات البناء، لكن يظل على شخصٍ ما اختيار المُصدِّر (exporter) وضبط المعاينة (sampling) واختيار الإضافات وتوحيد سمات الموارد وربط السجلات وحل مشكلة مراقبة الذكاء الاصطناعي. يجيب وكيل ARMS عن هذه الأسئلة مسبقًا ويجعل الإجابات قابلة للتعديل من لوحة التحكم: فهو يسحب الإعدادات عن بُعد بعد نحو 60 ثانية من بدء التشغيل وكل 60 ثانية بعد ذلك، دون الحاجة إلى إعادة تشغيل. خلال ذروات الحركة يمكنك خفض معدل المعاينة، أو تعطيل إضافة تتعارض مع إصدار مكتبة عمل، أو رفع المعاينة لجلسة تصحيح أخطاء ثم التراجع عنها لاحقًا.
تغطي أدوات APM التقليدية واجهات API وقواعد البيانات لكنها غالبًا ما تتجاهل استدعاءات الذكاء الاصطناعي؛ وتتعقب أدوات مراقبة الذكاء الاصطناعي المطالبات (prompts) والرموز (tokens) وتتبعات النماذج لكنها تفتقر إلى مقاييس وقت التشغيل وميزات APM الأساسية. هذا الوكيل هو محاولة علي بابا للجمع بين الاثنين في حزمة واحدة. تصميمه منخفض التدخل عمدًا: تصدير مجمّع، ونقل مضغوط، ومعاينة، ومفاتيح تبديل للإضافات، وحماية من الاستثناءات بحيث لا تؤثر أعطال القياس على تدفق الأعمال، وإيقاف تشغيل نظيف يفرّغ البيانات المخزنة مؤقتًا عند استقبال SIGINT وSIGTERM. المتطلبات متواضعة: Node.js 16.x أو أحدث، و18 أو 20 LTS للإنتاج، ومفتاح ترخيص ARMS (LicenseKey) ومعرّف منطقة.
الطرح هو أن مراقبة Node.js ينبغي أن تكون ببساطة تثبيت حزمة npm. بالنسبة إلى الفرق الموجودة أصلًا داخل النظام البيئي للمراقبة في Alibaba Cloud، فهو وكيل جاهز للتشغيل فورًا بدلًا من حزمة مكونات يتعين تجميعها. أما ما إذا كانت الفرق التي تدير OpenTelemetry ذاتيًا تنظر إلى وكيل مرتبط بـARMS بوصفه ترقية أم احتجازًا (lock-in)، فهو السؤال الذي يتركه إطار البائع نفسه مفتوحًا.
- المصدر : Node.js traces break at every await. Alibaba's ARMS agent stitches them back — 2024-08-14
أهم أخبار التقنية في 3 دقائق كل صباح
بريد إلكتروني واحد، كل يوم عمل، بما يهم فعلاً في الذكاء الاصطناعي والتقنية.