Node.js 26.7.0 يضيف دعم Perfetto للتتبع
في 5 أغسطس 2026 نزل إصدار Node.js 26.7.0، وفي قائمة "Notable Changes" سطر واحد لا يتجاوز بضع كلمات: add perfetto support (#64565). سطر هادئ ما يلفت النظر، لكنه يمسّ أحد أقدم أجزاء المنصة وأكثرها إهمالاً: طبقة التتبّع.
المشكلة: مخرجات تتبّع من عصر آخر
منذ سنوات، آلية التتبّع المدمجة في Node.js تعمل هكذا:
node --trace-event-categories v8,node,node.async_hooks server.jsوالنتيجة ملف اسمه node_trace.1.log. رغم الامتداد، محتواه JSON بصيغة Trace Event Format القديمة القادمة من Chrome. الصيغة نصية بالكامل، فالملف ينتفخ بسرعة تحت أي حِمل حقيقي، وقارئها التقليدي chrome://tracing أداة متروكة عملياً.
والأهم أن المسألة لم تعد مسألة راحة. في نقاش nodejs/diagnostics#654 طُرح أن V8 — وهو مصدر جزء كبير من بيانات التتبّع: الـ GC والترجمة والتنفيذ — يتجه إلى Perfetto وحده ويتخلى عن آلية التتبّع القديمة. ولأن V8 مدمج في صميم Node.js، فالخياران إما أن تنتقل المنصة معه، أو تفقد تدريجياً أغنى مصدر بيانات لديها.
ما الذي تغيّر
الإصدار 26.7.0 يضيف backend جديداً للتتبّع مبنياً على Perfetto SDK، يُفعَّل وقت البناء:
./configure --with-perfetto
make -j"$(nproc)"وبعدها يبقى الاستعمال كما هو تماماً — نفس الخيارات، ونفس الفئات:
node --trace-event-categories node.perf,node.async_hooks,v8 \
--trace-event-file-pattern '${pid}-${rotation}.pftrace' \
server.jsالفرق في المخرجات: بدل JSON، يكتب Node ملفاً بصيغة protobuf باسم node_trace.1.pftrace يُفتح مباشرة في ui.perfetto.dev. وهناك لا يوجد عرض زمني فقط، بل طبقة استعلام SQL فوق الـ trace تتيح سؤال البيانات بدل تصفّحها يدوياً.
والتحكّم البرمجي لم يتغيّر كذلك:
import { createTracing } from 'node:trace_events';
const tracing = createTracing({
categories: ['node.perf', 'v8'],
});
tracing.enable();
// الشغل اللي تبي تقيسه
await handleRequest(req);
tracing.disable();وهذا التصميم مقصود: التبديل يحصل في الطبقة السفلية، والواجهة التي يعرفها الناس تبقى في مكانها. الفئات نفسها لم تتغيّر أيضاً — node.perf لقياسات Performance API، وnode.async_hooks لتتبّع العمليات غير المتزامنة، وnode.fs.sync وnode.fs.async لعمليات الملفات، وv8 لبيانات المحرّك. ما تغيّر هو أين تنتهي هذه الأحداث وبأي صيغة تُكتب، لا كيف تُجمع.
تحفّظات لا بد من ذكرها
- غير مفعّل في الإصدارات الرسمية. الـ
--with-perfettoخيار بناء يمرّ علىconfigure، أي أن الـ binaries الرسمية اليوم لا تتضمنه. عملياً: بناء خاص، أو انتظار قرار تفعيله افتراضياً. - لا مخرجات JSON في هذا الوضع. الاستبعاد متعمّد. أي أدوات داخلية تقرأ
node_trace.*.logوتحلّله كـ JSON ستحتاج مساراً بديلاً. - تتبّع الـ inspector يُعطَّل. عند تفعيل Perfetto يتوقف مسار NodeTracing عبر الـ inspector، لأن الـ protocol هنا يحتاج تسليم bytes خام لا كائنات protocol.
- لا backport. التغيير محصور في 26.x ولن ينزل على 22.x أو 24.x، و26.x ما زال Current لا LTS.
الخلاصة
قابلية الملاحظة (observability) تتحول من إضافة تُركَّب من الخارج إلى جزء أصيل من الـ runtime نفسه. وملف trace بصيغة protobuf قابل للاستعلام ليس مجرد صيغة أنظف من JSON — هو بيانات تفهمها الأدوات، وتفهمها كذلك الوكلاء البرمجية التي صارت تشارك في تشخيص الأداء. الفرق بين تصفّح ملف JSON بحجم مئات الـ megabytes وبين استعلام SQL على نفس البيانات هو الفرق بين قراءة يدوية بطيئة وتحقيق منظّم.
الخطوة اليوم ما زالت خيار بناء، لكن الاتجاه واضح: مسار التتبّع في Node.js يُعاد تركيبه ليتحدث لغة بقية أدوات النظام. ومن تابع ما وصل في Node.js 26.6 يلاحظ أن إصدارات 26.x تحمل تغييرات بنيوية أكثر من كونها تحسينات سطحية.
المصدر الأساسي: ملاحظات إصدار Node.js 26.7.0، وتفاصيل التنفيذ في PR #64565.