监控 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 门户中完成以下步骤

  1. 创建一个事件中心,用于接收从 Azure 服务导出的日志,并使其可用于 Elastic Agent。
  2. 配置诊断设置,以将您的日志发送到事件中心。
  3. 创建一个存储帐户容器,Elastic Agent 可以在其中存储使用者组信息。
创建事件中心
编辑

Azure 事件中心是一个数据流平台和事件摄取服务,您可以使用它来存储正在传输中的 Azure 日志,然后再将其发送到 Elasticsearch。在本教程中,您将创建一个事件中心,因为您要从一项服务收集日志。

要创建 Azure 事件中心

  1. 转到Azure 门户
  2. 搜索并选择事件中心
  3. 单击创建并创建一个新的事件中心命名空间。您需要创建一个新的资源组,或选择一个现有资源组。
  4. 输入命名空间的必要设置,然后单击查看 + 创建
  5. 单击创建以部署资源。
  6. 在新命名空间中,单击+ 事件中心,然后输入事件中心的名称。
  7. 单击查看 + 创建,然后单击创建以部署资源。
  8. 记下事件中心名称,因为您将在步骤 3:配置 Azure OpenAI 集成中用它来配置集成设置。
配置诊断设置
编辑

每个创建日志的 Azure 服务都有诊断设置,允许您将日志和指标导出到外部目标。在此步骤中,您将配置 Azure OpenAI 服务以将审计日志以及请求和响应日志导出到您在上一步中创建的事件中心。

要配置诊断设置以导出日志

  1. 转到Azure 门户并打开您的 OpenAI 资源。
  2. 在导航窗格中,选择诊断设置添加诊断设置
  3. 输入诊断设置的名称。
  4. 在日志类别列表中,选择审计日志请求和响应日志
  5. 在“目标详细信息”下,选择流式传输到事件中心,然后选择您在创建事件中心中创建的命名空间和事件中心。
  6. 保存诊断设置。
创建存储帐户容器
编辑

Elastic Agent 将使用者组信息(状态、位置或偏移量)存储在存储帐户容器中。使 Elastic Agent 可以使用此信息,使其能够共享日志处理并在重启后从上次处理的日志继续。Elastic Agent 可以为一个集成使用一个存储帐户容器。Agent 使用集成名称和事件中心名称来标识 Blob,以唯一地存储使用者组信息。

要创建存储帐户

  1. 转到Azure 门户并选择存储帐户
  2. 选择创建存储帐户
  3. 高级下,确保这些设置如下所示

    • 分层命名空间:已禁用
    • 最低 TLS 版本:版本 1.2
    • 访问层:热
  4. 数据保护下,确保这些设置如下所示

    • 启用 Blob 的软删除:已禁用
    • 启用容器的软删除:已禁用
  5. 单击查看 + 创建,然后单击创建
  6. 记下存储帐户名称和存储帐户访问密钥,因为您稍后将在步骤 3:配置 Azure OpenAI 集成中使用它们来验证 Elastic 应用程序对此存储帐户的请求。
步骤 2:设置 Azure 以收集指标
编辑

Azure OpenAI 集成指标数据流收集特定于 Azure OpenAI 服务的认知服务指标。在 Elastic Agent 可以收集您的指标并将它们发送到 Kibana 之前,它需要一个应用程序注册才能代表您访问 Azure 并使用 Azure API 收集数据。

在您的 Azure 实例中完成以下步骤以注册新的 Azure 应用程序

  1. 创建应用程序注册。
  2. 向应用程序添加凭据。
  3. 向您的应用程序添加角色分配。
创建应用程序注册
编辑

要注册您的应用程序

  1. 转到Azure 门户
  2. 搜索并选择Microsoft Entra ID
  3. 管理下,选择应用注册新建注册
  4. 输入您的应用程序的显示名称(例如,elastic-agent)。
  5. 指定谁可以使用该应用程序。
  6. Elastic Agent 不使用重定向 URI,因此您可以将此字段留空。
  7. 单击注册
  8. 记下应用程序(客户端)ID,因为您将在步骤 3:配置 Azure OpenAI 集成中的集成设置中用它来指定客户端 ID
创建凭据并将其添加到您的应用程序
编辑

凭据允许您的应用程序访问 Azure API 并验证自身身份,因此您无需在运行时执行任何操作。Elastic Azure OpenAI 集成使用客户端密钥进行身份验证。

要创建并添加客户端密钥

  1. Azure 门户中,选择您在上一步中创建的应用程序。
  2. 选择证书 & 机密客户端机密新建客户端机密
  3. 添加描述(例如,“Elastic Agent 客户端机密”)。
  4. 选择一个到期时间或指定一个自定义生存期。
  5. 选择添加
  6. 记下客户端机密表中的,因为您将在步骤 3:配置 Azure OpenAI 集成中用它来指定客户端机密

    离开此页面后,密钥值将不可见。将该值记录在安全的地方。

向您的应用程序添加角色分配
编辑

要向您的应用程序添加角色分配

  1. Azure 门户中,搜索并选择订阅
  2. 选择要向其分配应用程序的订阅。
  3. 选择访问控制 (IAM)
  4. 选择添加添加角色分配
  5. 角色选项卡中,搜索并选择监控读取者
  6. 单击下一步以打开成员选项卡。
  7. 选择向以下对象分配访问权限用户、组或服务主体,然后选择选择成员
  8. 搜索并选择您的应用程序名称(例如,“elastic-agent”)。
  9. 单击选择
  10. 单击查看 + 分配
  11. 记下 Microsoft Entra 中的订阅 ID租户 ID,因为您将在集成中用它们来指定设置。
