用途 该技能面向需要针对单条 Agent Observability / LLM Obs 追踪(trace)进行快速迭代的开发者:取一条输出不理想的生产 trace,可选地修改代码,然后用本地代码重新运行它,并展示新旧输出的简明差异,重复此过程直到满意。它不假设项目布局,由开发者的编码代理调用,命令为 /agent-observability-replay-trace <trace-id> [<changes to test>]。不带修改时,仅执行重放与差异对比(复现/回归检查),然后提供进入迭代循环的选项。
主要能力
- 从 trace 访问后端获取指定 trace,定位基线字段(不一定是根输出,可能是工具调用输入或深层中间输出)。
- 检查扇出(fan-out):若根 span 展开为重复的兄弟子树,可只重放一个有代表性的分支以节省花费与时间。
- 解析入口点与输入:优先使用 metadata.replay_entrypoint / replay_input,否则从根 span 与代码推断并让用户确认。
- 确保本地运行路径:寻找最内层可调用接缝(callable seam),必要时参考 references/local-setup.md 使仅部署的应用可本地运行。
- 一次性设置两个持久工件:在应用真实入口点写入注解(replay_entrypoint、replay_input),以及满足语言无关 runner 契约的 runner。
- 重放前警告副作用(模型花费、真实写入),清理环境变量(避免编码代理自身的 ANTHROPIC_API_KEY 等导致 SDK 绕过配置的模型网关),并验证凭据组织与 trace 组织一致。
- 轮询新 trace(每约 5 秒,最多约 2 分钟),并验证隔离:读取每个返回 span 的 ml_app,断言以 -local 结尾。
- 生成差异对比,附新旧 trace 链接;默认执行两次重放以区分采样方差与代码改动的影响。
使用方式
- 确保 trace 访问后端:优先使用 mcp__datadog-llmo-mcp__* 工具;否则使用 pup CLI(安装:brew tap datadog-labs/pack && brew install datadog-labs/pack/pup;pup auth login)。MCP 替代安装:claude mcp add --scope user --transport http "datadog-llmo-mcp" "https://mcp.datadoghq.com/api/unstable/mcp-server/mcp?toolsets=llmobs"。
- 解析命令,确定 ml_app。
- 获取 trace 并定位基线。
- 检查扇出。
- 解析入口点与输入。
- 确保本地运行路径。
- 确保两个持久工件(入口点注解与 runner)。
- 若请求了修改,编辑代码并通过 AskUserQuestion 选择器确认后重放。
- 重放:记录 t0,使用 DD_TAGS=replay_run_id:<unique-id> <run cmd 或 wrapper> --entrypoint <id> --input-file <path> 运行。
- 等待新 trace 并轮询。
- 差异对比并附链接。
- 通过选择器决定继续迭代或停止。
适用场景
- 对单条生产 trace 的输出不满意,希望用本地代码快速复现并验证修改效果。
- 需要回归检查:不修改代码,仅重放并对比输出。
- 应用使用 ddtrace / LLM Obs 追踪(有 ml_app 与可发现的入口点),Python 为一等支持,其他语言也可但需按各自 SDK/构建工具编写 runner。
限制
- 需要 trace 访问后端(MCP 或 pup CLI)以及凭据 DD_API_KEY + DD_SITE + 提供方密钥;不需要 DD_APP_KEY。
- 重放会真实执行代码,产生模型花费与真实写入;LLM Obs trace 无法删除,错误范围的 ml_app 会永久污染生产仪表盘与评估集。
- 入口点输入需可 JSON 序列化,且根 span 需有可调用接缝。
- 隔离依赖 <ml_app>-local,需检查每 span/每调用的 ml_app 覆盖,tracer 级配置不足以证明隔离。
- 轮询时标签匹配不构成隔离证明,必须读取每个返回 span 的 ml_app。
- 若重放禁用了有副作用的集成(dry-run),该集成的子树缺失,比较 span 数量时需排除。
- 新 trace 链接需注入 ml_app=<ml_app>-local,否则打开为空。
- 浏览器端无法从此处验证,需确认一次打开非空。
- 超时不硬失败,可提供继续等待选项。
- 其他语言需按 runner 契约编写,不能假设 Python API 通用。