使用 Elastic、OpenLLMetry 和 OpenTelemetry 跟踪 LangChain 应用程序
作者:来自 Elastic Bahubali Shetti

Langchain 应用程序的使用正在增长。构建基于 RAG 的应用程序、简单的 AI 助手等的能力正在成为常态。观察这些应用程序更加困难。考虑到现有的各种选项,本博客展示了如何将 OpenTelemetry 检测与 OpenLLMetry 结合使用并将其导入 Elastic Observability APM。
LangChain 已迅速成为 AI 开发领域的关键框架,特别是用于构建由大型语言模型 (LLM) 支持的应用程序。随着开发人员对其的采用率飙升,对有效调试和性能优化工具的需求也变得越来越明显。其中一种必不可少的工具就是能够从 LangChain 应用程序获取和分析跟踪。跟踪提供了对执行流程的宝贵见解,帮助开发人员了解和改进他们的 AI 驱动系统。
有几种用于 Langchain 的跟踪选项。一种是 Langsmith,非常适合详细跟踪和对大型语言模型 (LLMs) 请求的完整细分。但是,它是特定于 Langchain 的。OpenTelemetry (OTel) 现在被广泛接受为跟踪的行业标准。作为主要的云原生计算基金会 (CNCF) 项目之一,它拥有与 Kubernetes 一样多的提交,正在获得为该框架提供支持的主要 ISV 和云提供商的支持。
因此,许多基于 Langchain 的应用程序将具有多个组件,而不仅仅是 LLM 交互。将 OpenTelemetry 与 Langchain 结合使用至关重要。除了 Langsmith 之外,OpenLLMetry 是跟踪 Langchain 应用的一个可用选项。
本博客将展示如何使用 OpenLLMetry 库 opentelemetry-instrumentation-langchain 将 Langchain 跟踪引入 Elastic。
先决条件:
Elastic Cloud 帐户 — 立即注册,并熟悉 Elastic 的 OpenTelemetry 配置
- 拥有 Langchain 应用程序进行检测
- 熟悉使用 OpenTelemetry 的 Python SDK
- 你最喜欢的 LLM 上的帐户,带有 API 密钥
概述
在强调跟踪时,我创建了一个简单的 LangChain 应用程序,它执行以下操作:
- 在命令行上获取客户输入。(查询)
- 通过 LangChain 将这些发送到 Azure OpenAI LLM。
- 链工具设置为使用 Tavily 进行搜索
- LLM 使用输出将相关信息返回给用户。


如你所见,Elastic Observability 的 APM 识别了 LangChain App,并且还显示了完整的跟踪(通过手动检测完成):

如上图所示:
- 用户进行查询
- 调用 Azure OpenAI,但它使用工具(Tavily)获取一些结果
- Azure OpenAI 审核并向最终用户返回摘要
代码是手动检测的,但也可以使用自动检测。
OpenTelemetry 配置
在使用 OpenTelemetry 时,我们需要配置 SDK 以生成跟踪并配置 Elastic 的端点和授权。说明可在 OpenTelemetry Auto-Instrumentation 设置文档中找到。
OpenTelemetry 环境变量:
可以在 Linux 中(或在代码中)按如下方式设置 Elastic 的 OpenTelemetry 环境变量。
OTEL_EXPORTER_OTLP_ENDPOINT=12345.apm.us-west-2.aws.cloud.es.io:443
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20ZZZZZZZ"
OTEL_RESOURCE_ATTRIBUTES="service.name=langchainChat,service.version=1.0,deployment.environment=production"
如你所见,OTEL_EXPORTER_OTLP_ENDPOINT 设置为 Elastic,并且还提供了相应的授权标头。这些可以从 OpenTelemetry 下的 Elastic APM 配置屏幕轻松获取:

注意:不需要代理,我们只需将 OTLP 跟踪消息直接发送到 Elastic 的 APM 服务器。
OpenLLMetry 库:
OpenTelemetry 的自动检测功能可以通过检测包进行扩展,以跟踪其他框架。
首先,你必须安装以下包:
pip install opentelemetry-instrumentation-langchain
此库由 OpenLLMetry 开发。
然后,你需要将以下内容添加到代码中。
from opentelemetry.instrumentation.langchain import LangchainInstrumentor
LangchainInstrumentor().instrument()
检测
添加库并设置环境变量后,即可使用自动检测。使用自动检测,可执行以下操作:
opentelemetry-instrument python tavilyAzureApp.py

