تصور کنید یک عامل کدنویس را برای اصلاح یک باگ پیچیده در یک سیستم توزیعشده استخدام کردهاید، اما او هیچ راهی برای دیدن اثر تغییراتش در لحظهی اجرا ندارد. در چنین حالتی، حتی پیشرفتهترین لایهی نظارتی هم اگر نتواند شواهدی ساختاریافته و قابل دسترس در زمان اجرا تولید کند، برای عامل هیچ ارزشی ندارد. آیا یک لایهی نظارتی در کدبیس واقعاً یک حلقهی بازخورد (Feedback Loop) را میبندد؟ برای یک عامل کدنویسی مانند Claude Code یا Codex، پاسخ اغلب «خیر» است؛ چرا که صرفِ وجود یک چارچوب تلهمتری، اگر آن لایه نتواند در زمان اجرا شواهدی ساختاریافته و قابل دسترس تولید کند، یک سیگنال فریبنده است.
به گزارش یک مهندس ارشد، وجود یک چارچوب نظارتی در کدبیس، سیگنالی فریبنده است. او در بررسی سه مخزن کد مختلف — یک اپلیکیشن عامل هوش مصنوعی با Node.js بر بستر AWS Lambda، یک برنامه دسکتاپ Electron و یک SDK و کامپایلر TypeScript — دریافت که ابزارهای استاندارد نظارت بهدلیل شکاف میان «پیادهسازی» و «اجرا»، در کمک به عاملهای هوش مصنوعی شکست میخورند. این بررسی در واقع یک تصویر کلی از محیطهای توسعه و کدبیسها بود، نه ارزیابی محصولات نهایی؛ و در آن از Claude Code برای بازرسی وابستگیها، پیکربندیها و مسیرهای انتخابی اجرا استفاده شد.
همانطور که در تحلیلهای قبلی ما دربارهی امنیت مدلهای بازمتن اشاره کردیم، دسترسی به لایههای زیرساختی بدون داشتن پروتکلهای ارتباطی صحیح، منجر به بنبست میشود. مشکل اصلی، شکاف میان پیادهسازی و اجراست. در یکی از مخازن بررسیشده، یک میانافزار (Middleware) کاملاً مستند، تایپشده و اکسپورتشده برای ردیابی وجود داشت، اما در خط لولهی اجرای برنامه هرگز فعال نشده بود. برای یک عامل کدنویس (Coding Agent) که کد را با دستور grep جستوجو میکند، سیستم «کامل» به نظر میرسید، اما در زمان اجرا هیچ دادهای تولید نمیشد و عامل هیچ راهی برای تأیید صحت منطق خود نداشت. این شکست خاص به OpenTelemetry نبود؛ یک سیستم ردیابی سفارشی در مخزنی دیگر نیز همین شکاف را داشت، جایی که تایپهای ردیابی و قابلیتهای دیباگ وجود داشتند، اما میانافزار به زمان اجرای برنامه متصل نبود.
سه وضعیت نظارتپذیری
بر اساس مستندات این بررسی، توسعهکنندگان اغلب سه وضعیت متمایز از نظارتپذیری را با هم اشتباه میگیرند. برای اینکه توسعه با کمک هوش مصنوعی واقعاً ممکن شود، سیستم باید از این مراحل عبور کند:
- وجود مکانیزم (Mechanism Exists): در این مرحله، SDK نصب شده، کد نوشته شده و زیرساخت پیکربندی شده است. با این حال، وجود یک Collector در حال اجرا کمکی نمیکند اگر برنامه هرگز «اسپن» (Span) تولید نکند، و یک API یکپارچهساز هم مفید نیست اگر هیچ بخشی از کد آن را فراخوانی نکند.
- تولید تلهمتری (Telemetry is Produced): برنامه در حین اجرا واقعاً اسپنها، متریکها و لاگها را ارسال میکند. این نقطه، گذار حیاتی از «وجود داشتن» به «تولید کردن» است.
- کاربردپذیری برای عامل (Agent-Usable): یک عامل هوش مصنوعی میتواند به این دادهها دسترسی داشته باشد، آنها را بخواند و برای تصمیمگیری منطقی تفسیر کند. این وضعیت نهایی است: «عامل میتواند از آن استفاده کند».
تحلیل مخازن و محیطهای مختلف
برای درک بهتر این وضعیتها، بررسیکننده به سه محیط پروژه خاص نگاه کرد که هر کدام سطح متفاوتی از بلوغ در OTel را نشان میدادند:
اپلیکیشن عامل هوش مصنوعی:
- وضعیت: عدم استفاده مستقیم از OTel.
- مکانیزم: تکیه بر لاگهای ساختاریافته، متریکهای ابری، ردیابیهای X-Ray و سوابق حسابرسی.
- مشاهده: علیرغم نبود OTel، این محیط برای عامل راحتترین مورد برای بازرسی بود، زیرا از یک خط لوله داده استفاده میکرد که اجازه میداد دادههای عملیاتی با SQL مجدداً پرسوجو شوند و قراردادهای سطح مخزن را توصیف کنند.
اپلیکیشن دسکتاپ:
- وضعیت: زیرساخت وجود دارد اما خفته است.
- مکانیزم: یک Collector و متغیرهای محیطی مربوطه حضور دارند.
- مشاهده: اپلیکیشن تلهمتری بسیار کمی یا هیچ دادهای به زیرساخت موجود ارسال نمیکرد.
SDK و کامپایلر:
- وضعیت: بهعنوان یک قابلیت اختیاری (Opt-in) پیادهسازی شده است.
- مکانیزم: یکپارچگی با OTel در کد حضور دارد.
- مشاهده: استفاده داخلی همچنان محدود است، به این معنی که مکانیزم وجود دارد اما تلهمتری برای توسعه داخلی تولید نمیشود.

