【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句

路边两盏灯發表於2024-04-17

問題描述

在為APIM服務配置了診斷日誌(Diagnostic Setting),把日誌收集在Log A Workspace中,需要驗證日誌中是否能檢視到請求的錯誤資訊。

【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句

所以想人為的來製造一些錯誤。經過網路搜尋,參考Policy的文件介紹後,完成了以下3種錯誤

【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句

第一種:使用 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>

效果展示:

【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句

第二種: 定義變數,直接丟擲異常 @{ 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>

效果展示:

【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句

第三種: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>

效果展示:

【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句

實際錯誤:

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中,也包含了請求中的詳細錯誤。

【Azure APIM】列舉幾種在APIM 策略中的主動生產的錯誤語句

參考資料

API 管理策略參考 : https://docs.azure.cn/zh-cn/api-management/api-management-policies

相關文章