OpenLLMetry 库确实可以正确提取流程,只需进行最少的手动操作,除了添加 OpenLLMetry 库。
- 在命令行上获取客户输入。(查询)
- 通过 LangChain 将这些发送到 Azure OpenAI LLM。
- 链工具设置为使用 Tavily 进行搜索
- LLM 使用输出将相关信息返回给用户。
手动检测
如果你想从应用程序中获取更多详细信息,则需要手动检测。要获得更多跟踪,请遵循我的 Python 检测指南。本指南将引导你完成设置必要的 OpenTeleMemtry ,此外,你还可以查看 OTel 中有关使用 Python 进行检测的文档。
请注意,环境变量 OTEL_EXPORTER_OTLP_HEADERS 和 OTEL_EXPORTER_OTLP_ENDPOINT 的设置如上一节所述。你还可以设置 OTEL_RESOURCE_ATTRIBUTES。
一旦你按照任一指南中的步骤启动跟踪器,你基本上只需添加你想要获取更多详细信息的跨度即可。在下面的示例中,只添加了一行代码用于跨度初始化。
查看下面的 with tracer.start_as_current_span("getting user query") as span: 的位置
# Creates a tracer from the global tracer provider
tracer = trace.get_tracer("newsQuery")async def chat_interface():print("Welcome to the AI Chat Interface!")print("Type 'quit' to exit the chat.")with tracer.start_as_current_span("getting user query") as span:while True:user_input = input("\nYou: ").strip()if user_input.lower() == 'quit':print("Thank you for chatting. Goodbye!")breakprint("AI: Thinking...")try:result = await chain.ainvoke({"query": user_input})print(f"AI: {result.content}")except Exception as e:print(f"An error occurred: {str(e)}")if __name__ == "__main__":asyncio.run(chat_interface())
如你所见,通过手动检测,我们得到以下跟踪:

