当前位置: 首页 > news >正文

使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序

作者:来自 Elastic Adrian Cole

Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪,而无需任何代码更改。

介绍

去年,我们宣布了 OpenTelemetry(又名 Elastic Distribution of OpenTelemetry - EDOT)语言 SDK 的 Elastic 分发,它可以从应用程序收集日志、跟踪和指标。当宣布这一消息时,我们还不支持 OpenAI 等大型语言模型 (LLM) 提供商。这限制了开发人员对生成式人工智能 (GenAI) 应用程序的洞察力。

在之前的文章中,我们回顾了 LLM 可观察性的重点,例如 token 使用情况、聊天延迟以及了解你的应用程序使用哪些工具(如 DuckDuckGo)。通过正确的日志、跟踪和指标,开发人员可以回答诸如 “Which version of a model generated this response? - 哪个版本的模型生成了此响应?”之类的问题。或 “What was the exact chat prompt created by my RAG application? - 我的 RAG 应用程序创建的聊天提示的具体是什么?”

在过去的六个月中,Elastic 与 OpenTelemetry 社区的其他成员一起投入了大量精力来共享这些领域的规范,包括收集 LLM 相关日志、指标和跟踪的代码。我们的目标是扩展 EDOT 为 GenAI 用例带来的零代码(代理)方法。

今天,我们宣布了 EDOT 语言 SDK 中的第一个 GenAI 仪器功能:OpenAI。下面,你将看到如何使用我们的 Python、Node.js 和 Java EDOT SDK 观察 GenAI 应用程序。

示例应用程序

我们中的许多人可能熟悉 ChatGPT,它是 OpenAI GPT 模型系列的前端。使用这个,你可以提出一个问题,助手可能会根据你问的问题和 LLM 所训练的文本正确地回答。

以下是 ChatGPT 回答的一个深奥问题的示例:

我们的示例应用程序将简单地询问这个预定义的问题并打印结果。我们将使用三种语言编写它:Python、JavaScript 和 Java。

我们将采用“零代码”(代理)方法执行每个操作,以便在配置了 Kibana 和 APM 服务器的 Elastic Stack 中捕获和查看日志、指标和跟踪。如果你尚未运行堆栈,请使用 ElasticSearch Labs 的说明进行设置。

无论编程语言是什么,都需要三个变量:OpenAI API 密钥、Elastic APM 服务器的位置以及应用程序的服务名称。你将把这些写入名为 .env 的文件中。

OPENAI_API_KEY=sk-YOUR_API_KEY
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8200
OTEL_SERVICE_NAME=openai-example

每次应用程序运行时,它都会将日志、跟踪和指标发送到 APM 服务器,你可以通过像这样查询 Kibana 来找到应用程序 “openai-example”

http://localhost:5601/app/apm/services/openai-example/transactions

当你选择一个跟踪时,你将看到 OpenAI SDK 发出的 LLM 请求,以及由此引起的 HTTP 流量:

选择 logs 选项卡来查看对 OpenAI 的确切请求和响应。这些数据对于问答和评估用例至关重要。

你还可以转到 Metrics Explorer 并在运行应用程序的所有时间内绘制 “gen_ai.client.token.usage” 或 “gen_ai.client.operation.duration” 的图表:

http://localhost:5601/app/metrics/explorer

继续查看该应用程序在 Python、Java 和 Node.js 中的具体外观和运行方式。那些已经使用我们的 EDOT 语言 SDK 的人将会熟悉它的工作原理。

Python

假设你已经安装了 python,那么第一件事就是设置一个虚拟环境并安装所需的软件包:OpenAI 客户端、用于读取 .env 文件的辅助工具和我们的 EDOT Python 包:

python3 -m venv .venv
source .venv/bin/activate
pip install openai "python-dotenv[cli]" elastic-opentelemetry

接下来,运行 edot-bootstrap,它将分析代码以安装任何可用的相关工具:

edot-bootstrap —-action=install

