問題描述
在為APIM服務配置了診斷日誌(Diagnostic Setting),把日誌收集在Log A Workspace中,需要驗證日誌中是否能檢視到請求的錯誤資訊。
所以想人為的來製造一些錯誤。經過網路搜尋,參考Policy的文件介紹後,完成了以下3種錯誤
第一種:使用 return-response 返回指定錯誤碼
return-response 策略會取消執行,為呼叫方返回預設響應或自定義響應。
預設響應為200 OK,無正文。
可以透過上下文變數或策略語句指定自定義響應。 二者都提供時,會透過策略語句對上下文變數中包含的響應進行修改,然後再將其返回給呼叫方。
如下的示例:自定義返回505錯誤,並且設定錯誤訊息為 Bearer error="invalid_token"。
<policies> <inbound> <base /> </inbound> <backend> <base /> </backend> <outbound> <base /> <return-response> <set-status code="505" reason="error0" /> <set-header name="WWW-Authenticate" exists-action="override"> <value>Bearer error="invalid_token"</value> </set-header> </return-response> </outbound> <on-error> <base /> </on-error> </policies>
效果展示:
第二種: 定義變數,直接丟擲異常 @{ throw new Exception( ... ); }
set-variable 策略宣告set-variable變數,併為其分配透過表示式或字串文字指定的值。在賦值語句種直接丟擲異常
並使用重試(retry)策略,讓錯誤多次出現。使得診斷日誌種生成的日誌Errors中儲存請求中產生的全部錯誤
<policies> <inbound> <base /> </inbound> <backend> <base /> </backend> <outbound> <set-variable name="Error" value="@{ throw new Exception("test one time error here:ERR_001"+DateTime.UtcNow.ToString("O")); }" /> <base /> </outbound> <on-error> <base /> <retry condition="@(505>= 500)" count="3" interval="1" first-fast-retry="true"> <set-variable name="Error" value="@{ throw new Exception("test n time error here :ERR_002 or n in retry policy"+DateTime.UtcNow.ToString("O")); }" /> </retry> </on-error> </policies>
效果展示:
第三種:set-backend-service,設定錯誤域名,製造DNS解析錯誤
使用 set-backend-service 策略將傳入請求重定向到一個後端,此後端不同於在 API 設定中為該操作指定的後端。比如:https://www.ted1111.com/
<policies> <inbound> <base /> <set-backend-service base-url="https://www.ted1111.com/" /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
效果展示:
實際錯誤:
forward-request (32.859 ms)
{
"messages": [
"Error occured while calling backend service.",
"The remote name could not be resolved: 'www.ted1111.com'"
]
}
彙總
在Log A Workspace中, 檢視日誌表 ApiManagementGatewayLogs 中所收集的這三種錯誤日誌:
第一種錯誤:並沒有Errors被記錄,只有錯誤的狀態碼返回。
第二種錯誤:狀態碼為500。但是,在Errors包含了請求中生產的全部日誌,非常有利於Debug。
第三種錯誤:狀態碼為500。同時,在Errors中,也包含了請求中的詳細錯誤。
參考資料
API 管理策略參考 : https://docs.azure.cn/zh-cn/api-management/api-management-policies