步骤 3:配置 Azure OpenAI 集成
编辑
  1. 在主菜单中查找集成,或使用全局搜索字段
  2. 在查询栏中,搜索Azure OpenAI,然后选择 Azure OpenAI 集成卡片。
  3. 单击添加 Azure OpenAI
  4. 在“集成设置”下,配置集成名称,并可选择添加说明。

    如果您没有用于配置集成的选项,则您可能处于为新部署设计的流程中。按照步骤操作,然后在准备好配置集成时返回本教程。

配置日志收集
编辑

要收集 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。否则,你的集成可能无法按预期运行。

你可以在任何可以访问 Azure 帐户并将事件转发到 Elasticsearch 的主机上安装 Elastic Agent。

  1. 在弹出窗口中,单击将 Elastic Agent 添加到你的主机以打开添加代理浮出层。

    如果你不小心关闭了弹出窗口,请转到Fleet代理,然后单击添加代理以访问安装说明。

    添加代理浮出层有两个选项:在 Fleet 中注册独立运行。默认是在 Fleet 中注册代理,因为这通过在 Kibana 中提供集中管理工具来减少管理主机的人员的工作量。

  2. 你需要的注册令牌应该已经选中。

    注册令牌特定于你刚刚创建的 Elastic Agent 策略。当你运行命令在 Fleet 中注册代理时,你将传入注册令牌。

  3. 要下载、安装和注册 Elastic Agent,请选择你的主机操作系统并复制说明中显示的安装命令。
  4. 在你想要安装 Elastic Agent 的主机上运行该命令。

Elastic Agent 需要几分钟才能在 Fleet 中注册、下载策略中指定的配置并开始收集数据。你可以等待以确认传入的数据,或关闭窗口。

步骤 5:在 Kibana 中查看日志和指标
编辑

现在你的日志和指标数据正在流式传输到 Elasticsearch,你可以在 Kibana 中查看它们。你有以下查看数据的选项

使用概览仪表板查看日志和指标
编辑

Elastic Azure OpenAI 集成带有内置概览仪表板,用于可视化你的日志和指标数据。要查看集成仪表板

  1. 在主菜单中查找仪表板或使用全局搜索字段
  2. 搜索Azure OpenAI
  3. 选择 [Azure OpenAI] 概览 仪表板。

在这里,你会找到 Azure OpenAI 服务的重要指标的可视化,例如请求率、错误率、令牌使用量和聊天完成延迟。要放大你的数据,请在可视化中的条形上单击并拖动。

screenshot of the Azure OpenAI integration dashboard

有关仪表板和可视化的更多信息,请参阅仪表板和可视化文档。

使用 Discover 查看日志和指标
编辑

在主菜单中查找Discover或使用全局搜索字段。从数据视图下拉列表中,选择 logs-*metrics-* 以查看特定数据。你还可以创建数据视图,例如,如果你想同时查看 logs-*metrics-*

screenshot of the Discover data view dropdown

在这里,筛选你的数据并深入研究各个日志以查找信息并解决问题。有关你可能想要筛选的 Azure OpenAI 字段列表,请参阅Azure OpenAI 集成文档。

screenshot of the discover main page

有关使用 Discover 和创建数据视图的更多信息,请参阅Discover 文档。

使用 Logs Explorer 查看日志
编辑

要查看 Azure OpenAI 日志,请打开 Kibana 并转到Logs Explorer(在全局搜索字段中查找 Logs Explorer)。使用Logs Explorer,你可以快速搜索和筛选你的日志数据、获取有关日志字段结构的信息,并在可视化中显示你的发现。

screenshot of the logs explorer main page

Logs Explorer中,你可以从数据选择器中选择 Azure OpenAI 集成以查看你的 Kubernetes 数据。

screenshot of the logs explorer data selector

在这里,筛选你的日志数据并深入研究各个日志以查找信息并解决问题。有关你可能想要筛选的 Azure OpenAI 字段列表,请参阅Azure OpenAI 集成文档。

有关 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 导出器端点和身份验证标头

  1. 在主菜单中查找集成,或使用全局搜索字段
  2. 选择APM集成。
  3. 向下滚动到APM 代理,然后选择OpenTelemetry选项卡。
  4. 记下以下配置设置的配置值

    • 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 span 中。

示例应用程序中的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

将此数据添加到我们的 span 中使我们可以将其发送到 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
screenshot of the discover main page

然后,使用这些字段创建可视化并构建仪表板。有关更多信息,请参阅仪表板和可视化文档。

screenshot of the Azure OpenAI APM dashboard
下一步是什么?
编辑

现在你已经了解了如何查找和可视化 Azure OpenAI 日志和指标,你需要确保你充分利用你的数据。Elastic 提供了一些有用的工具来帮助你实现这一目标

  • 警报:创建阈值规则,以便在您的指标或日志达到或超过指定值时通知您:有关设置警报的更多信息,请参阅指标阈值日志阈值
  • SLO:根据您的指标,为 Azure OpenAI 服务性能设置可衡量的目标。定义后,您可以使用仪表板和警报来监控您的 SLO,并跟踪其随时间推移与目标的进展情况。有关设置和跟踪 SLO 的更多信息,请参阅服务级别目标 (SLO)
  • 机器学习 (ML) 作业:设置 ML 作业以查找 Azure OpenAI 数据中的异常事件和模式。有关设置 ML 作业的更多信息,请参阅查找异常