现在,创建你的 .env 文件,如本文前面所述,以及 chat.py 中的以下源代码

import osimport openaiCHAT_MODEL = os.environ.get("CHAT_MODEL", "gpt-4o-mini")def main():client = openai.Client()messages = [{"role": "user","content": "Answer in up to 3 words: Which ocean contains Bouvet Island?",}]chat_completion = client.chat.completions.create(model=CHAT_MODEL, messages=messages)print(chat_completion.choices[0].message.content)if __name__ == "__main__":main()

现在你可以使用以下命令运行所有内容:

dotenv run -- opentelemetry-instrument python chat.py

最后,在 Kibana 中查找名为 “openai-example” 的服务的跟踪。你应该会看到一个名为 “chat gpt-4o-mini” 的交易。

你无需复制/粘贴上述内容,而是可以在此处的 Python EDOT 存储库中找到此示例的工作副本(以及说明)。

最后,如果你想尝试更全面的示例,请查看使用 OpenAI 和 ElasticSearch 的 Elser 检索模型的 chatbot-rag-app。

Java

初始化 Java 项目有几种流行的方法。由于我们使用的是 OpenAI,第一步是配置依赖项 com.openai:openai-java 并将以下源代码写为 Chat.java。

package openai.example;import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.*;final class Chat {public static void main(String[] args) {String chatModel = System.getenv().getOrDefault("CHAT_MODEL", "gpt-4o-mini");OpenAIClient client = OpenAIOkHttpClient.fromEnv();String message = "Answer in up to 3 words: Which ocean contains Bouvet Island?";ChatCompletionCreateParams params = ChatCompletionCreateParams.builder().addMessage(ChatCompletionUserMessageParam.builder().content(message).build()).model(chatModel).build();ChatCompletion chatCompletion = client.chat().completions().create(params);System.out.println(chatCompletion.choices().get(0).message().content().get());}
}

构建项目使得所有依赖项都在一个 jar 中。例如,如果使用 Gradle,你将使用 com.gradleup.shadow 插件。

接下来,如前所述,创建 .env 文件,并下载我们将用来加载它的 shdotenv。

curl -O -L https://github.com/ko1nksm/shdotenv/releases/download/v0.14.0/shdotenv
chmod +x ./shdotenv

此时,你有一个 jar 和配置,可以用来运行 OpenAI 示例。下一步是下载 EDOT Java javaagent 二进制文件。这是记录和导出日志、指标和跟踪的部分。

curl -o elastic-otel-javaagent.jar -L 'https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=co.elastic.otel&a=elastic-otel-javaagent&v=LATEST'

假设你组装了一个名为 openai-example-all.jar 的文件,请使用 EDOT 运行它,如下所示:

./shdotenv java -javaagent:elastic-otel-javaagent.jar -jar openai-example-all.jar

最后,在 Kibana 中查找名为 “openai-example” 的服务的跟踪。你应该会看到一个名为 “chat gpt-4o-mini” 的交易。

你无需复制/粘贴上述内容,而是可以在此处的 EDOT Java 源代码存储库中找到此示例的工作副本。

Node.js

假设你已经安装并配置了 npm,请运行以下命令来初始化示例项目。这包括 openai 包和 @elastic/opentelemetry-node (EDOT Node.js)

npm init -y
npm install openai @elastic/opentelemetry-node

接下来,创建 .env 文件,如本文前面所述以及 index.js 中的以下源代码:

const {OpenAI} = require('openai');let chatModel = process.env.CHAT_MODEL ?? 'gpt-4o-mini';async function main() {const client = new OpenAI();const completion = await client.chat.completions.create({model: chatModel,messages: [{role: 'user',content: 'Answer in up to 3 words: Which ocean contains Bouvet Island?',},],});console.log(completion.choices[0].message.content);
}main();

有了这个,使用 EDOT 运行上述源,如下所示:

node --env-file .env --require @elastic/opentelemetry-node index.js

