چیتشیت
OpenTelemetry هوش مصنوعی مولد و مشاهدهپذیری ایجنتها
OpenTelemetry GenAI and Agent Observability
Emit gen_ai.* spans, sample traces, export metrics, pick a platform and debug a trace. Stdlib code from the lessons.
فهرست مطالب
سلسلهمراتب اسپنهای ایجنت
معماریاتریبیوتهای لازم برای تنظیم
مفهومهاgen_ai.operation.namechat،embeddings،execute_tool،invoke_agent.gen_ai.provider.nameopenai،anthropic،aws.bedrock،google.vertex.gen_ai.request.model- مدلی که درخواست میکنید.
gen_ai.response.model- مدلی که به فراخوانی پاسخ داد. مسیریابی میتواند آن را تغییر دهد.
gen_ai.usage.input_tokens- توکنهای ورودی.
gen_ai.usage.output_tokensتوکنهای خروجی را مشخص میکند. gen_ai.response.id- شناسه پاسخ ارائهدهنده برای همبستگی.
gen_ai.tool.name- ابزار.
gen_ai.tool.call.idنام یک فراخوانی را مشخص میکند. gen_ai.data_source.id- پیکره متنی یا منبع دادهای که یک مرحله RAG آن را خوانده است.
تجهیز در کد
کار و کد| وظیفه | کد |
|---|---|
| شروع یک اسپن فرزند | start_span(name, kind, parent=root) |
| ساخت یک traceparent | f"00-{mcp_span.trace_id}-{mcp_span.span_id}-01" |
| ذخیره محتوا به عنوان ارجاع | tracer.add_content(chat, key, prompt) |
| قراردادن کار درون یک اسپن | with builder.span(name, attributes=..., parent=...) |
| نوشتن یک اسپن در هر خط | JSONLExporter(path=trace_path) |
| شمارش فراخوانی ابزارها | metrics.counter("tools_called_total") |
| تولید متن Prometheus | prometheus_exposition(registry) |
| نمونهبرداری در یک خروجیگیر | makeSamplingExporter(consoleExporter, 0.05) |
سازندهی اسپن با متریکها
کدpython
metrics = MetricsRegistry()
builder = SpanBuilder(exporters=[jsonl, in_mem], metrics=metrics)
with builder.span("gen_ai.chat", attributes={GEN_AI_SYSTEM: "anthropic",
GEN_AI_OPERATION_NAME: "chat"}, kind="CLIENT") as chat_span:
chat_span.attributes[GEN_AI_USAGE_INPUT_TOKENS] = 412
with builder.span("gen_ai.tool.execution", parent=chat_span,
attributes={GEN_AI_TOOL_NAME: "read_file"}) as tool1:
tool1.attributes[GEN_AI_TOOL_RESULT_BYTES] = 1024
print(prometheus_exposition(metrics)) # tools_called_total، tool_latency_ms
اجرای درسها
دستورها| دستور | کاری که انجام میدهد |
|---|---|
python code/main.py | درس 13.20 اسپنهای یک ردگیری محاسبات را چاپ میکند |
OTEL_CAPTURE_CONTENT=1 python code/main.py | رویدادهای پرامپت و تکمیل را اضافه میکند |
python3 code/main.py | درس 14.23 درخت اسپن و منبع ذخیره محتوا را چاپ میکند |
python3 -m pytest code/tests/ -v | درس 19.28 رفتوبرگشت و باکتها را بررسی میکند |
npm start | 1200 اسپن مصنوعی را مقداردهی اولیه کرده و تجمیع را چاپ میکند |
npm run serve | دریافت داده و داشبورد را روی PORT سرو میکند |
دیباگ یک ردگیری محاسبات: agent-trace-debugger
گامبهگام- `parseTrace`یک شیء JSON در هر خط. یک خط نامعتبر همراه با شماره خطش متوقف میشود.
- `validateTree`شناسه تکراری، چرخه، والد مفقود و فرزند خارج از محدوده والد را رد میکند.
- `unionDuration`بازههای زمانی دارای همپوشانی فرزندان را merge میکند، نه جمع جبری.
- `analyze`زمان اختصاصی برابر است با زمان کل منهای اجتماع فرزندان.
- `analyze`اتریبیوت
slowestنام اسپن با بیشترین زمان اختصاصی را مشخص میکند. - `render`فایل HTML مستقل با نامهای escape شده و رنگبندی خطا مینویسد.
- cli.tsفلگ
--baselineمقادیرwall_time_delta_ms،token_deltaوerror_deltaرا اضافه میکند.
دستورات دیباگر ردگیری محاسبات
کدbash
python3 scripts/project_test.py agent-trace-debugger --init learning-artifacts/agent-trace-debugger
python3 scripts/project_test.py agent-trace-debugger --stage 1 --path learning-artifacts/agent-trace-debugger --strict
python3 scripts/project_test.py agent-trace-debugger --all --solution --strict
node cli.ts --input samples/trace.jsonl --baseline samples/before.jsonl --output trace.html --json trace.json
node cli.ts --format otlp --input samples/otlp.json --output otlp-trace.html --json otlp-trace.json
پیشفرضها و ارقام
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
OTEL_CAPTURE_CONTENT | "0" | برای ثبت پرامپت و تکمیل مقدار 1 را تنظیم کنید |
`TailSampler` `sample_rate` | 0.10 | خطاها و ارزیابیهای PII همیشه حفظ میشوند |
`ObservabilityStore` capacity | 10_000 | بافر حلقوی از اسپنها |
PORT | 8011 | برای راهاندازی سرور HTTP مقدار SERVE=1 را تنظیم کنید |
High-cost span | totalTokens > 8000 | همیشه توسط خروجیگیر نمونهبرداری نگهداری میشود |
--format | jsonl | همچنین otlp. فایلهای خط مبنا به فرمت JSONL باقی میمانند |
--output | trace.html | --json فایل گزارش را مینویسد |
عیبیابی
عیبیابیاطلاعات هویتی (PII) و اسرار درون ردگیری محاسبات
- علت
- پرامپتهای کامل درون اسپنها ضبط شدهاند
- راهحل
- محتوا را بیرون ذخیره کنید و شناسههای ارجاع را روی اسپنها قرار دهید
خراب شدن داشبورد چند ارائهدهندهای
- علت
- عدم وجود
gen_ai.provider.name - راهحل
- آن را روی هر اسپن LLM تنظیم کنید
اسپنهای ابزار رهاشده و بدون والد
- علت
- اسپنهای بدون پیوند والد
- راهحل
- همیشه بافت (context) را منتشر کنید
تغییر نام اتریبیوتها هنگام ارتقا
- علت
- عدم استفاده از اختیاریسازی پایداری
- راهحل
OTEL_SEMCONV_STABILITY_OPT_INرا تنظیم کنید
سرور MCP در ردگیری محاسبات نیست
- علت
- ارتباط Stdio هدرهای HTTP را حمل نمیکند
- راهحل
- مقدار traceparent را در
_metaهر درخواست قرار دهید
عدم امکان ریشهیابی افت کارایی (regression)
- علت
- نسخههای پرامپت به ردگیری محاسبات متصل نیستند
- راهحل
- نسخه پرامپت را روی ردگیری محاسبات ثبت کنید
child outside parent- علت
- بازه زمانی فرزند از والد فراتر میرود
- راهحل
- ساعتها را قبل از وارد کردن هماهنگ (نرمالسازی) کنید
انتخاب یک پلتفرم
مقایسه| فاکتور | Langfuse | Phoenix | Opik |
|---|---|---|---|
| مجوز | MIT | Elastic License 2.0 | Apache 2.0 |
| نقطه قوت اصلی برای | مدیریت پرامپت، نشستها | ارتباط RAG، دریفت | بهینهسازی، گاردریلها |
| نسخهبندی پرامپت | بله | خیر | آزمایشهای A/B |
| طرح رایگان | 50K رویداد/ماه | میزبانی شخصی | میزبانی شخصی یا ابری |
| زمان استفاده | همهکاره همراه با پرامپتها | ارزیابی عمیق RAG و دریفت | بهینهسازی خودکار |
پرسشها
پرسش و پاسخ- CLIENT یا INTERNAL؟
- نوع CLIENT از مرز فرایند عبور میکند. INTERNAL مربوط به حلقهی ایجنت و فراخوانی ابزار است.
- کدام نوع
invoke_agent؟ - نوع CLIENT برای سرویسهای ایجنت در مخزن راهدور. نوع INTERNAL برای فریمورکهای درون همان فرایند.
- در مقیاس بالا چه چیزهایی را نگه دارم؟
- 100٪ خطاها، 100٪ موارد پرهزینه، 5٪ موارد موفق.
- چه زمانی دریفت واقعی است؟
- مقدار PSI بالاتر از 0.2 معمولاً نشاندهنده دریفت معنادار است.
- آیا ردگیری محاسبات کافی است؟
- خیر. ردگیری محاسبات بدون ارزیابی صرفاً لاگگیری پرهزینه است.
- کدام متریکها هیستوگرام هستند؟
gen_ai.client.token.usage،gen_ai.client.operation.duration،gen_ai.tool.execution.duration.