当我们输入查询函数时会调用它。async def chat_interface()
结论
在本博客中,我们讨论了以下内容:
- 如何使用 OpenTelemetry 手动检测 LangChain
- 如何正确初始化 OpenTelemetry 并添加自定义跨度
- 如何使用 Elastic 轻松设置 OTLP ENDPOINT 和 OTLP HEADERS,而无需收集器
- 在 Elastic Observability APM 中查看跟踪
希望这能提供一个易于理解的指南,介绍如何使用 OpenTelemetry 检测 Langchain,以及将跟踪发送到 Elastic 是多么容易。
OpenTelemetry 与 Elastic 的其他资源:
- 使用 Elastic 上的 OpenTelemetry 实现独立性
- 使用 Elastic 和 OpenTelemetry 在 Kubernetes 上实现现代可观察性和安全性
- 使用 OpenTelemetry 和 Elastic 进行日志记录的 3 种模型
- 将免费和开放的 Elastic APM 添加为 Elastic Observability 部署的一部分
- 使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型
- 使用 OpenTelemetry 和 Elastic 为你的可观察性平台提供面向未来的保障
- 检测资源:
- Python:自动检测、手动检测
- Java:自动检测、手动检测
- Node.js:自动检测、手动检测
- .NET:自动检测、手动检测
还可以登录 cloud.elastic.co 试用 Elastic 的免费试用版。
原文:Tracing Langchain apps with Elastic, OpenLLMetry, and OpenTelemetry — Elastic Observability Labs
相关文章:
使用 Elastic、OpenLLMetry 和 OpenTelemetry 跟踪 LangChain 应用程序
作者:来自 Elastic Bahubali Shetti Langchain 应用程序的使用正在增长。构建基于 RAG 的应用程序、简单的 AI 助手等的能力正在成为常态。观察这些应用程序更加困难。考虑到现有的各种选项,本博客展示了如何将 OpenTelemetry 检测与 OpenLLMetry 结合使…...
【论文复现】VALL-E:语音合成的新里程
📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。 📗本文收录于论文复现系列,大家有兴趣的可以看一看。 📘相关专栏C语言初阶、…...
java项目之微服务在线教育系统设计与实现(springcloud)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 微服务在线教育系统设计与…...
P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法
讲解视频: P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法 知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法 一、算法、顺序结构程序设计任务分析 知识要点:算法…...
Vue2——单页应用程序路由的使用
一.单页应用程序与多页应用程序之间的比较 二.单页的应用场景 系统类网站 / 内部网站 / 文档类网站 / 移动端网站 三.路由的介绍 1. 什么是路由 路由是一种映射关系 2. Vue中的路由是什么 路径和组件的映射关系 四.VueRouter的使用 5个基础步骤(固定) …...
变分法(Calculus of Variations)
变分法(Calculus of Variations)是数学的一个分支,主要研究函数的极值问题,即寻找一个函数,使得某个泛函达到最大值或最小值。泛函是将函数作为变量的函数,与通常的函数不同,泛函的变量是函数本…...
包括 Nginx、Gateway、Nacos、Dubbo、Sentinel、RocketMQ 和 Seata 的调用链路描述:
以下是一个更详细和清晰的客户端请求在 Spring Cloud Alibaba 框架中,包括 Nginx、Gateway、Nacos、Dubbo、Sentinel、RocketMQ 和 Seata 的调用链路描述: 1. 客户端请求 用户在浏览器或移动应用中发起请求(例如,获取用户信息的…...
【P2-1】ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式介绍与AT指令介绍
前言:本文对ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式进行介绍;以及AT指令介绍,包括基础AT指令,WIFI功能AT指令、TCP/IP相关AT指令、常用AT指令实例进行介绍。 ESP8266 WIFI模块的接线及固件烧写可参考我的这篇博客:正点原子ATK-ESP8266 WIFI模块接线及固件…...
《C#语法一篇通》,20万字,48小时阅读,持续完善中。。。
本文摘录了C#语法的主要内容,接近20万字。 所有鸡汤的味道都等于马尿! 如果你相信任何所谓的鸡汤文章,智商堪忧。 计算机语言没有”好不好“之说,骗子才会告诉你哪个语言好,学好任何一本基础语言(C&#…...
[node] 2 fs文件系统模块
前言 fs模块是Node.js官方提供的内置Api,用来操作文件的模块。它提供了一系列的属性和方法,来满足用户对文件的操作需求 目标 1 掌握fs中文件处理方法readFile、writeFile等的基础用法 2 node如何安装 3 一些常用的终端快捷键 #mermaid-svg-rPp2nDYrW33gLvuI {font-family:&q…...
【react】基础知识点学习
1. 创建项目 npm install -g create-react-app npx create-react-app my-app cd my-app npm startindex.js为入口文件,App.js为根组件。 如何将react应用挂载在页面上? 将App组件渲染到id为root的DOM元素中 2. JSX JSX是|avaScript和XML(HTML)的缩写…...
D4--哈夫曼树和不等式
看文先三连,养成好习惯~看文先三连,养成好习惯~看文先三连,养成好习惯~ 目录 知识点: 堆排序: 优先队列: 定义:(默认大顶堆) 入队: 出队: 取队顶&…...
详解RabbitMQ三种队列类型
RabbitMQ 是一个强大的消息队列系统,它提供了多种队列类型以满足不同的使用需求。本文将探讨三种主要队列类型:经典队列、仲裁队列和流式队列,并讨论它们的区别和选型建议。 经典队列(Classic Queues) 简介ÿ…...
openGauss数据库-头歌实验1-3 创建和管理模式
一、创建和使用模式 (一)任务描述 本关任务:基于 openGauss 学习创建模式的相关知识。 (二)相关知识 为了完成本关任务,你需要掌握:1.openGauss 的常用操作,2.SQL 创建模式相关语…...
森林火灾检测数据集(猫脸码客 第233期)
森林火灾检测数据集 森林火灾是一种具有巨大破坏性的自然灾害,每年在全球范围内造成巨大损失。为了有效应对森林火灾,及早发现和快速响应是至关重要的。传统上,森林火灾的检测主要依赖于人工巡逻和卫星遥感技术。然而,这些方法存…...
LeetCode100之找到字符串中所有字母异位词(438)--Java
1.问题描述 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例1 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 …...
【Python】Python自习课:第一个python程序
【Python】Python自习课:第一个python程序...
DICOM标准:解析DICOM属性中的病人模块
目录 病人模块概述 1. 病人关系模块(Patient Relationship Module) 2. 病人识别模块(Patient Identification Module) 3. 病人统计模块(Patient Demographic Module) 4. 病人医学模块(Pati…...
C++设计模式创建型模式———生成器模式
文章目录 一、引言二、生成器/建造者模式三、总结 一、引言 上一篇文章我们介绍了工厂模式,工厂模式的主要特点是生成对象。当对象较简单时,可以使用简单工厂模式或工厂模式;而当对象相对复杂时,则可以选择使用抽象工厂模式。 工…...
基于微信小程序的校园失物招领系统的研究与实现(V4.0)
博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