最后,在 Kibana 中查找名为 “openai-example” 的服务的跟踪。你应该会看到一个名为 “chat gpt-4o-mini” 的交易。

你无需复制/粘贴上述内容,就可以在此处的 EDOT Node.js 源存储库中找到此示例的工作副本。

最后,如果你想尝试一个更全面的示例,请查看 openai-embeddings,它使用 OpenAI 和 Elasticsearch 作为向量数据库!

结束语

以上你已经了解了如何使用 OpenTelemetry 的弹性分布 (EDOT) 以三种不同的语言观察官方 OpenAI SDK。

值得注意的是,一些 OpenAI SDK 以及围绕生成式 AI 的 OpenTelemetry 规范都是实验性的。如果你发现这对你有帮助,或者发现故障,请加入我们的 Slack 并让我们知道。

通过设置 OPENAI_BASE_URL 并选择相关模型,多个 LLM 平台可以接受来自 OpenAI 客户端 SDK 的请求。在开发过程中,我们测试了 Azure OpenAI 服务并使用 Ollama 进行集成测试。事实上,我们将代码贡献给 Ollama 以改进其 OpenAI 支持。无论你选择哪种 OpenAI 兼容平台,我们都希望这个新工具可以帮助你了解 LLM 的使用情况。

最后,虽然第一个搭载 EDOT 的生成式 AI SDK 是 OpenAI,但你很快就会看到更多。我们已经在 Bedrock 上开展工作,并与 OpenTelemetry 社区的其他人合作开发其他平台。请继续关注此博客以获取令人兴奋的更新。

原文:Instrumenting your OpenAI-powered Python, Node.js, and Java Applications with EDOT — Elastic Observability Labs

相关文章:

使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序

作者:来自 Elastic Adrian Cole Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪,而无需任何代码更改。 介绍 去年,我们宣布了 OpenTelemetry…...

基于 STM32 的病房监控系统

标题:基于 STM32 的病房监控系统 内容:1.摘要 基于 STM32 的病房监控系统摘要:本系统采用 STM32 微控制器作为核心,通过传感器实时监测病房内的环境参数,如温度、湿度、光照等,并将数据上传至云端服务器。医护人员可以通过手机或…...

线上HBase client返回超时异常分析 HBase callTimeout=60000

问题现象 HBase client直接返回超时异常 HBase callTimeout=60000, callDuration=60301: row ‘12649160863966c2790195059018040900010003320’ on table ‘Z_UPA’ at region=Z_UPA,1213d1a56,1184027415643. ba7224f83dbb09591a74b7059f17., hostname=abcd,60020,891863950…...

03.开闭原则详细介绍

03.开闭原则详细介绍 目录介绍 01.问题思考的分析02.如何理解开闭原则03.开闭原则的背景04.开闭原则比较难学05.实现开闭原则方式06.画图形案例分析07.银行业务案例分析08.开闭原则优缺点09.开闭原则的总结 推荐一个好玩网站 一个最纯粹的技术分享网站,打造精品…...

前端职业规划

前端开发的职业规划可以根据个人兴趣、技术深度和职业目标来制定。以下是一个典型的前端开发者职业发展路径,涵盖了从初级到高级的不同阶段,以及未来的发展方向: 1. 初级阶段(0-2 年) 目标:掌握基础技能&a…...

杂记:STM32 调试信息打印实现方式

杂记:STM32 调试信息打印实现方式 一、引言二、使用 USART 串口打印原理(二)实现步骤硬件连接代码实现 使用 ST - LINK 调试器 ITM 打印(一)原理(二)实现步骤硬件连接代码实现 四、使用 Semihos…...

python+unity落地方案实现AI 换脸融合

先上效果再说技术结论,使用的是自行搭建的AI人脸融合库,可以离线不受限制无限次生成,有需要的可以后台私信python ai换脸融合。 TODO 未来的方向:3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface,openvc…...

ComfyUI流程图生图原理详解

一、引言 ComfyUI 是一款功能强大的工具,在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题,并深入剖析图生图过程及相关参数,帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…...