استفاده از OpenTelemetry (OTel) — مثل یک مترجم جهانی که زبانهای مختلف فنی را به یک فرمت واحد تبدیل میکند تا همه سیستمها یکدیگر را بفهمند — ابزاری است که یک چارچوب بدون وابستگی به فروشنده (Vendor-neutral) برای سیگنالها (ردیابیها، متریکها و لاگها) فراهم میکند. اما ارزش واقعی آن برای عاملهای هوش مصنوعی در «معنای مشترک» از طریق کنوانسیونهای معنایی و «علیت مشترک» از طریق انتشار زمینه نهفته است.
ارزش معنای مشترک و علیت
از دیدگاه یک عامل کدنویس، دو سازوکار خاص OTel بهشدت ارزشمند هستند:
۱. کنوانسیونهای معنایی (Semantic Conventions): اینها نه تنها نام ویژگیها، بلکه نوع، معنا و واحدهای اندازهگیری را در دامنههای رایج مانند HTTP، پایگاههای داده، RPC و پیامرسانها استاندارد میکنند. این امر مقدار نامگذاریهای خاص هر پروژه را که مدلهایی مثل Claude Code یا Codex باید استنباط کنند، کاهش میدهد.
۲. انتشار زمینه (Context Propagation): این قابلیت اجازه میدهد زمینه ردیابی (Trace Context) از مرزهای پردازش و شبکه عبور کند. این تضمین میکند که یک درخواست API، یک شغل غیرهمزمان، اجرای یک Worker و یک رویداد حسابرسی بتوانند بهعنوان یک زنجیره علت و معلولی واحد به هم متصل شوند. بدون این قابلیت، لاگهای تکتکه قابل جستوجو هستند اما نمیتوان آنها را به یک عملیات واحد مرتبط کرد تا علت شکست مشخص شود.
شش شرط برای نظارتپذیریِ عاملمحور
برای عبور از پرسش سادهی «آیا OTel داریم یا نه؟»، نویسنده شش شرط اساسی را پیشنهاد میکند تا نظارتپذیری برای یک عامل هوش مصنوعی مفید باشد:
- استانداردسازی: آیا معانی، انواع و واحدهای ویژگیها تعریف شدهاند؟
- انتشار: آیا میتوان یک اجرای واحد را در مرزهای HTTP و محیطهای غیرهمزمان دنبال کرد؟
- قابلیت کشف: آیا ویژگیها و مجموعهدادههای موجود بهصورت برنامهنویسی (Programmatically) قابل فهرست کردن هستند؟
- کنترلپذیری: آیا محدودههای زمانی، محدودیت نتایج و مجوزها بهطور ایمن قابل کنترل هستند؟
- دسترسیپذیری: آیا عامل میتواند دادهها را در حلقه پیادهسازی خود بخواند؟
- قابلیت مقایسه: آیا وضعیت قبل و بعد از یک تغییر را میتوان تحت شرایط یکسان ارزیابی کرد؟
لایههای مختلف پشته (Stack) این شرایط را برآورده میکنند. OTel در استانداردسازی و انتشار برتر است. Collectorها و Backendها پردازش، ذخیرهسازی و کنترلپذیری را فراهم میکنند. سرورهای MCP، ابزارهای CLI و رابطهای SQL از قابلیت کشف و دسترسیپذیری پشتیبانی میکنند و در نهایت، پرسوجوها و مدلهای تحلیلی قابلیت مقایسه را ممکن میسازند.
سلسلهمراتب دسترسی به دادهها
یکی از حیاتیترین یافتهها مربوط به محل قرارگیری دادههاست. عاملهای کدنویس در حلقههای زمانی بسیار کوتاه (در حد چند ثانیه) عمل میکنند. رسیدن به یک رد (Trace) غنی در فضای ابری اغلب نیازمند احراز هویت، تنظیم محیط، دسترسی شبکه و انتظار است که برای یک حلقه توسعه سریع، بسیار کند است.
س سلسلهمراتب دسترسی به ترتیب اولویت عبارت است از:
- اولویت بالا: فایلهای محلی و خروجی استاندارد (stdout) با دسترسی فوری.
- اولویت متوسط: دسترسیهای Read-only از طریق پروتکل زمینه مدل (MCP)، CLI یا SQL.
- اولویت پایین: رابطهای کاربری ابری با احراز هویت (برای محیط عملیاتی ضروری، اما برای حلقههای توسعه بسیار کند).
برای حل این مشکل، پیشنهاد میشود از Exporterهای توسعه OTel استفاده کنید که تلهمتری را مستقیماً در کنسول یا stdout چاپ میکنند (مانند SDK پایتون). Exporter دیباگِ Collector میتواند تلهمتری را بهصورت محلی چاپ کند و توزیع Collector Contrib یک Exporter فایلی فراهم میکند. ابزارهایی مانند otel-tui اجازه بازرسی محلی OTLP را بدون نیاز به Backend میدهند. متصل کردن یک مسیر حالت توسعه (Dev-mode) به فایلهای محلی، از روز اول چیزی برای خواندن در اختیار عامل قرار میدهد.
چالشهای پیادهسازی و شکافهای دامنهای
استانداردهای OTel برای زیرساخت عالی هستند اما در رویدادهای خاص دامنه هوش مصنوعی ضعف دارند. OTel نمیتواند بهطور کامل رویدادهایی مانند موارد زیر را بیان کند:
- رد کردن یک عملیات توسط یک Guard (حفاظ).
- یک اقدام خطرناک که نیاز به تأیید دارد.
- بازگرداندن یک خطای قابل اصلاح توسط سیستم.
- استفاده از یک قطعه شواهد خاص بهعنوان مبنای تصمیمگیری.
- در دسترس شدن یک اقدام بعدی خاص.
اتخاذ OTel نیاز به ویژگیهای سفارشی و قراردادهای طرح (Schema) در سطح مخزن را از بین نمیبرد. در حالی که تلاشها برای کنوانسیونهای مربوط به GenAI در مخزن Semantic Conventions ادامه دارد، یک رد اجرای بومی (Native Execution Trace) همچنان میتواند اطلاعات غنیتری (کدهای اصلاح، انتقال وضعیت، اطلاعات بازپخش) نسبت به یک Span در OTel حمل کند. رویکرد توصیه شده این است که دادههای تخصصی دامنه را در رد بومی نگه دارید و تنها معنای عملیاتی مشترک را بهعنوان یک تصویرسازی تعمدا کاهشیافته (Lossy Projection) به OTel منتقل کنید.
هشدار فنی: مدیریت شناسهها و انتشار
یک مشکل یکپارچهسازی عینی در مخزن SDK و کامپایلر در مورد شناسههای داخلی قابل خواندن برای انسان (مانند trace_0001 یا run_abc) یافت شد. این شناسهها را نمیتوان مستقیماً در فیلدهای traceparent مربوط به W3C برای Trace ID یا Parent ID قرار داد، زیرا مشخصات فنیe exige میکند که Trace ID شامل ۳۲ کاراکتر هگزادسیمال کوچک و Parent ID شامل ۱۶ کاراکتر باشد.
تبدیلهای سادهانگارانه منجر به ایجاد هدرهای نامعتبر میشود (مثلاً 00-0000...trace_0001-run_abc...-01) که گیرندههای استاندارد باید آنها را نادیده بگیرند. این امر باعث میشود انتشار زمینه بهصورت بیصدا شکست بخورد. طراحی صحیح این است که اجازه دهید Tracer شناسههای معتبر OTel را تولید کند و شناسهی اجرای داخلی را بهعنوان یک ویژگی (Attribute) جداگانه در اسپن حفظ کنید تا در زمان پرسوجو قابل پیوستن باشند.
تلهمتری در برابر شواهد حسابرسی
معرفی OTel جایگزینی برای سایر انواع دادهها نیست. هر کدام هدفی متمایز دارند:
- اسپنها (Spans): برای تحلیل تأخیر، خطاها و تحلیل علت و معلول توزیعشده.
- متریکها (Metrics): برای تجمیع، تحلیل روندها و هشدارها.
- لاگها (Logs): برای جستوجوی دقیق رویدادها و استثناها (Exceptions).
- سوابق حسابرسی (Audit Records): برای پاسخگویی، اقدامات حیاتی و اثبات عدم دستکاری.
- ردهای بومی (Native Traces): برای انتقال وضعیت، اصلاحات و بازپخش قطعی (Deterministic Replay).
سوابق حسابرسی که نیاز به تشخیص دستکاری یا بازپخش قطعی دارند، نباید به اسپنهای نمونهبرداریشدهی OTel منتقل شوند. OTel یک لایهی نظارتی است، نه یک دفتر کل حسابرسی (Audit Ledger).
یکپارچهسازی لایهی پرسوجو
تلهمتری استاندارد شده نیازمند یک رابط ایمن است. ظهور سرورهای MCP اجازه میدهد عاملها مستقیماً دادههای نظارتی را پرسوجو کنند. برای نمونه، Grafana و Sentry یکپارچگیهای رسمی MCP را فراهم کردهاند تا دادههای مربوط به خطاها و مسائل را در اختیار عاملهای کدنویس قرار دهند.
با این حال، یک رابط پرسوجو باید همچنان به شش شرط ذکر شده پایبند باشد: نیاز به دسترسی Read-only، محدودههای زمانی قابل کنترل و پرسوجوهای تکرارپذیر تا عامل دچار نویز داده نشود یا باعث کرش کردن سیستم نگردد.
جالب اینجاست که خودِ عامل هم به یک منبع تلهمتری تبدیل میشود. Claude Code از خروجی OTel برای متریکهای خودش (مانند جلسات، مصرف توکن، اجرای ابزارها) از طریق متغیرهای محیطی مانند CLAUDE_CODE_ENABLE_TELEMETRY=1 و OTEL_METRICS_EXPORTER پشتیبانی میکند. رویدادهای حاصل از یک پرامپت واحد، ویژگی prompt.id مشترکی دارند که باعث میشود رفتار عامل برای تیم انسانی با همان استانداردهایی قابل خواندن باشد که عامل برای خواندن سیستم استفاده میکند.
مرزهای داده و تأخیر ابری
هنگام معرفی OTel، سختترین بخش اغلب «مرز دادهها» است. دادههای حساس (مانند URLها، دستورات SQL یا پرامپتها) میتوانند بهطور ناخودآگاه در تلهمتری ظاهر شوند. در حالی که پردازشگرهای Collector (مانند attribute, filter, redaction, transform) میتوانند این دادهها را حذف کنند، اما سپردن تمام مسئولیت به Collector باعث میشود سیاستها در مخزن برنامه نامرئی شوند. پیکربندی Collector باید بهصورت نسخهبندی شده و در کنار اپلیکیشن بررسی شود.
علاوه بر این، تلهمتری ابری یک شکاف زمانی قابل توجه ایجاد میکند: تغییر $
ightarrow$ ساخت $
ightarrow$ استقرار $
ightarrow$ اجرا $
ightarrow$ ارسال $
ightarrow$ دریافت $
ightarrow$ پرسوجو. این فرآیند میتواند از چند ثانیه تا چند دقیقه زمان ببرد. یک چیدمان عملی، سه چرخه را ترکیب میکند:
۱. تستهای محلی قطعی.
۲. فایلهای ردیابی محلی.
۳. تستهای دودهای (Smoke tests) و مقایسههای قبل و بعد در محیط توسعه با استفاده از تلهمتری ابری.
گامهای پیشنهادی برای نقشه راه
نویسنده پیشنهاد میکند بهجای شروع با ابزارنمایی خودکار (Auto-instrumentation) جامع، یک توالی هدفمند را برای اطمینان از وجود یک مسیر حداقلی و کامل دنبال کنید: تولید $
ightarrow$ انتشار $
ightarrow$ ذخیره $
ightarrow$ پرسوجو $
ightarrow$ مقایسه.
- اتصال ابزارنمایی به یک مسیر اجرای واقعی تا تلهمتری واقعاً تولید شود.
- خوانایی خروجیهای توسعه از طریق فایلهای محلی یا stdout.
- انتشار زمینه ردیابی در سراسر HTTP، صفها و Workerها.
- حفظ شناسههای تجاری/اجرایی بهعنوان ویژگیهای جداگانه، نه در داخل شناسههای استاندارد ردیابی.
- تعریف کنوانسیونهای معنایی و ویژگیهای سفارشی بهعنوان قراردادهای سطح مخزن.
- ایجاد سیاستها برای دادههای حساس، کاردینالیتی (Cardinality) و نمونهبرداری.
- ارائه دسترسی Read-only از طریق رابطهای MCP، CLI یا SQL.
- تضمین تکرارپذیر بودن مقایسههای قبل و بعد تحت شرایط یکسان.
بستن حلقه بازخورد نیازمند چیزی فراتر از ابزارنمایی است؛ این امر مستلزم مسیرهای دسترسی، طرحهای دامنه و ارزیابی تکرارپذیر است. OTel فرم نهایی نظارتپذیری برای عاملهای کدنویس نیست، بلکه زبانی مشترک است که تلهمتری را بهاندازه کافی ساختاریافته و تکرارپذیر میکند تا آنها بتوانند از آن استفاده کنند.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو