如何在 Azure API 管理中将事件记录到 Azure 事件中心

适用于:所有 API 管理层级

本文介绍如何使用 Azure 事件中心记录 API 管理事件。

事件中心是一个高度可缩放的引入服务,每秒可以引入数百万的事件,使用户能够处理和分析连接设备和应用程序生成的海量数据。 事件中心充当事件管道的“前门”,将数据收集到事件中心后,可以使用任何实时分析提供程序或批处理/存储适配器来转换和存储这些数据。 事件中心可将事件流的生成与这些事件的使用分离开来,因此,事件使用者可以根据自己的计划访问事件。

先决条件

配置对事件中心的访问权限

若要将事件记录到事件中心,需要配置凭据以便从API 管理进行访问。 API 管理支持使用以下任意一种访问机制:

  • 供 API 管理实例使用的托管标识(推荐)
  • 事件中心连接字符串

注意

如果可能,Microsoft 建议使用托管标识凭据以增强安全性。

选项 1:配置 API 管理托管标识

  1. 在 API 管理实例中为 API 管理启用系统分配的托管标识或用户分配的托管标识

    • 如果启用用户分配的托管标识,请记下该标识的“客户端 ID”。
  2. 为标识分配 Azure 事件中心数据发送者角色,范围限定为事件中心命名空间或用于记录的事件中心。 若要分配角色,请使用 Azure 门户或其他 Azure 工具。

选项 2:配置事件中心连接字符串

有关事件中心连接字符串的详细信息,请参阅获取事件中心连接字符串

  • 连接字符串既可以供事件中心命名空间使用,也可以供用于从 API 管理进行记录的特定事件中心所使用。
  • 连接字符串的共享访问策略必须至少启用“发送”权限。

创建 API 管理记录器

下一步是在 API 管理服务中配置记录器,以便它可以将事件记录到事件中心。

直接使用 API 管理 REST API 或使用工具(包括 Azure PowerShell、Bicep 模板或 Azure 资源管理模板)创建和管理 API 管理记录器。

可使用系统分配的或用户分配的托管标识凭据将 API 管理记录器配置到事件中心。

包含系统分配的托管标识凭据的记录器

如需了解先决条件,请参阅配置API 管理托管标识

使用包含以下请求正文的 API 管理记录器 - 创建或更新 REST API。

{
  "properties": {
    "loggerType": "azureEventHub",
    "description": "Event Hub logger with system-assigned managed identity",
    "credentials": {
         "endpointAddress":"<EventHubsNamespace>.servicebus.chinacloudapi.cn",
         "identityClientId":"SystemAssigned",
         "name":"<EventHubName>"
    }
  }
}

包含用户分配的托管标识凭据的记录器

如需了解先决条件,请参阅配置API 管理托管标识

使用包含以下请求正文的 API 管理记录器 - 创建或更新 REST API。

{
  "properties": {
    "loggerType": "azureEventHub",
    "description": "Event Hub logger with user-assigned managed identity",
    "credentials": {
         "endpointAddress":"<EventHubsNamespace>.servicebus.chinacloudapi.cn",
         "identityClientId":"<ClientID>",
         "name":"<EventHubName>"
    }
  }
}

选项 2. 包含连接字符串凭据的记录器

如需了解先决条件,请参阅配置事件中心连接字符串

注意

如果可能,Microsoft 建议使用托管标识凭据配置记录器。 请参阅本文前面的“使用托管标识凭据配置记录器”。

以下示例使用 New-AzApiManagementLogger cmdlet 通过配置连接字符串来创建事件中心的记录器。

# API Management service-specific details
$apimServiceName = "apim-hello-world"
$resourceGroupName = "myResourceGroup"

# Create logger
$context = New-AzApiManagementContext -ResourceGroupName $resourceGroupName -ServiceName $apimServiceName
New-AzApiManagementLogger -Context $context -LoggerId "ContosoLogger1" -Name "ApimEventHub" -ConnectionString "Endpoint=sb://<EventHubsNamespace>.servicebus.chinacloudapi.cn/;SharedAccessKeyName=<KeyName>;SharedAccessKey=<key>" -Description "Event hub logger with connection string"

配置 log-to-eventhub 策略

在 API 管理中配置了记录器后,就可以配置 log-to-eventhub 策略以记录所需事件。 例如,使用 log-to-eventhub 入站策略部分中的策略来记录请求,或在出站策略部分中使用策略来记录响应。

  1. 浏览到 API 管理实例。

  2. 选择 API,然后选择要将策略添加到的 API。 在此示例中,我们向 Unlimited 产品中的 Echo API 添加策略。

  3. 选择“所有操作”。

  4. 选择屏幕顶部的“设计”选项卡。

  5. 在“入站处理”或“出站处理”窗口中,选择 </>(代码编辑器)图标。 有关详细信息,请参阅如何设置或编辑策略

  6. 将光标放在 inboundoutbound 策略部分中。

  7. 在右侧窗口中,选择“高级策略”>“记录到 EventHub”。 这会插入 log-to-eventhub 策略语句模板。

    <log-to-eventhub logger-id="logger-id">
        @{
            return new JObject(
                new JProperty("EventTime", DateTime.UtcNow.ToString()),
                new JProperty("ServiceName", context.Deployment.ServiceName),
                new JProperty("RequestId", context.RequestId),
                new JProperty("RequestIp", context.Request.IpAddress),
                new JProperty("OperationName", context.Operation.Name)
            ).ToString();
        }
    </log-to-eventhub>
    
    1. logger-id 替换为在上一步中创建的 JSON 文件的名称。
    2. 可使用返回字符串作为 log-to-eventhub 元素值的任何表达式。 在此示例中,将记录一个 JSON 格式的字符串,其中包含日期和时间、服务名称、请求 ID、请求 IP 地址和操作名称。
  8. 选择“保存”保存更新后的策略配置。 保存后,策略立即处于活动状态,并且事件记录到指定的事件中心。

注意

允许从此 API 管理策略发送到事件中心的最大消息大小为 200 KB。 如果发送到事件中心的消息大于 200 KB,系统会自动截断该消息,而截断的消息则会传输到事件中心。 对于较大的消息,请考虑将 Azure 存储与 Azure API 管理结合使用,以此作为绕过 200KB 限制的解决方法。

使用 Azure 流分析在事件中心预览日志

可以使用 Azure 流分析查询来预览事件中心中的日志。

  1. 在 Azure 门户中,浏览到记录器发送事件到的事件中心。
  2. 在“功能”下,选择“处理数据”选项卡。
  3. 在“启用来自事件的实时见解”卡片上选择“开始”。
  4. 可以在“输入预览”选项卡上预览日志。如果显示的数据不是最新的,请选择“刷新”查看最新事件。

后续步骤