OpenTelemetry 是底层数据标准 ,LangSmith 和 LangFuse 是基于该标准构建的上层可观测性平台。深度使用 LangChain 生态选 LangSmith ,追求商业 SaaS 的便利性与深度集成;重视开源、自托管与数据主权选 LangFuse ,兼顾成本可控与灵活性;已有统一观测平台或想避免供应商锁定,则直接采用 OpenTelemetry 标准,将数据路由到任意后端。
OpenTelemetry、LangSmith 和 LangFuse 三者并非同一层面的竞争关系。OpenTelemetry (OTel) 是底层数据标准,而 LangSmith 和 LangFuse 是基于该标准构建的上层可观测性平台。 它们之间的关系可以理解为"协议"与"应用"的关系。
📊 核心定位对比
| 维度 | OpenTelemetry (OTel) | LangSmith | LangFuse |
|---|---|---|---|
| 本质 | 开源的可观测性框架与标准,用于生成、采集和导出遥测数据。 | 专有的商业 SaaS 平台,专注于 LLM 应用的全生命周期管理。 | 开源的 LLM 工程平台,提供可观测性、评估和提示管理等一体化功能。 |
| 核心角色 | 数据标准的制定者。它定义了遥测数据的格式(如 Traces、Metrics、Logs)和传输协议(OTLP),但不负责存储和可视化。 | 平台的提供者。它接收(摄取)符合 OTel 标准的数据,并提供存储、分析、评估和可视化界面。 | 平台的提供者。它原生构建于 OTel 之上,其 SDK 就是 OTel SDK,并作为 OTel 后端接收数据,映射到自己的数据模型。 |
| 开源与许可 | 100% 开源,由 CNCF 托管,厂商中立。 | 闭源,专有 SaaS。自托管仅限企业版,需要商业许可。 | 开源(MIT 核心)。核心功能可免费自托管,部分企业级功能(如 SCIM)需商业许可。 |
| 数据主权 | 高。你拥有自己的数据,可以发送到任何兼容的后端。 | 中。SaaS 模式数据在云端,企业版提供混合部署选项。 | 高。支持完全自托管(包括离线环境),数据完全由你掌控。 |
| 定价模式 | 免费。 | 按席位 + 按 Trace 量计费。免费版每月 5,000 条 Trace,付费版 $39/席/月起。 | 按单元(Unit) 计费。免费版每月 50,000 个单元,付费版 $29/月起。 |
| 最佳场景 | 需要避免供应商锁定,或希望将 LLM 追踪与现有后端(如 Datadog)统一观测的大型组织。 | 深度使用 LangChain/LangGraph 的团队,需要零配置追踪、生产级评估自动化和托管部署能力。 | 需要开源、自托管、框架无关的团队,尤其适合初创公司或对成本控制、数据主权有严格要求的场景。 |
🔗 三者的联系:OpenTelemetry 作为"桥梁"
OpenTelemetry 的核心价值在于标准化,它让 LangSmith 和 LangFuse 能够"听懂"同一种语言。
- LangFuse 是 OTel 的"原生实现":LangFuse 的 SDK 本身就是基于 OpenTelemetry 构建的,其数据模型直接映射 OTel 的 Span。这意味着任何发出标准 OTel 数据的应用,都可以无缝接入 LangFuse。
- LangSmith 是 OTel 的"兼容接收端":LangSmith 也支持通过其 OTLP 端点接收标准 OpenTelemetry 追踪数据。这意味着即使你的应用不是用 LangChain 构建的,只要它能发出 OTel 数据,就可以将追踪信息发送到 LangSmith 进行展示和分析。
这种兼容性带来了一个关键好处:避免了供应商锁定。你可以先使用 LangFuse 进行低成本监控,随着规模扩大,再无缝地将数据迁移到 LangSmit而无需修改应用中的任何追踪代码。代码
下面是应用通过 OTel SDK 将追踪数据发送到 LangFuse 和 LangSmith 的架构关系图:
#mermaid-svg-jlowN7kX0j5C6eHN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jlowN7kX0j5C6eHN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jlowN7kX0j5C6eHN .error-icon{fill:#552222;}#mermaid-svg-jlowN7kX0j5C6eHN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jlowN7kX0j5C6eHN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jlowN7kX0j5C6eHN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN .marker.cross{stroke:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jlowN7kX0j5C6eHN p{margin:0;}#mermaid-svg-jlowN7kX0j5C6eHN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster-label text{fill:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster-label span{color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster-label span p{background-color:transparent;}#mermaid-svg-jlowN7kX0j5C6eHN .label text,#mermaid-svg-jlowN7kX0j5C6eHN span{fill:#333;color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .node rect,#mermaid-svg-jlowN7kX0j5C6eHN .node circle,#mermaid-svg-jlowN7kX0j5C6eHN .node ellipse,#mermaid-svg-jlowN7kX0j5C6eHN .node polygon,#mermaid-svg-jlowN7kX0j5C6eHN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .rough-node .label text,#mermaid-svg-jlowN7kX0j5C6eHN .node .label text,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape .label,#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape .label{text-anchor:middle;}#mermaid-svg-jlowN7kX0j5C6eHN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .rough-node .label,#mermaid-svg-jlowN7kX0j5C6eHN .node .label,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape .label,#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape .label{text-align:center;}#mermaid-svg-jlowN7kX0j5C6eHN .node.clickable{cursor:pointer;}#mermaid-svg-jlowN7kX0j5C6eHN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN .arrowheadPath{fill:#333333;}#mermaid-svg-jlowN7kX0j5C6eHN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jlowN7kX0j5C6eHN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jlowN7kX0j5C6eHN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jlowN7kX0j5C6eHN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jlowN7kX0j5C6eHN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jlowN7kX0j5C6eHN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jlowN7kX0j5C6eHN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster text{fill:#333;}#mermaid-svg-jlowN7kX0j5C6eHN .cluster span{color:#333;}#mermaid-svg-jlowN7kX0j5C6eHN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jlowN7kX0j5C6eHN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jlowN7kX0j5C6eHN rect.text{fill:none;stroke-width:0;}#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape p,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jlowN7kX0j5C6eHN .icon-shape .label rect,#mermaid-svg-jlowN7kX0j5C6eHN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jlowN7kX0j5C6eHN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jlowN7kX0j5C6eHN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jlowN7kX0j5C6eHN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 应用服务
OTLP 协议
OTLP 端点
OTLP 端点
业务代码
OTel SDK
OpenTelemetry Collector
LangFuse(原生实现)
LangSmith(兼容接收端)
LangFuse 数据模型
LangSmith 存储与分析
。
💡 如何选择?
- 如果你深度绑定 LangChain 生态 ,并且需要最原生的集成体验、生产级的评估自动化规则和托管部署能力,LangSmith 是更自然的选择。
- 如果你重视开源、数据主权和成本控制 ,或者你的技术栈混合了多种框架(如 LangChain + Vercel AI SDK),LangFuse 提供了更大的灵活性和透明度。
- 如果你是企业级用户 ,已经在使用 Datadog、New Relic 等统一观测平台,并希望避免被单一厂商锁定 ,那么直接采用 OpenTelemetry 并将数据路由到你选择的后端,是最具战略性的方案。的方案
下面是帮助你快速决策的流程图:
#mermaid-svg-AMbpymsDNI0PMGjB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AMbpymsDNI0PMGjB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AMbpymsDNI0PMGjB .error-icon{fill:#552222;}#mermaid-svg-AMbpymsDNI0PMGjB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AMbpymsDNI0PMGjB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AMbpymsDNI0PMGjB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB .marker.cross{stroke:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AMbpymsDNI0PMGjB p{margin:0;}#mermaid-svg-AMbpymsDNI0PMGjB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster-label text{fill:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster-label span{color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster-label span p{background-color:transparent;}#mermaid-svg-AMbpymsDNI0PMGjB .label text,#mermaid-svg-AMbpymsDNI0PMGjB span{fill:#333;color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .node rect,#mermaid-svg-AMbpymsDNI0PMGjB .node circle,#mermaid-svg-AMbpymsDNI0PMGjB .node ellipse,#mermaid-svg-AMbpymsDNI0PMGjB .node polygon,#mermaid-svg-AMbpymsDNI0PMGjB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .rough-node .label text,#mermaid-svg-AMbpymsDNI0PMGjB .node .label text,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape .label,#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape .label{text-anchor:middle;}#mermaid-svg-AMbpymsDNI0PMGjB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .rough-node .label,#mermaid-svg-AMbpymsDNI0PMGjB .node .label,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape .label,#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape .label{text-align:center;}#mermaid-svg-AMbpymsDNI0PMGjB .node.clickable{cursor:pointer;}#mermaid-svg-AMbpymsDNI0PMGjB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB .arrowheadPath{fill:#333333;}#mermaid-svg-AMbpymsDNI0PMGjB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AMbpymsDNI0PMGjB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AMbpymsDNI0PMGjB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AMbpymsDNI0PMGjB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AMbpymsDNI0PMGjB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AMbpymsDNI0PMGjB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AMbpymsDNI0PMGjB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster text{fill:#333;}#mermaid-svg-AMbpymsDNI0PMGjB .cluster span{color:#333;}#mermaid-svg-AMbpymsDNI0PMGjB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AMbpymsDNI0PMGjB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AMbpymsDNI0PMGjB rect.text{fill:none;stroke-width:0;}#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape p,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AMbpymsDNI0PMGjB .icon-shape .label rect,#mermaid-svg-AMbpymsDNI0PMGjB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AMbpymsDNI0PMGjB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AMbpymsDNI0PMGjB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AMbpymsDNI0PMGjB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
开始选择
是否深度使用 LangChain/LangGraph?
LangSmith
是否重视开源、自托管与数据主权?
LangFuse
是否已有统一观测平台(如 Datadog、New Relic)?
纯 OpenTelemetry 标准
LangSmith(商业 SaaS 便利性)
🔧 实战:OTLP 端点配置与数据发送
下面通过 Python 和 Node.js 两个示例,演示如何配置 OTLP 端点并将 LLM 调用追踪数据发送到 LangFuse 或 LangSmit#### 1. Python:使用 OpenTelemetry SDK 发送 LLM 调用追踪调用追踪
首先安装依赖:
bash
pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-grpc
然后配置 OTLP 端点并发送一个简单的 LLM 调用追踪:
python
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# 1. 配置 OTLP 端点(以 LangFuse 为例)
# 自托管 LangFuse:http://your-langfuse-host:4317
# LangSmith:https://api.langsmith.com/otlp
OTLP_ENDPOINT = "http://your-langfuse-host:4317"
API_KEY = "sk-langfuse-your-api-key" # 替换为你的密钥
# 2. 初始化 TracerProvider 并挂载导出器
provider = TracerProvider()
exporter = OTLPSpanExporter(
endpoint=OTLP_ENDPOINT,
headers={"Authorization": f"Bearer {API_KEY}"},
)
provider.add_span_processor(BatchSpanProcessor(exporter))
trace.set_tracer_provider(provider)
tracer = trace.get_tracer("llm-app")
# 3. 记录一次 LLM 调用追踪
with tracer.start_as_current_span("llm.chat.completion") as span:
span.set_attribute("gen_ai.system", "openai")
span.set_attribute("gen_ai.request.model", "gpt-4o")
span.set_attribute("gen_ai.request.prompt", "用一句话介绍 OpenTelemetry")
span.set_attribute("gen_ai.response.text", "OpenTelemetry 是开源的可观测性标准框架。")
span.set_attribute("gen_ai.usage.prompt_tokens", 12)
span.set_attribute("gen_ai.usage.completion_tokens", 1# 运行结果:控制台无输出,但 Span 已异步批量发送到 LangFuse。
# 在 LangFuse 界面中可看到名为 "llm.chat.completion" 的 Trace,
# 包含模型、提示词、响应文本与 Token 用量等属性。等属性。
关键配置说明:
OTLPSpanExporter默认使用 gRPC 协议,端口通常为4317;若使用 HTTP 协议,请改用opentelemetry-exporter-otlp-proto-http并指定http://your-langfuse-host:4318/v1/traces。headers中的Authorization用于平台鉴权,LangFuse 与 LangSmith 均要求携带 API Key。BatchSpanProcessor会批量异步导出,避免阻塞业务线程;应用退出前建议调用provider.shutdown()确保数据落#### 2. Node.js:使用 @opentelemetry/sdk-node 发送追踪到 LangFuse 与 LangSmith。mith
首先安装依赖:
bash
npm install @opentelemetry/sdk-node @opentelemetry/exporter-trace-otlp-http @opentelemetry/api
然后配置 OTLP 端点并发送追踪数据:
javascript
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { trace } = require('@opentelemetry/api'// 1. 配置 OTLP 端点(HTTP 协议)。 协议)
// LangFuse:https://your-langfuse-host/api/public/otlp
// LangSmith:https://api.langsmith.com/otlp
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: 'https://your-langfuse-host/api/public/otlp/v1/traces',
headers: {
Authorization: 'Bearer sk-langfuse-your-api-key',
},
}),
serviceName: 'llm-node-app',
});
sdk.start();
const tracer = trace.getTracer('llm-app'// 2. 记录一次 LLM 调用追踪。调用追踪
const span = tracer.startSpan('llm.chat.completion');
span.setAttribute('gen_ai.system', 'anthropic');
span.setAttribute('gen_ai.request.model', 'claude-3-5-sonnet');
span.setAttribute('gen_ai.request.prompt', '解释 OTLP 协议');
span.setAttribute('gen_ai.response.text', 'OTLP 是 OpenTelemetry 的传输协议。');
span.end(// 运行结果:Span 通过 HTTP 发送到 LangFuse / LangSmith。mith
// 在平台界面中可看到该 Trace 及其属性;若需切换平台,
// 只需修改 url 与 Authorization 头,业务代码无需改// 3. 应用退出前优雅关闭。优雅关闭
process.on('SIGTERM', () => sdk.shutdown());
关键配置说明:
@opentelemetry/exporter-trace-otlp-http使用 HTTP/JSON 协议,URL 需以/v1/traces结尾;LangFuse 的 OTLP 端点路径为/api/public/otlp/v1/traces。- 切换后端时只需修改
url与headers,这正是 OTel 标准带来的免供应商锁定优势。 - 生产环境建议将
serviceName设为有意义的服务名,便于在平台中按服务维度检索 Trace。
🛠️ 常见问题与排查
1. OTLP 端点配置失败
原因分析 :OTLP 端点配置失败通常由三类原因引起:一是端点 URL 拼写错误或缺少协议前缀(如漏写 https://);二是网络不通,目标平台(LangSmith / LangFuse)的 OTLP 端口未开放或被防火墙拦截;三是认证信息(API Key / 密钥)缺失或过期,导致服务端拒绝连接。
解决步骤:
- 核对端点 URL 是否完整,确保包含协议前缀,例如
https://api.langsmith.com/otlp或https://your-langfuse-host/api/public/otlp。 - 使用
curl或telnet测试网络连通性,确认目标端口(通常为 4317 或 443)可达。 - 检查环境变量中的 API Key 是否正确配置,并确认密钥未过期、权限未变更。
- 查看应用日志中的 OTLP 导出错误信息,根据返回的 HTTP 状态码(如 401、403、404)进一步定位问题。
2. Trace 数据未显示
原因分析:Trace 数据未显示通常是因为数据链路中断或采样配置不当。常见OTel SDK 未正确初始化、Span 未导出到目标后端、采样率被设置为 0,或后端的时间范围筛选不正确。选不正确。
解决步骤:
- 确认 OTel SDK 已在应用启动时完成初始化,且导出器(Exporter)指向正确的 OTLP 端点。
- 检查采样配置,确保采样率不为 0,必要时临时设置为 100% 以便调试。
- 在目标平台(LangSmith / LangFuse)中检查时间范围筛选,确认查看的时间段与数据产生时间一致。
- 使用 OTel 自带的诊断日志或本地 Collector 的调试输出,确认 Span 是否成功到达后端。
3. LangSmith 与 LangFuse 数据迁移
原因分析:数据迁移通常发生在从 LangFuse 切换到 LangSmith(或由于两者都兼容 OTel 标准,迁移本身不需要修改应用代码,但需要注意数据模型映射差异、历史数据导出格式以及迁移期间的 Trace 连续性。踪连续性。
解决步骤:
- 确认源平台支持数据导出功能,LangFuse 支持通过 API 或 UI 导出 Trace 数据,LangSmith 也提供相应的导出接口。
- 在目标平台配置好 OTLP 端点后,先发送少量测试数据验证链路连通,再逐步切换生产流量。
- 迁移期间可同时向两个平台发送数据(双写),待目标平台数据完整后再关闭源平台,避免监控空窗期。
- 迁移完成后,对比两个平台的关键指标(如 Trace 数量、延迟分布),确认数据一致性。
📋 选型决策速查表
| 使用场景 | 推荐方案 | 核心理由 | 注意事项 |
|---|---|---|---|
| 深度使用 LangChain/LangGraph | LangSmith | 零配置追踪、生产级评估自动化、托管部署能力,与 LangChain 生态集成最原生。 | 闭源 SaaS,按席位 + Trace 量计费;免费版每月仅 5,000 条 Trace,需评估成本。 |
| 重视开源、自托管与数据主权 | LangFuse | 开源(MIT 核心)、框架无关,支持完全自托管(含离线环境),成本可控、数据完全自主。 | 部分企业级功能(如 SCIM)需商业许可;自托管需自行维护基础设施。 |
| 已有统一观测平台(如 Datadog、New Relic) | 纯 OpenTelemetry 标准 | 避免供应商锁定,将 LLM 追踪与现有后端统一观测,数据可路由到任意兼容后端。 | 需要自行搭建 Collector 与数据管道,运维成本较高;无开箱即用的 LLM 评估界面。 |
| 混合框架技术栈(如 LangChain + Vercel AI SDK) | LangFuse | 框架无关、原生基于 OTel,任何发出标准 OTel 数据的应用都能无缝接入,灵活性高。 | 需确认各框架的 OTel 导出配置一致;多框架下需统一 Trace 命名与采样策略。 |