展开本页目录
开始前准备什么
- 下载本题完整练习包,区分待实现 starter 与作者完成 reference。
- 按README准备本题原生依赖;所有输入均为原创或明确标注的本地fixture。
- 本地练习不需要付费模型Key;真实模型调用未执行,MiniLM题另有明确实际推理说明。
- 准备三类工具
- 创建任务根Span
- 传播HTTP上下文
- 记录真实耗时
- 保留错误关联
- 查看父子关系
- 导出最小字段
原创输入、待完成starter、作者reference及实际运行产物,依README本地准备依赖。
环境要求、具体操作、产物核对与未运行范围。
1. 准备三类工具
输入是一条原创本机任务,依次调用快工具、HTTP远端练习工具和故意失败工具。HTTP 服务仅监听回环地址,不接真实业务请求。
2. 创建任务根Span
使用 NodeTracerProvider 和 SimpleSpanProcessor,先建立 agent.task 根 span。每个工具用 startActiveSpan 创建子 span,确保异步调用期间保留活动上下文。
本地启动与复现
cd reference
npm install
node verify.mjs3. 传播HTTP上下文
发起 localhost HTTP 请求前用 propagation.inject 写入 W3C traceparent,服务端 extract 后创建 remote.lookup。只复制 request_id 字符串并不能代替真正的分布式父子关系。
4. 记录真实耗时
查看原生导出的 durationMs,慢步骤需要真实等待和请求返回后再结束 span。图中的条形长度来自实际 duration,不是预先写好的示意耗时。
5. 保留错误关联
故意失败的工具记录 exception 事件并设置 ERROR。它的 traceId 仍应等于根任务;失败不能丢失上下文而变成另一条无关联请求。
6. 查看父子关系
核对 remote.lookup 的 parentSpanId 指向 tool.remote,三个工具指向 agent.task。本题共五个实际 span,拓扑和状态都从导出器回读。
7. 导出最小字段
结果保存在 records.json,可用阅读器查看时间条。练习只采集声明的虚构 task.id 和路由,没有导出真实密钥;这不是 Langfuse 云平台截图,也未运行实际 LLM 调用。
怎样确认已经完成
- 五个span属于同一trace,remote.lookup父ID指向tool.remote。
- HTTP确实传播traceparent,工具span关联agent.task。
- 真实耗时和异常事件/ERROR可回读,失败工具仍属于本任务。
常见问题
AI任务卡在多个工具之间,怎么知道到底慢在哪一步?
用一条根trace下的各工具span记录真实duration,再看远程HTTP子span的父子关系。不要只给所有步骤打印同一个文本标签。
工具报错为什么会在日志里变成另一条不相关的请求?
跨HTTP请求注入并提取traceparent,错误span继续保留traceId/parentSpanId并记录exception,本题故意失败工具仍属于同一任务。
哪些部分实际运行,哪些需要独立验证?
OpenTelemetry Node SDK实跑五个span和HTTP traceparent传播,父子关系、真实耗时与错误状态均回读。 目标AI助手账号生成、云平台部署和生产环境不在本次执行范围。




