OpenLLMetry 是 Traceloop(2024 年被 Cisco 收购)开源的 LLM 可观测性 SDK,项目目标是给 LLM 应用一套「标准化遥测」方案。它解决的问题很具体:LLM 应用的调用链路——模型请求、向量检索、LangChain/LlamaIndex 的编排步骤——在传统 APM 里只是一堆无差别的 HTTP 网络 span,看不到 prompt、token 消耗、模型名、重试与缓存信息。OpenLLMetry 基于 OpenTelemetry(可观测性事实标准)构建,将 LLM 调用统一建模为带 GenAI 语义的 span,并通过自动插桩做到「一行代码接入」。安装 traceloop-sdk 后调用 Traceloop.init(),即可把追踪数据导出到 Traceloop Cloud、Datadog、Grafana、Jaeger 等任何支持 OTLP 的后端。本篇按「安装 → 快速上手 → 核心能力 → 生产部署 → 选型对比」的顺序,让你在 10 分钟内完成接入并理解其设计取舍。
掌握 OpenLLMetry,意味着你能用行业标准的 OpenTelemetry 统一观测所有 LLM 应用,这是 MLOps、后端与可观测性工程师搭建 AI 基础设施的核心技能。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 OpenLLMetry:LLM 调用不透明,标准遥测是解药
传统方式下,LLM 应用的可观测性面临三个断层。第一,模型调用本质是一次对外 HTTP 请求,普通 APM 只能记录网络耗时状态码,看不到 prompt、模型名、token 用量、重试与缓存命中等业务语义;第二,RAG 应用的链路横跨向量库检索、上下文拼接、模型生成多个阶段,日志分散在各组件中,排障时需要人工拼接时间线;第三,token 消耗直接对应成本,传统监控无法按模型、按用户、按服务维度自动汇总用量,成本超支往往到月底账单出来才发现。
OpenLLMetry 的解法是把「模型调用」这类 LLM 特有动作建模成带 GenAI 语义约定的 span(追踪链路中的最小工作单元),覆盖 LLM 调用、Embedding、向量库检索、框架编排步骤等场景。它提供自动插桩机制,安装对应扩展包后,只需在程序入口调用一次 Traceloop.init(),SDK 就会自动包装 LangChain、LlamaIndex、CrewAI、OpenAI 等调用,业务代码不需要做任何侵入式修改。由于整条数据链路基于 OpenTelemetry 标准,采集到的 trace 可以导出到任何兼容 OTLP 的后端,而不是被困在某个特定平台的私有格式里。
与 Langfuse、LangSmith 这类「闭环平台」相比,OpenLLMetry 的气质差异在于它只做「遥测接入层」:不自带可视化前端、不强绑定存储,数据模型遵循公共标准。这意味着它天然适合已经有 Prometheus/Grafana/Jaeger 等基础设施、看重数据主权与技术标准化的团队;而希望开箱即得现成看板与评测功能的团队,则通常选择 Langfuse 这类平台型产品。
安装与环境配置:4 步就绪
步骤一:安装 SDK 与对应插桩扩展。 基础包是 traceloop-sdk;按使用的框架选择 tracing-* 扩展。注意当前版本为 1.45.0,建议锁定版本避免与后续发布产生兼容性差异。
步骤二:配置导出目标。 使用 Traceloop Cloud 时设置 TRACELOOP_API_KEY 与 TRACELOOP_BASE_URL;自建 OTLP 后端时设置 OTEL_EXPORTER_OTLP_ENDPOINT 指向 Collector 地址,并通过 OTEL_EXPORTER_OTLP_HEADERS 携带认证信息。
步骤三:在代码入口初始化。 调用 Traceloop.init(app_name="你的应用名"),SDK 会完成 exporter 初始化和各框架自动插桩的注册。
步骤四:验证。 运行应用发起一次 LLM 调用,在 Traceloop 控制台或自建 Grafana 中查看生成的 trace。
注意:TRACELOOP_BASE_URL 与 OTEL_EXPORTER_OTLP_ENDPOINT 二选一即可,两者同时存在时以后者为准。若均未配置,SDK 没有上报目标,trace 会被静默丢弃。
# 1. 安装(以 OpenAI + LangChain 为例)pip install 'traceloop-sdk[tracing-openai]==1.45.0'pip install 'traceloop-sdk[tracing-langchain]==1.45.0' # 2. 配置环境变量(Traceloop Cloud 方式)export TRACELOOP_API_KEY=your_api_keyexport TRACELOOP_BASE_URL=https://api.traceloop.com # 自建 OTLP 后端时改用下面两行:# export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318# export OTEL_EXPORTER_OTLP_HEADERS=Authorization=Bearer your_token # 3. 运行应用python your_app.py
快速上手:5 分钟跑通第一个 LLM 追踪
最小可用闭环是:安装扩展 → 初始化 SDK → 发起一次模型调用 → 在控制台查看 span 树。OpenAI 调用会被 openai 插桩器自动包装,你不需要手工创建或关闭 span。
1. 创建虚拟环境并安装:pip install 'traceloop-sdk[tracing-openai]==1.45.0'
2. 新建 app.py,在文件顶部 from traceloop.sdk import Traceloop 并调用 Traceloop.init(app_name="hello_llm")
3. 设置环境变量 TRACELOOP_API_KEY 和 TRACELOOP_BASE_URL
4. 运行 python app.py,脚本会发起一次 ChatCompletion 请求
5. 打开 Traceloop 控制台的 Traces 页面,找到 hello_llm 应用的 trace,展开后可见 LLM span 中包含模型名、token 用量、耗时等属性
进阶技巧:若使用 LangChain,安装 traceloop-sdk[tracing-langchain] 后同样只需 Traceloop.init()——LangChain 自动插桩默认随初始化启用,Chain 内部的检索、提示词组装、LLM 调用会自动生成子 span,无需额外代码。
from traceloop.sdk import Traceloopfrom openai import OpenAI Traceloop.init(app_name="hello_llm") client = OpenAI()response = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": "用一句话介绍 OpenTelemetry 语义约定。"}],)print(response.choices[0].message.content)
核心能力详解:3 大支柱
支柱一:GenAI 语义约定(标准化遥测)。 OpenLLMetry 依据 OpenTelemetry 的 GenAI 语义约定,为模型调用类 span 定义统一的属性命名,例如 AI 服务商、模型名、输入输出 token 用量、请求参数等。语义建模范式统一后,跨模型(GPT、Claude、Llama)、跨框架(LangChain、LlamaIndex、CrewAI)的遥测数据可以直接聚合对比,这是「标准化」三个字的核心价值。
支柱二:零代码自动插桩。 SDK 提供 tracing-openai、tracing-langchain、tracing-llamaindex、tracing-crewai、tracing-pinecone 等扩展包。安装扩展并在入口调用 Traceloop.init() 后,SDK 通过 OpenTelemetry instrumentation 机制自动包装目标框架的调用,创建对应的 span 与属性。生产代码零侵入,升级插桩能力只需升级 SDK 版本。
支柱三:OTLP 导出到任意后端。 遥测数据通过 OTLP 协议导出,目标可以是 Traceloop Cloud,也可以是自建 Collector、Grafana Tempo、Jaeger、Datadog、Honeycomb 等任何兼容 OTLP 的可观测性后端。数据模型是标准 OpenTelemetry trace,schema 对齐的 APM 可以直接消费,不存在厂商锁定。SDK 同时支持批量 span 处理器、采样等生产特性,可在高流量下控制上报开销。
生产部署与监控:从上线到运维
部署方式一:Traceloop Cloud。 注册账号后获取 API Key,设置 TRACELOOP_API_KEY 与 TRACELOOP_BASE_URL 即可。平台提供 trace 查看、token 用量聚合与成本分析、告警能力,免费额度适合中小团队快速上线,适合不想自建基础设施的场景。
部署方式二:自建 OTLP Collector。 将 OTEL_EXPORTER_OTLP_ENDPOINT 指向内部 Collector(如 Grafana Alloy/Tempo 或 Jaeger)。数据不出内网,满足金融、政企等数据合规要求;代价是需要自行维护 Collector 的容量、采样策略与存储生命周期。建议用 OTEL_RESOURCE_ATTRIBUTES 环境变量标注服务名与部署环境,便于多服务聚合检索。
可观测性要点。 默认配置下 span 不记录 prompt 与响应原文,涉及敏感数据时保持关闭,确需排查语义问题时再按服务粒度开启 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true,并配合脱敏管道。高流量服务应开启尾部采样,只保留错误与慢 span;token 用量是成本指标,接入后应建立按 app_name 维度的用量看板与预算告警。
<p class=“para-label“>避坑清单:</p><ul class=”dash-list”><li>PyPI 包名是 traceloop-sdk 而非 openllmetry,执行 pip install openllmetry 会安装失败并误导排查方向</li><li>必须配置 OTLP 导出端点或 TRACELOOP_BASE_URL,否则 trace 静默丢弃且无任何报错</li><li>SDK 与各 tracing 扩展包版本必须锁定一致,混用不同版本可能导致插桩器加载失败</li><li>生产环境默认不记录消息内容是正确行为,不要为了「看得全」盲目开启消息捕获,会造成 PII 泄露风险</li><li>LangChain 自动插桩由 Traceloop.init 自动启用,重复手动初始化 instrumentation 会产生重复 span</li></ul>
| 维度 | OpenLLMetry | Langfuse | Arize Phoenix | LangSmith |
|---|---|---|---|---|
| 定位 | LLM 遥测 SDK,OTel 标准数据链路 | LLM 可观测性与评测平台 | LLM/ML 可观测性平台 | LLM 追踪与评测 SaaS |
| 编排范式 | 自动插桩 + OTel 标准 span | 自家 SDK 结构化事件 | Phoenix SDK 集成 OTel | 自家 SDK 深度集成 |
| 类型约束 | 无强制,可自定义 span/attribute | 平台内事件模型 | 平台内 trace 模型 | 平台内 trace 模型 |
| 学习曲线 | 低(懂 OTel 则更低) | 中 | 中 | 低 |
| 生态集成 | 任意 OTLP 后端,无锁定 | 自家 UI + API | 自家 UI + OTel 兼容 | LangChain 生态绑定 |
| 生产部署 | 自带 exporter,可配自建 Collector | 自托管 compose/K8s 或云 | 自托管镜像或云 | 仅云服务 |
| License | Apache 2.0 | MIT(自托管核心) | Elastic License 2.0 | 闭源商业 |
| 适合谁 | 已有 OTel 栈、重数据主权的团队 | 要开箱即用看板与评测的团队 | Notebook 内深度模型分析 | LangChain 重度用户 |
选型建议:已有 Prometheus/Grafana/Jaeger 体系的团队优先选 OpenLLMetry,遥测数据融入现有监控链路且无厂商锁定;想快速获得 LLM 专用看板、评测与标注功能的中小团队选 Langfuse;做模型实验阶段深度分析选 Arize Phoenix;深度绑定 LangChain 生态且预算充足选 LangSmith。
版本迭代
OpenLLMetry 由 traceloop-sdk 演进而来,2024 年完成向 OpenTelemetry GenAI 语义约定的对齐,并将插桩包按 tracing-* 命名体系重组。版本迭代节奏快,主线是扩大框架插桩覆盖面与提升生产环境稳定性。
| 版本 | 时间 | 变化 | 提升 |
|---|---|---|---|
| v1.30.0 | 2024-07 | 遥测模型统一重构 | 对齐 GenAI 语义约定,规范 span 与属性命名 |
| v1.34.0 | 2024-08 | 插桩生态扩展 | 扩充框架与向量库的 tracing 扩展包 |
| v1.40.0 | 2024-10 | 稳定性修复 | 修复 OTLP 上报与采样相关生产问题 |
| v1.42.0 | 2024-11 | 模型与框架适配 | 适配主流模型 API 变更,完善框架追踪覆盖 |
| v1.45.0 | 2024-12 | 当前稳定版 | LangChain 自动插桩默认启用,文档与示例完善 |
从版本脉络看,SDK 的重心已从「能追踪」转向「追踪得标准、部署得稳」。建议直接使用 1.45.x 系列,并在升级时先读 Changelog 确认插桩行为变更;若需要最新功能,关注官方 Release 页的新版本发布。
AI 应用场景
场景一:RAG 应用的故障定位
阶段:RAG 管道构建 / LLM 应用追踪
解决的问题:RAG 链路包含向量检索、上下文拼装、模型生成多个阶段,传统日志无法把「检索慢」和「生成慢」拆开。OpenLLMetry 自动为每个阶段生成子 span,一次请求的完整耗时分布一目了然,无需手工拼接日志。
具体案例:某知识库问答机器人(LangChain + 向量库)接入后,通过 trace 发现 P95 延迟中约 60% 消耗在向量检索而非模型生成,针对性优化索引后整体 P95 下降约 30%;故障定位时间从小时级缩短到 15 分钟以内。
场景二:多模型调用的成本与用量分析
阶段:模型成本追踪 / Token 用量聚合
解决的问题:业务同时调用 GPT-4o 与 Claude,成本分散在多张账单中。OpenLLMetry 将 token 用量作为标准 span 属性上报,可按服务、模型、时间维度聚合。
具体案例:某 AI 平台按 app_name 维度为每个业务线建立 token 用量看板,接入后月度成本核算从手工导表 2 天缩短到实时查看,并在用量突增时通过告警提前发现异常调用。
场景三:合规环境下统一接入自建观测栈
阶段:可观测性体系整合
解决的问题:数据合规要求 LLM 调用数据不得出内网,且团队已有 Grafana 监控体系,不愿再引入新 SaaS。OpenLLMetry 的 OTLP 导出能力让 LLM trace 直接进入内部链路。
具体案例:某金融科技团队将 OTEL_EXPORTER_OTLP_ENDPOINT 指向内部 Collector,LLM 应用与微服务 trace 在 Grafana Tempo 中统一检索,消息内容捕获保持关闭以满足合规审计要求。
常见误区
误区项目叫 OpenLLMetry,那 `pip install openllmetry` 应该就能装吧?结果装了个不存在的包,折腾半天。
正解PyPI 上的包名是 traceloop-sdk,安装命令为 pip install traceloop-sdk,框架扩展名为 traceloop-sdk[tracing-xxx]。安装任何与 openllmetry 相关的 Python 库,都应查 PyPI 确认包名,而不是按项目名推测。
为何常见:项目文档与 GitHub 仓库名都是 OpenLLMetry,而 PyPI 包名沿用了被收购前的 traceloop-sdk,命名不一致导致初学者按惯性推理。
误区既然数据要发给 Traceloop,那必须付费用它的云服务,否则没法用。
正解OpenLLMetry 是纯开源 SDK,遥测数据通过标准 OTLP 协议导出。不设置 TRACELOOP_BASE_URL 时,可以把 OTEL_EXPORTER_OTLP_ENDPOINT 指向自建 Collector、Grafana Tempo、Jaeger 等任意后端,数据不出内网也能完整使用。
为何常见:官方文档的快速开始默认展示 Traceloop Cloud 的配置方式,容易让新手误以为云服务是唯一路径。
误区SDK 装好了,`Traceloop.init()` 也调了,为什么控制台里什么都没有?
正解Traceloop.init() 只负责初始化 exporter 与插桩器,真正的上报目标由环境变量决定。未设置 OTEL_EXPORTER_OTLP_ENDPOINT 或 TRACELOOP_BASE_URL 时,trace 会因无导出目标而被静默丢弃,应用本身不报错,极易误判为「没产生数据」。
为何常见:SDK 设计上做了容错处理,初始化失败不打断业务主流程,导致配置缺失的反馈非常隐蔽。
误区trace 里看不到 prompt 和模型回复,是不是 SDK 坏了,或者需要付费版才有?
正解这是默认行为而非缺陷。为保护敏感数据,OpenTelemetry 的消息内容捕获默认关闭。需要记录 prompt 时必须显式设置 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true,且生产环境应评估 PII 风险并配合脱敏。
为何常见:多数演示截图展示了带内容的完整 trace,让人误以为内容捕获是默认开启的。
误区看到有新版本就直接 `pip install -U traceloop-sdk`,结果扩展包 `tracing-langchain` 还是旧版,追踪数据突然不见了。
正解SDK 与各 tracing-* 扩展包必须保持同一版本号,否则插桩器可能与 SDK 内部接口不匹配。升级时应同步升级全部相关包,并固定在 requirements.txt 中,例如 traceloop-sdk[tracing-langchain]==1.45.0。
为何常见:pip install -U 默认只升级主包,依赖的扩展包不会自动同步升级,版本漂移很难被察觉。
面试题
Q1. 安装 OpenLLMetry Python SDK 时,正确的包名是?
- A.pip install openllmetry
- B.pip install traceloop-sdk← 正确答案
- C.pip install otel-llm
- D.pip install llm-traces
答案:B。项目名是 OpenLLMetry,但 PyPI 包名沿用了 traceloop-sdk。B 是官方发布的包名;A 会安装失败;C、D 是并不存在的包名。这类「项目名≠包名」的差异在工具链中很常见,安装前应查 PyPI 确认。
Q2. 将 LLM 遥测导出到自建 Collector 时,核心配置的环境变量是?
- A.OTEL_EXPORTER_OTLP_ENDPOINT← 正确答案
- B.OTEL_EXPORTER_OTLP_HEADERS
- C.OTEL_EXPORTER_OTLP_INSECURE
- D.OTEL_EXPORTER_OTLP_TIMEOUT
答案:A。OTEL_EXPORTER_OTLP_ENDPOINT 指定 OTLP 上报地址,是导出数据的核心变量;HEADERS 用于附加认证信息,INSECURE 控制是否跳过 TLS,TIMEOUT 控制超时,均属辅助配置。未设置端点时 trace 会被静默丢弃。
Q3. 以下哪些框架可通过 traceloop-sdk 的 tracing 扩展包自动插桩?
- A.LangChain 框架← 正确答案
- B.LlamaIndex 框架← 正确答案
- C.CrewAI 框架← 正确答案
- D.FastAPI 框架
答案:ABC。tracing-langchain、tracing-llamaindex、tracing-crewai 均为官方扩展包,对应 A、B、C。FastAPI 不在官方 tracing 扩展列表中,其 HTTP 层数据不在此 SDK 的自动插桩范围内,需自行通过 OpenTelemetry 其他组件观测。
Q4. 关于 trace 中记录 prompt 与响应原文的行为,以下说法正确的是?
- A.默认记录全部请求与响应原文
- B.默认不记录,需手动开启相关配置← 正确答案
- C.是否记录由模型 API 提供方决定
- D.只有开通付费版才会记录内容
答案:B。OpenTelemetry 的消息内容捕获默认关闭,OpenLLMetry 遵循该约定。需要记录时需设置 OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true。该行为与模型 API 无关,也与是否付费无关,纯由 SDK 配置控制。
Q5. Traceloop.init(app_name="xxx") 的主要作用是?
- A.完成模型参数初始化
- B.初始化 SDK 并启动插桩← 正确答案
- C.创建并提交一条新 trace
- D.把训练数据上传云端
答案:B。Traceloop.init 会初始化 exporter、设置资源属性并注册各框架的自动插桩器,是接入的唯一个人口。它不会初始化模型参数,也不直接创建 trace;trace 由后续真实调用触发生成,更与训练数据上传无关。
Q6. 生产环境使用 OpenLLMetry 的正确做法包括?
- A.锁定 SDK 与扩展包版本一致← 正确答案
- B.低流量时先关闭采样省开销
- C.对含 PII 服务关闭消息捕获← 正确答案
- D.只保留单一导出后端防重复
答案:AC。SDK 与 tracing 扩展必须同版本锁定,否则插桩器可能失效;含敏感数据的服务应保持消息捕获关闭,防止 PII 外泄。B 错误——低流量不是关闭采样的理由,高流量才需要采样控制成本;D 错误——多个导出后端并非禁止,可按需同时上报。
Q7. OpenLLMetry 与 Langfuse 最核心的差异是?
- A.Langfuse 更强调使用开源协议
- B.OpenLLMetry 基于 OTel 开放数据链路← 正确答案
- C.OpenLLMetry 内置可视化看板
- D.Langfuse 不支持 trace 导出
答案:B。OpenLLMetry 是纯遥测接入层,数据按 OpenTelemetry 标准产出并导出到任意 OTLP 后端,无厂商锁定;Langfuse 是平台型产品,自带 UI、存储与评测功能,数据在平台体系内流转。两者都不是靠「开源协议」或「有无看板」区分的。
Q8. 关于 openai 自动插桩,以下说法正确的是?
- A.需要安装 tracing-openai 扩展包← 正确答案
- B.必须在代码中手动包裹每次调用
- C.自动生成 LLM 调用 span← 正确答案
- D.Token 用量不会写入 span
答案:AC。安装 traceloop-sdk[tracing-openai] 后,OpenAI 的 chat completion 等调用会被自动包装并生成 LLM span,无需手动包裹每个调用。span 中会记录模型名、token 用量等属性,D 说法错误。
Q9. OpenLLMetry 使用的追踪数据标准是?
- A.Zipkin 协议
- B.OpenTelemetry 标准← 正确答案
- C.StatsD 协议
- D.Prometheus 指标
答案:B。OpenLLMetry 构建在 OpenTelemetry 之上,使用其 trace 模型、OTLP 导出协议与 GenAI 语义约定。Zipkin、StatsD、Prometheus 是其他类别的可观测性技术,不构成 OpenLLMetry 的数据基础。
Q10. 在 OpenTelemetry GenAI 语义约定中,输入 token 用量应记录在哪类 span 属性上?
- A.属性 gen_ai.usage.input_tokens← 正确答案
- B.属性 gen_ai.request.max_tokens
- C.属性 llm.input.usage
- D.属性 token.input.count
答案:A。GenAI 语义约定使用 gen_ai.usage 前缀记录实际消耗的 token 用量,其中 input_tokens 表示输入 token;gen_ai.request.max_tokens 是请求参数而非实际用量。C、D 是并不存在的约定命名。掌握这一命名规范是读懂 LLM span 的基础。
参考来源
- webpageTraceloop 官网托管平台入口与产品介绍