【Azure API 管理】在APIM 中添加 log-to-eventhub 策略,把 Request Body 資訊全部記錄在Event Hub中
- 2021 年 12 月 1 日
- 筆記
- 【Azure API 管理】, APIM, Azure API 管理中將事件記錄到 Azure 事件中心, context.Request.Body.As(), log-to-eventhub, 事件中心 Azure Event Hub
問題描述
根據文檔 //docs.azure.cn/zh-cn/api-management/api-management-howto-log-event-hubs , 可以將Azure API Management中的請求記錄到Azure 事件中心。文檔中有詳細的步驟描述。但是在對於如何創建APIM的Logger, 如何在API中配置策略描述非常不清楚,所以本文就補充如何創建Logger及在APIM的API中添加log-to-eventhub 策略。
前提條件
- 創建 Azure 事件中心://docs.azure.cn/zh-cn/event-hubs/event-hubs-create
- Create APIM Logger: //docs.microsoft.com/zh-cn/rest/api/apimanagement/2020-12-01/logger/create-or-update
- Postman
- 下載 Service Bus Explorer查看事件中心消息://github.com/paolosalvatori/ServiceBusExplorer/releases
操作步驟
1) 創建APIM Logger
示例
PUT https://management.chinacloudapi.cn/subscriptions/<your subscription id>/resourceGroups/<group name>/providers/Microsoft.ApiManagement/service/<your apim name>/loggers/<loggerideh01>?api-version=2020-12-01
註:替換<>中的內容為自己的相應資源資訊,同時也定義loggers的名稱。
這裡的Endpoint為中國區Azure的Endpoint: //management.chinacloudapi.cn/, 如果需要Global Azure,則為://management.azure.com/
Authorization
兩種方式任選其一:
- Azure Active Directory OAuth2 Flow : //www.cnblogs.com/lulight/p/14279338.html
- 似乎用瀏覽器打開Azure APIM的門戶,通過F12–開發者選項中的 Network, 查看其中對API的請求,複製其中的Authorization 值
Body
{ "properties": { "loggerType": "azureEventHub", "description": "adding a new logger", "credentials": { "name": "<your event hub name>", "connectionString": "Endpoint=sb://<your event hub namespace>.servicebus.chinacloudapi.cn/;SharedAccessKeyName=xxxxxxxxxxxxxxxxx;SharedAccessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } } }
Response – 201 Created
{ "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/xxxx-rg/providers/Microsoft.ApiManagement/service/xxxx/loggers/loggerideh01", "type": "Microsoft.ApiManagement/service/loggers", "name": "loggerideh01", "properties": { "loggerType": "azureEventHub", "description": "adding a new logger", "credentials": { "name": "xxxxxxxxxxxx", "connectionString": "{{Logger-Credentials--xxxxxxxxxxxx}}" }, "isBuffered": true, "resourceId": null } }
演示動畫
2) 添加 log-to-eventhub 策略
- 瀏覽到自己的 APIM 實例。
- 選擇「API」選項卡。
- 選擇要將策略添加到的 API。
- 選擇「所有操作」。
- 選擇螢幕頂部的「設計」選項卡。
- 在「入站或出站處理」窗口中,單擊三角形(鉛筆旁邊)。
- 選擇「程式碼編輯器」。 有關詳細資訊,請參閱如何設置或編輯策略。
- 將游標放在
inbound
或outbound
策略部分中。 - 在右側窗口中,選擇「高級策略」 > 「記錄到 EventHub」。 這會插入
log-to-eventhub
策略語句模板。
注: Log-to-eventhub 中的logger-id由上面第一步創建。 Request Body的資訊一定要進行格式轉換。所以需要使用 context.Request.Body.As<string>()
<policies> <inbound> <base /> <log-to-eventhub logger-id="loggerideh01">@{ return new JObject( new JProperty("EventTime", DateTime.UtcNow.ToString()), new JProperty("ServiceName", context.Deployment.ServiceName), new JProperty("RequestId", context.RequestId), new JProperty("RequestBody1", context.Request.Body.As<string>()), new JProperty("OperationName", context.Operation.Name) ).ToString(); }</log-to-eventhub> </inbound> <backend> <base /> </backend> <outbound> <base /> <log-to-eventhub logger-id="loggerideh01">@{ return new JObject( new JProperty("EventTime", DateTime.UtcNow.ToString()), new JProperty("ServiceName", context.Deployment.ServiceName), new JProperty("RequestId", context.RequestId), new JProperty("RequestBody2", context.Response.Body.As<string>()), new JProperty("OperationName", context.Operation.Name) ).ToString(); }</log-to-eventhub> </outbound> <on-error> <base /> </on-error> </policies>
3) 連接到Event Hub,查看 Request Body 資訊
下載zip包,解壓後在裡面找到文件名為:ServiceBusExplorer.exe。 雙擊即可運行
在下面的字元串框中輸入Event Hub Namespace的連接字元串。點擊Save/ OK後,即可連接到Event Hub中。
進入保存日誌的Event Hub中,找到合適的分區數,點擊「Create Partitions Listener 」, 然後再彈出的頁面中點擊 「Strat」按鈕,就可以收到Event Hub中所存儲的消息
參考資料
如何在 Azure API 管理中將事件記錄到 Azure 事件中心 : //docs.azure.cn/zh-cn/api-management/api-management-howto-log-event-hubs#configure-log-to-eventhub-policies
Logger – Create Or Update : //docs.microsoft.com/zh-cn/rest/api/apimanagement/2020-12-01/logger/create-or-update#apimanagementcreateehlogger
創建 Azure 事件中心://docs.azure.cn/zh-cn/event-hubs/event-hubs-create
下載 Service Bus Explorer查看事件中心消息://github.com/paolosalvatori/ServiceBusExplorer/releases