【C++ 真题】P1824 进击的奶牛

P1824 进击的奶牛 题目描述 Farmer John 建造了一个有 N N N( 2 ≤ N ≤ 1 0 5 2 \leq N \leq 10 ^ 5 2≤N≤105) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x 1 , x 2 , ⋯ , x N x _ 1, x _ 2, \cdots, x _ N x1​,x2​,⋯,xN​&a…...

26、深度学习-自学之路-NLP自然语言处理-理解加程序,怎么把现实的词翻译给机器识别。

一、怎么能让机器能够理解我们的语言呢,我们可以利用神经网络干很多的事情,那么我们是不是也可以用神经元做自然语言处理呢,现在很多的实际应用已经说明了这个问题,可以这么做。 那我们考虑一下该怎么做,首先我们应该…...

24电子信息类研究生复试面试问题汇总 电子信息类专业知识问题最全!电子信息复试全流程攻略 电子信息考研复试真题汇总

你是不是在为电子信息考研复试焦虑?害怕被老师问到刁钻问题、担心专业面答不上来?别慌!作为复试面试92分逆袭上岸的学姐,今天手把手教你拆解电子信息类复试通关密码!看完这篇,让你面试现场直接开大&#xf…...

leetcode25. K 个一组翻转链表

代码如图所示:下面还有一个跑代码的流程图,结合两个图片理解起来就好,感觉已经解释的很清晰了!! 一定要记住return dummy.next;这表示伪节点的下一个节点才是反转完的整个链表的头结点 补一个最后的,有点纰…...

工厂方法模式详解(Java)

一、工厂方法模式基础 1.1 定义与角色 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪一个类。这种模式的核心在于定义一个创建产品对象的工厂接口,将实际创建产品的过程延迟到子类中实现。这样做的主要…...

SpringBoot+Dubbo+zookeeper 急速入门案例

项目目录结构&#xff1a; 第一步&#xff1a;创建一个SpringBoot项目&#xff0c;这里选择Maven项目或者Spring Initializer都可以&#xff0c;这里创建了一个Maven项目&#xff08;SpringBoot-Dubbo&#xff09;&#xff0c;pom.xml文件如下&#xff1a; <?xml versio…...

pdf.js默认显示侧边栏和默认手形工具

文章目录 默认显示侧边栏(切换侧栏)默认手形工具(手型工具) 大部分的都是在viewer.mjs中的const defaultOptions 变量设置默认值,可以使用数字也可以使用他们对应的变量枚举值 默认显示侧边栏(切换侧栏) 在viewer.mjs中找到defaultOptions,大概在732行,或则搜索sidebarViewOn…...

数据库第三次作业

第一题&#xff1a; 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;S…...

渗透利器:YAKIT 工具-基础实战教程.

YAKIT 工具-基础实战教程. YAKIT&#xff08;Yak Integrated Toolkit&#xff09;是一款基于Yak语言开发的集成化网络安全单兵工具&#xff0c;旨在覆盖渗透测试全流程&#xff0c;提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…...

变分边界详解

起因 当时看VAE论文时有这么一段&#xff0c;但是看完直接一头雾水&#xff0c;这都那跟哪&#xff0c;第一个公式咋做的变换就变出那么一堆。网上搜了很多博客都语焉不详&#xff0c;只好自己来写一篇&#xff0c;希望能解答后来人的疑惑。 公式1 参考文章&#xff1a;证据…...

计算机毕业设计——Springboot餐厅点餐系统

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…...

Dav_笔记14:优化程序提示 HINTs -3

查询转换的提示 以下每个提示都指示优化程序使用特定的SQL查询转换&#xff1a; ■NO_QUERY_TRANSFORMATION ■USE_CONCAT ■NO_EXPAND ■REWRITE和NO_REWRITE ■MERGE和NO_MERGE ■STAR_TRANSFORMATION和NO_STAR_TRANSFORMATION ■事实和NO_FACT ■UNNEST和NO_UNNEST…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...