监控 Microsoft Azure OpenAI
编辑监控 Microsoft Azure OpenAI
编辑本教程将向您展示如何使用 Elastic Azure OpenAI 集成、Azure 门户和 Elastic Agent 收集和监控 Azure OpenAI 日志和指标,并将其与 Elastic 可观测性结合使用。
您将学到什么
编辑您将学习如何
- 设置 Azure 实例以允许 Azure OpenAI 集成收集日志和指标。
- 配置 Azure OpenAI 集成以收集日志和指标。
- 在您的主机上安装 Elastic Agent。
- 使用内置仪表板和 Discover 在 Kibana 中查看您的日志和指标。
步骤 1:设置 Azure 以收集日志
编辑Elastic Azure OpenAI 集成捕获审核日志以及请求和响应日志。
- 审核日志提供了与 Azure OpenAI 服务的使用和管理相关的各种信息。
- 请求和响应日志提供了有关对服务发出的每个请求以及服务提供的相应响应的信息。
有关从审核日志以及请求和响应日志中摄取的字段的更多信息,请参阅 Azure OpenAI 集成 文档。
在 Elastic Agent 可以收集您的日志并将其发送到 Kibana 之前,请在 Azure 门户 中完成以下步骤
- 创建一个事件中心,用于接收从 Azure 服务导出的日志并将其提供给 Elastic Agent。
- 配置诊断设置以将您的日志发送到事件中心。
- 创建一个存储帐户容器,Elastic Agent 可以将消费者组信息存储在其中。
创建事件中心
编辑Azure 事件中心 是一个数据流平台和事件摄取服务,您可以使用它在将 Azure 日志发送到 Elasticsearch 之前存储这些日志。在本教程中,您创建一个事件中心,因为您正在从一个服务收集日志。
要创建 Azure 事件中心,请执行以下操作
- 转到 Azure 门户。
- 搜索并选择 事件中心。
- 单击 创建 并创建一个新的事件中心命名空间。您需要创建一个新的资源组,或选择一个现有的资源组。
- 输入命名空间所需的设置,然后单击 查看 + 创建。
- 单击 创建 以部署资源。
- 在新命名空间中,单击 + 事件中心 并输入事件中心的名称。
- 单击 查看 + 创建,然后单击 创建 以部署资源。
- 记下事件中心的名称,因为您将在 步骤 3:配置 Azure OpenAI 集成 中使用它来配置集成设置。
配置诊断设置
编辑每个创建日志的 Azure 服务都具有诊断设置,允许您将日志和指标导出到外部目标。在此步骤中,您将配置 Azure OpenAI 服务以将审核日志以及请求和响应日志导出到您在上一步中创建的事件中心。
要配置诊断设置以导出日志,请执行以下操作
创建存储帐户容器
编辑Elastic Agent 将消费者组信息(状态、位置或偏移量)存储在存储帐户容器中。使此信息可供 Elastic Agent 使用,使它们能够共享日志处理并在重新启动后从上次处理的日志恢复。Elastic Agent 可以为所有集成使用一个存储帐户容器。代理使用集成名称和事件中心名称来唯一标识存储消费者组信息的 Blob。
要创建存储帐户,请执行以下操作
- 转到 Azure 门户 并选择 存储帐户。
- 选择 创建存储帐户。
-
在 高级 下,确保以下设置如下
- 分层命名空间:禁用
- 最低 TLS 版本:版本 1.2
- 访问层级:热
-
在 数据保护 下,确保以下设置如下
- 启用 Blob 的软删除:禁用
- 启用容器的软删除:禁用
- 单击 查看 + 创建,然后单击 创建。
- 记下存储帐户名称和存储帐户访问密钥,因为您将在 步骤 3:配置 Azure OpenAI 集成 中使用它们来对 Elastic 应用程序对该存储帐户的请求进行身份验证。
步骤 2:设置 Azure 以收集指标
编辑Azure OpenAI 集成指标数据流收集特定于 Azure OpenAI 服务的认知服务指标。在 Elastic Agent 可以收集您的指标并将其发送到 Kibana 之前,它需要一个应用注册以代表您访问 Azure 并使用 Azure API 收集数据。
在您的 Azure 实例中完成以下步骤以注册新的 Azure 应用
- 创建应用注册。
- 向应用添加凭据。
- 向您的应用添加角色分配。
创建应用注册
编辑要注册您的应用,请执行以下操作
- 转到 Azure 门户。
- 搜索并选择 Microsoft Entra ID。
- 在 管理 下,选择 应用注册 → 新注册。
- 输入应用的显示名称(例如,
elastic-agent
)。 - 指定谁可以使用该应用。
- Elastic Agent 不使用重定向 URI,因此您可以将此字段留空。
- 单击 注册。
- 记下 应用程序(客户端)ID,因为您将在 步骤 3:配置 Azure OpenAI 集成 中使用它来指定集成设置中的 客户端 ID。
创建凭据并将其添加到您的应用
编辑凭据允许您的应用访问 Azure API 并对其自身进行身份验证,因此您无需在运行时执行任何操作。Elastic Azure OpenAI 集成使用客户端密钥进行身份验证。
要创建和添加客户端密钥,请执行以下操作
- 从 Azure 门户 中,选择您在上节中创建的应用。
- 选择 证书和密钥 → 客户端密钥 → 新客户端密钥。
- 添加说明(例如,“Elastic Agent 客户端密钥”)。
- 选择一个过期时间或指定自定义生存期。
- 选择 添加。
-
记下 客户端密钥 表格中的 值,因为您将在 步骤 3:配置 Azure OpenAI 集成 中使用它来指定 客户端密钥。
离开此页面后,将无法查看密钥值。请将该值记录在安全的地方。
向您的应用添加角色分配
编辑要向您的应用添加角色分配,请执行以下操作
- 从 Azure 门户 中,搜索并选择 订阅。
- 选择要为应用分配角色的订阅。
- 选择 访问控制 (IAM)。
- 选择 添加 → 添加角色分配。
- 在 角色 选项卡中,搜索并选择 监视读取器。
- 单击 下一步 以打开 成员 选项卡。
- 选择 分配访问权限给 → 用户、组或服务主体,然后选择 选择成员。
- 搜索并选择您的应用名称(例如,“elastic-agent”)。
- 单击 选择。
- 单击 查看 + 分配。
- 记下 Microsoft Entra 中的 订阅 ID 和 租户 ID,因为您将在集成中使用这些设置。
步骤 3:配置 Azure OpenAI 集成
编辑- 在主菜单中查找 集成,或使用 全局搜索字段。
- 在查询栏中,搜索 Azure OpenAI 并选择 Azure OpenAI 集成卡片。
- 单击 添加 Azure OpenAI。
-
在“集成设置”下,配置集成名称,并可选择添加说明。
如果您没有配置集成的选项,则可能处于为新部署设计的流程中。按照步骤操作,然后在准备好配置集成时返回本教程。
配置日志收集
编辑要收集 Azure OpenAI 日志,请为以下必填字段指定值
事件中心 |
您之前创建的事件中心的名称。 |
连接字符串 |
事件中心命名空间的连接字符串主键。要了解如何获取连接字符串,请参阅 Azure 文档中的 获取事件中心连接字符串。 不要从 RootManageSharedAccessKey 策略复制连接字符串,而应创建一个新的共享访问策略(具有侦听权限),并从新策略中复制连接字符串。 |
存储帐户 |
您在创建存储帐户容器中设置的 Blob 存储帐户的名称。您可以对所有集成使用相同的存储帐户容器。 |
存储帐户密钥 |
为在创建存储帐户容器中创建的存储帐户定义的有效访问密钥。 |
配置指标收集
编辑要收集 Azure OpenAI 指标,请为以下必填字段指定值
客户端 ID |
您之前在创建服务主体时复制的应用程序(客户端)ID。 |
客户端密钥 |
您之前复制的密钥值。 |
租户 ID |
Azure Active Directory 主页上列出的租户 ID。 |
订阅 ID |
订阅主页上列出的订阅 ID。 |
配置完集成后,点击保存并继续。您会收到一条通知,表明您的集成已添加。选择将 Elastic Agent 添加到您的主机。
步骤 4:安装 Elastic Agent
编辑为了获得对 Azure 最新 API 更改的支持,我们建议您使用与 Elastic Stack 兼容的最新 Elastic Agent 内部版本。否则,您的集成可能无法按预期工作。
您可以将 Elastic Agent 安装在任何可以访问 Azure 帐户并将事件转发到 Elasticsearch 的主机上。
-
在弹出窗口中,点击将 Elastic Agent 添加到您的主机以打开添加代理浮层。
如果您意外关闭了弹出窗口,请转到Fleet → Agents,然后点击添加代理以访问安装说明。
添加代理浮层有两个选项:加入 Fleet 和 独立运行。默认情况下,将代理加入 Fleet,因为这可以通过在 Kibana 中提供集中式管理工具来减少管理主机人员的工作量。
-
您需要的注册令牌应该已选择。
注册令牌特定于您刚刚创建的 Elastic Agent 策略。当您运行命令将代理加入 Fleet 时,将传入注册令牌。
- 要下载、安装和注册 Elastic Agent,请选择您的主机操作系统并复制说明中显示的安装命令。
- 在您要安装 Elastic Agent 的主机上运行该命令。
Elastic Agent 需要几分钟才能加入 Fleet、下载策略中指定的配置并开始收集数据。您可以等待确认传入数据,或关闭窗口。
步骤 5:在 Kibana 中查看日志和指标
编辑现在您的日志和指标数据已流式传输到 Elasticsearch,您可以在 Kibana 中查看它们。您可以使用以下选项查看您的数据
- 使用概览仪表板查看日志和指标:使用内置概览仪表板深入了解您的 Azure OpenAI 服务,例如总请求数和令牌使用情况。
- 使用 Discover 查看日志和指标:使用 Discover 根据特定字段查找和筛选您的日志和指标数据。
- 使用 Logs Explorer 查看日志:使用 Logs Explorer 深入查看您的日志。
使用概览仪表板查看日志和指标
编辑Elastic Azure OpenAI 集成附带一个内置概览仪表板,用于可视化您的日志和指标数据。要查看集成仪表板
- 在主菜单中查找仪表板,或使用全局搜索字段。
- 搜索Azure OpenAI。
- 选择
[Azure OpenAI] Overview
仪表板。
在这里,您会找到 Azure OpenAI 服务重要指标的可视化,例如请求率、错误率、令牌使用情况和聊天完成延迟。要放大数据,请点击并拖动可视化中的条形。
有关仪表板和可视化的更多信息,请参阅仪表板和可视化文档。
使用 Discover 查看日志和指标
编辑在主菜单中查找Discover,或使用全局搜索字段。从数据视图下拉列表中,选择logs-*
或 metrics-*
以查看特定数据。您还可以创建数据视图,例如,如果您想同时查看logs-*
和 metrics-*
。
在这里,筛选您的数据并深入研究各个日志以查找信息和解决问题。有关您可能希望按其筛选的 Azure OpenAI 字段的列表,请参阅Azure OpenAI 集成文档。
有关使用 Discover 和创建数据视图的更多信息,请参阅Discover文档。
使用 Logs Explorer 查看日志
编辑要查看 Azure OpenAI 日志,请打开 Kibana 并转到Logs Explorer(在全局搜索字段中查找Logs Explorer
)。使用Logs Explorer,您可以快速搜索和筛选日志数据、获取有关日志字段结构的信息以及以可视化的方式显示您的发现。
从Logs Explorer,您可以从数据选择器中选择 Azure OpenAI 集成以查看您的 Kubernetes 数据。
在这里,筛选您的日志数据并深入研究各个日志以查找信息和解决问题。有关您可能希望按其筛选的 Azure OpenAI 字段的列表,请参阅Azure OpenAI 集成文档。
有关 Logs Explorer 的更多信息,请参阅
- Logs Explorer,了解 Logs Explorer 的概述。
- 在 Logs Explorer 中筛选日志,了解有关在 Logs Explorer 中筛选日志的更多信息。
步骤 6:使用 OpenTelemetry 监控 Microsoft Azure OpenAI APM
编辑Azure OpenAI API 提供有用的数据,可帮助您监控和了解代码。使用 OpenTelemetry,您可以将这些数据引入 Elastic Observability。在那里,您可以查看和分析您的数据以监控应用程序的成本和性能。
在本教程中,我们将使用示例 Python 应用程序和 Python OpenTelemetry 库来检测应用程序并将数据发送到 Observability。
设置环境变量
编辑要开始收集 Azure OpenAI 应用程序的 APM 数据,请从您的 Elastic Cloud 实例中收集 OpenTelemetry OTLP 导出程序端点和身份验证标头
- 在主菜单中查找 集成,或使用 全局搜索字段。
- 选择APM集成。
- 向下滚动到APM 代理并选择OpenTelemetry选项卡。
-
记下以下配置设置的配置值
-
OTEL_EXPORTER_OTLP_ENDPOINT
-
OTEL_EXPORTER_OTLP_HEADERS
-
使用来自 APM 集成的配置值和您的Azure OpenAI API 密钥和端点,使用命令行上的 export 命令设置以下环境变量
export AZURE_OPENAI_API_KEY="your-Azure-OpenAI-API-key" export AZURE_OPENAI_ENDPOINT="your-Azure-OpenAI-endpoint" export OPENAI_API_VERSION="your_api_version" export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20<your-otel-exporter-auth-header>" export OTEL_EXPORTER_OTLP_ENDPOINT="your-otel-exporter-endpoint" export OTEL_RESOURCE_ATTRIBUTES=service.name=your-service-name
下载 Python 库
编辑使用此命令安装必要的 Python 库
pip3 install openai flask opentelemetry-distro[otlp] opentelemetry-instrumentation
检测应用程序
编辑以下代码来自示例应用程序。在实际用例中,您将把 import 语句添加到您的代码中。
我们本教程中使用的应用程序是一个简单的示例,它使用以下消息调用 Azure OpenAI API:“如何将我的 APM 数据发送到 Elastic Observability?”
import os from flask import Flask from openai import AzureOpenAI from opentelemetry import trace from monitor import count_completion_requests_and_tokens # Initialize Flask app app = Flask(__name__) # Set OpenAI API key client = AzureOpenAI( api_key=os.getenv("AZURE_OPENAI_API_KEY"), api_version=os.getenv("OPENAI_API_VERSION"), azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"), ) # Monkey-patch the openai.Completion.create function client.chat.completions.create = count_completion_requests_and_tokens( client.chat.completions.create ) tracer = trace.get_tracer("counter") @app.route("/completion") @tracer.start_as_current_span("completion") def completion(): response = client.chat.completions.create( model="gpt-4", messages=[ { "role": "user", "content": "How do I send my APM data to Elastic Observability?", } ], max_tokens=20, temperature=0, ) return response.choices[0].message.content.strip()
该代码使用猴子补丁(一种在 Python 中动态修改类或模块在运行时的行为的技术,方法是修改其属性或方法)来修改chat.completions
调用的行为,以便我们可以将响应指标添加到 OpenTelemetry 跨度。
示例应用程序中的monitor.py
文件检测了应用程序,可用于检测您自己的应用程序。
def count_completion_requests_and_tokens(func): @wraps(func) def wrapper(*args, **kwargs): counters["completion_count"] += 1 response = func(*args, **kwargs) token_count = response.usage.total_tokens prompt_tokens = response.usage.prompt_tokens completion_tokens = response.usage.completion_tokens cost = calculate_cost(response) strResponse = json.dumps(response, default=str) # Set OpenTelemetry attributes span = trace.get_current_span() if span: span.set_attribute("completion_count", counters["completion_count"]) span.set_attribute("token_count", token_count) span.set_attribute("prompt_tokens", prompt_tokens) span.set_attribute("completion_tokens", completion_tokens) span.set_attribute("model", response.model) span.set_attribute("cost", cost) span.set_attribute("response", strResponse) return response return wrapper
将这些数据添加到我们的跨度使我们能够将其发送到我们的 OTLP 端点,以便您可以在 Observability 中搜索数据并构建仪表板和可视化。
实现以下函数允许您计算单个对 OpenAI API 的请求的成本。
def calculate_cost(response): if response.model in ["gpt-4", "gpt-4-0314"]: cost = ( response.usage.prompt_tokens * 0.03 + response.usage.completion_tokens * 0.06 ) / 1000 elif response.model in ["gpt-4-32k", "gpt-4-32k-0314"]: cost = ( response.usage.prompt_tokens * 0.06 + response.usage.completion_tokens * 0.12 ) / 1000 elif "gpt-3.5-turbo" in response.model: cost = response.usage.total_tokens * 0.002 / 1000 elif "davinci" in response.model: cost = response.usage.total_tokens * 0.02 / 1000 elif "curie" in response.model: cost = response.usage.total_tokens * 0.002 / 1000 elif "babbage" in response.model: cost = response.usage.total_tokens * 0.0005 / 1000 elif "ada" in response.model: cost = response.usage.total_tokens * 0.0004 / 1000 else: cost = 0 return cost
要下载示例应用程序并亲自试用,请访问GitHub 仓库。
在 Kibana 中查看来自 OpenTelemetry 的 APM 数据
编辑摄取数据后,您可以使用 Kibana 中的 Discover 筛选和浏览数据。从 Kibana 菜单中的分析下转到Discover。然后,您可以按 OpenTelemetry 发送到 Observability 的字段进行筛选,包括
-
numeric_labels.completion_count
-
numeric_labels.completion_tokens
-
numeric_labels.cost
-
numeric_labels.prompt_tokens
-
numeric_labels.token_count
然后,使用这些字段创建可视化并构建仪表板。有关更多信息,请参阅仪表板和可视化文档。
后续步骤?
编辑既然您知道如何查找和可视化 Azure OpenAI 日志和指标,您需要确保充分利用您的数据。Elastic 提供了一些有用的工具来帮助您实现这一点
- 警报:创建阈值规则以在指标或日志达到或超过指定值时通知您:有关设置警报的更多信息,请参阅指标阈值和日志阈值。
- SLO: 基于您的指标,为您的 Azure OpenAI 服务性能设定可衡量的目标。定义后,您可以使用仪表板和警报监控您的 SLO,并跟踪其随时间推移相对于目标的进展情况。有关设置和跟踪 SLO 的更多信息,请参阅服务级别目标 (SLO)。
- 机器学习 (ML) 作业: 设置 ML 作业以在您的 Azure OpenAI 数据中查找异常事件和模式。有关设置 ML 作业的更多信息,请参阅查找异常。