پایان Monkey-Patching در جاوااسکریپت با TracingChannel
خلاصهٔ کاملتر
همهی ابزارهای مانیتورینگ (APM) در دنیای جاوااسکریپت — از Sentry گرفته تا بقیه — برای رصد عملکرد کتابخانهها از تکنیکی به اسم monkey-patching استفاده میکنن. یعنی وقتی کد اجرا میشه، ابزار APM خودش رو وسط require() و import میانداخت و کتابخانه رو دستکاری میکرد. این روش با ECMAScript Modules (ESM) میشکنه، با باندلرها تداخل داره، فقط روی Node.js کار میکنه، و اگه SDK قبل از کتابخانه لود نشه، کل ماجرا بیسر و صدا شکست میخوره.
راهحل، TracingChannel هست — یه API داخلی از ماژول diagnostics_channel که از Node 18 در دسترسه. ایدهاش سادست: کتابخانه رویدادهای ساختاریافته منتشر میکنه («یه query شروع شد»، «query تموم شد») و هر ابزار APM بدون هیچ پچکاری میتونه گوش بده. وقتی کسی گوش نمیده، سربار صفره. روی Node، Bun و Deno کار میکنه و با باندلرها هم مشکلی نداره.
// Library side (e.g. inside mysql2)
import { tracingChannel } from 'diagnostics_channel';
const queryChannel = tracingChannel('mysql2:query');
queryChannel.tracePromise(async () => {
return await connection.query(sql);
}, { query: sql, serverAddress: host, serverPort: port });این کد کمی به کتابخانه اضافه میشه، اما هزینهاش برای نگهدارندهها ناچیزه. در عوض، هر APM tool فقط باید subscribe کنه و span بسازه — نه IITM، نه RITM، نه loader hook، نه وابستگی به ترتیب اجرا.
با این حال، مشکل اینه که همه موافقن TracingChannel آیندهی observability در جاوااسکریپته، ولی کسی push جدی برای adoption اکوسیستمی نمیکرد. تیم Sentry تصمیم گرفت این کار رو خودش انجام بده: به جای اینکه فقط پیشنهاد بده، مستقیم پیشنهاد پیادهسازی میده، کد مینویسه، تست میکنه و تا merge شدن کنارشه. این رویکرد با کتابخانههای اکوسیستم unjs مثل h3 و srvx اثبات شد.
برای مقیاس دادن به این کار از Claude Code استفاده شده. AI وظیفه داره معماری داخلی کتابخانه رو تحقیق کنه، پیشنهاد بنویسه، پیادهسازی با تست تولید کنه و فیدبک review رو دستهبندی کنه. تصمیمهای معماری، شناسایی نقاط درج، و تمام ارتباط با نگهدارندهها کاملاً انسانی باقی مونده. هر commit هم به صورت شفاف co-authored با AI علامتگذاری میشه.
تا الان ۱۰ کتابخانه این تغییر رو merge کردن، از جمله mysql2، node-redis و ioredis که با هم بیش از ۶۰ میلیون دانلود هفتگی دارن. ۳۴ کتابخانه دیگه در صف هستن. PRهای باز روی Express، PostgreSQL، Knex و GraphQL وجود داره و MongoDB، Prisma و Hono هم در حال بررسی هستن. هدف نهایی اینه که یه mapper registry مشترک ساخته بشه که رویدادهای TracingChannel رو به span های استاندارد OpenTelemetry تبدیل کنه — تا هر APM tool بتونه بدون هیچ کد اضافهای از اون استفاده کنه.
نکات کلیدی:
- Monkey-patching در جاوااسکریپت با ESM، باندلرها و runtime های غیر Node مشکل داره
- TracingChannel یه API داخلی Node 18+ هست که کتابخانهها میتونن رویداد منتشر کنن و APM ها subscribe کنن
- سنتری داره این تغییر رو در ۴۴ کتابخانهی پرمصرف پیش میبره و از Claude Code برای تسریع کمک میگیره
- تا الان mysql2، node-redis و ioredis این قابلیت رو دارن
- هدف نهایی: mapper registry مشترک که instrumentation رو برای همهی APM toolها خودکار کنه




