用途:在 dd-trace-js 中为 LLM 库编写 LLMObs 插件,对 LLM 库操作进行埋点并发出 span 事件。支持的操作包括 chat completions(流式与非流式)、embeddings、agent runs、编排(workflow/graph)、工具调用、检索(RAG/向量数据库)。
主要能力:插件继承 LLMObsPlugin 基类,需实现 getLLMObsSpanRegisterOptions(ctx)(返回 modelProvider、modelName、kind、name)与 setLLMObsTags(ctx)(提取并标记输入/输出消息、token 指标与模型元数据)。生命周期为 start(ctx) 注册 span 并捕获上下文,被包装操作执行,asyncEnd(ctx) 调用 setLLMObsTags(),end(ctx) 恢复父级。
分类系统:每个集成必须用 LlmObsCategory 枚举分类,决定测试策略与实现方式。LLM_CLIENT 为直接 API 封装(openai、anthropic、genai),测试用 VCR 经代理发真实 API 调用;MULTI_PROVIDER 为多提供商框架(ai-sdk、langchain);ORCHESTRATION 为工作流管理器(langgraph),用纯函数测试,不用 VCR 与真实 API;INFRASTRUCTURE 为协议/服务器(MCP),用 mock server 测试。判定依据代码事实:是否直接对 LLM 提供商端点发 HTTP 调用、是否支持多提供商配置、是否实现带状态管理的工作流/图编排。
Span 类型:使用 LlmObsSpanKind 枚举,含 LLM、WORKFLOW、AGENT、TOOL、EMBEDDING、RETRIEVAL;LLM_CLIENT 与 MULTI_PROVIDER 中 chat completions/文本生成通常用 llm。
消息提取:统一转为 [{content: string, role: string}],常见 role 为 user、assistant、system、tool;需按提供商处理,如 OpenAI 处理 function_call 与 tool_calls,Anthropic 映射 role 并展平嵌套 content 数组,Google GenAI 从 parts 数组提取并映射 role 名,多提供商先检测再提取。
实现步骤:先检测包分类(必需第一步),再创建插件文件于 packages/dd-trace/src/llmobs/plugins/{integration}/index.js,实现注册选项与标签方法,处理流式响应、错误、非标准消息格式与缺失元数据等边界情况。插件需导出数组,并带静态属性 integration、id、prefix。
限制:资料未提供具体安装命令、收费、价格与效果数据;实现前应先阅读已安装版本的上游库源码,避免依赖过时假设。