监控 Microsoft Azure OpenAI

编辑

监控 Microsoft Azure OpenAI编辑

本教程将向您展示如何使用 Elastic Azure OpenAI 集成、Azure 门户和 Elastic Agent,通过 Elastic 可观测性收集和监控 Azure OpenAI 日志和指标。

您将学到什么编辑

您将学习如何

  • 设置您的 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 可以对所有集成使用一个存储帐户容器。 代理使用集成名称和事件中心名称来标识用于唯一存储使用者组信息的 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. 角色 选项卡中,搜索并选择 Monitoring Reader
  6. 单击 下一步 打开 成员 选项卡。
  7. 选择 分配访问权限到用户、组或服务主体,然后选择 选择成员
  8. 搜索并选择您的应用名称(例如,“elastic-agent”)。
  9. 单击 选择
  10. 单击 查看 + 分配
  11. 请记下 Microsoft Entra 中的 订阅 ID租户 ID,因为您将使用它们在集成中指定设置。

步骤 3:配置 Azure OpenAI 集成编辑

  1. 转到 Kibana 主页,然后单击 添加集成
  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. 在 Kibana 菜单的 分析 下,选择 仪表板
  2. 搜索 Azure OpenAI
  3. 选择 [Azure OpenAI] 概览 仪表板。

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

screenshot of the Azure OpenAI integration dashboard

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

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

从 Kibana 菜单的 分析 下,转到 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,您可以快速搜索和过滤日志数据、获取有关日志字段结构的信息,以及在可视化中显示您的发现。

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 可观察性中。然后,您可以查看和分析您的数据,以监控应用程序的成本和性能。

在本教程中,我们将使用一个 示例 Python 应用程序 和 Python OpenTelemetry 库来检测应用程序并将数据发送到可观察性。

设置环境变量编辑

要开始为您的 Azure OpenAI 应用程序收集 APM 数据,请从您的 Elastic Cloud 实例收集 OpenTelemetry OTLP 导出器端点和身份验证标头。

  1. 在 Kibana 主页中,选择 添加集成
  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 可观测性?”

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 端点,以便您可以在可观测性中搜索数据并构建仪表板和可视化。

实现以下函数允许您计算向 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 中的“发现”功能对其进行过滤和探索。从 分析 下的 Kibana 菜单中,转到 发现。然后,您可以按 OpenTelemetry 发送到可观测性的字段进行过滤,包括:

  • 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 作业的更多信息,请参阅 查找异常