重置配额运行时错误问题排查

您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

InvalidRLPolicy

错误代码

policies.resetquota.InvalidRLPolicy

错误响应正文

{
    "fault": {
        "faultstring": "Invalid rate limit policy quota_policy_name",
        "detail": {
            "errorcode": "policies.resetquota.InvalidRLPolicy"
        }
    }
}

错误消息示例

{
    "fault": {
        "faultstring": "Invalid rate limit policy MyQuotaPolicy",
        "detail": {
            "errorcode": "policies.resetquota.InvalidRLPolicy"
        }
    }
}

原因

如果未在 API 代理中定义重置配额政策的 <Quota> 元素中指定的配额政策,就会出现此错误。<Quota> 元素是必需的,用于标识应通过重置配额政策更新其计数器的目标配额政策。此目标配额政策必须在同一 API 代理中创建和定义,并且必须在流中可用。

例如,假设 <Quota> 元素按照如下所示方式定义,但如果 API 代理中未定义 MyQuotaPolicy,您就会收到上述错误。

<Quota name="MyQuotaPolicy">

诊断

  1. 标识重置配额政策中指定的无效配额政策名称。您可以从 faultstring 中找到配额政策的名称。例如,在以下 faultstring 中,配额政策名称为 MyQuotaPolicy:

    "faultstring": "Invalid rate limit policy MyQuotaPolicy"
    
  2. 检查出现故障的 API 代理中的每个重置配额政策。标识具体的重置配额政策,其中必需的 <Quota> 元素中指定的配额政策与上面第 1 步中标识的名称相匹配。

    例如,以下重置配额政策指定了名为 MyQuotaPolicy 的配额政策,该政策与 faultstring 中的内容相匹配:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ResetQuota async="false" continueOnError="false" enabled="true" name="Reset_Quota_Demo">
        <DisplayName>Reset_Quota_Demo</DisplayName>
        <Properties/>
        <Quota name="MyQuotaPolicy">
           <Identifier name="identifierName" ref="request.header.identifier">
                <Allow>100</Allow>
            </Identifier>
        </Quota>
    </ResetQuota>
    
    
  3. 确定在同一 API 代理中创建并定义了此配额政策。如果同一 API 代理中不存在此配额政策,就会导致错误。

    在上面的示例中,在执行重置配额政策 Reset_Quota_Demo 之前,流中应存在配额政策 MyQuotaPolicy

    由于流中没有配额政策 MyQuotaPolicy,因此您将收到错误代码:

"errorcode": "policies.resetquota.InvalidRLPolicy"

解决方法

确保在 API 代理中定义了 <Quota> 元素中声明的配额政策。执行重置配额政策时,必须可以使用此目标配额政策。

FailedToResolveAllowCountRef

错误代码

policies.resetquota.FailedToResolveAllowCountRef

错误响应正文

Failed to resolve allow count reference reference_name for identifier identifier_name
in ResetQuotaStepDefinition:policy_name;API Proxy:proxy_name;Revision:
revision_number;Environment:env_name;Organization:org_name

错误消息示例

Failed to resolve allow count reference request.header.allowcount for identifier
identifierName in ResetQuotaStepDefinition:ResetQuota;API Proxy:Reset_Quota;
Revision:10;Environment:test;Organization:demo

返回给客户端的错误仅为:policies.ratelimit.QuotaViolation

原因

如果对政策的 <Allow> 元素中包含允许计数的变量的引用无法解析为某个值,就会出现此错误。此元素是必需的,并指定减少配额计数器的数量。

诊断

  1. 确定发生错误的重置配额政策以及无法解析的引用变量的名称。您可以在错误响应中找到这两项。

    例如,在以下 faultstring 中,政策名称为 ResetQuota,引用为 request.header.allowcount

    Failed to resolve allow count reference request.header.allowcount for identifier
    identifierName in ResetQuotaStepDefinition:ResetQuota;API Proxy:Reset_Quota;
    Revision:10;Environment:test;Organization:demo
    
  2. 在失败的重置配额政策 XML 中,验证所用的引用变量的名称是否与错误响应中标识(上文中的第 1 步)的引用名称相匹配。

    例如,以下政策设置了具有名为 request.header.allowcount 的引用的元素,这与错误中的内容匹配:

    <ResetQuota async="false" continueOnError="false" enabled="true" name="ResetQuota">
        <DisplayName>ResetQuota</DisplayName>
        <Properties/>
        <Quota name="MyQuotaPolicy">
            <Identifier name="identifierName">
                <Allow ref="request.header.allowcount"/>
            </Identifier>
        </Quota>
    </ResetQuota>
    
  3. 确定引用变量是否已定义,以及在执行重置配额政策的流中是否可用。

  4. 如果该变量:

    1. 超出范围(在执行政策的特定流中不可用)
    2. 无法解析(未定义)

    就会导致错误。

    在上述示例中,<Allow> 元素中允许计数的值应该从名为 allowcount 的请求标头中检索。不过, Edge 无法解析 request.header.allowcount。如果标头 allowcount 未作为 API 请求的一部分进行传递,则会发生这种情况。

    以下提供了一个示例 API 请求,该请求不会将 allowcount 标头作为请求的一部分进行传递:

    curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json"
    

    由于标头 allowcount 未作为请求的一部分进行传递,且上述重置配额政策中的 <Allow> 元素使用的变量 request.header.allowcount未被定义,因此无法解析。您将收到错误响应:

    Failed to resolve allow count reference request.header.allowcount for identifier
    identifierName in ResetQuotaStepDefinition:ResetQuota;API Proxy:Reset_Quota;
    Revision:10;Environment:test;Organization:demo
    

解决方法

确保 <Allow> 元素中引用的变量已存在/已定义,并且可在执行重置配额政策的特定流中使用。

如需更正上述示例,您可以修改请求,使其包含 allowcount 标头,如下所示:

curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json" -H "allowcount:30"

FailedToResolveRLPolicy

错误代码

policies.resetquota.FailedToResolveRLPolicy

错误响应正文

{
    "fault": {
        "faultstring": "Failed to resolve rate limit policy",
        "detail": {
            "errorcode": "policies.resetquota.FailedToResolveRLPolicy"
        }
    }
}

错误消息示例

{
    "fault": {
        "faultstring": "Failed to resolve rate limit policy",
        "detail": {
            "errorcode": "policies.resetquota.FailedToResolveRLPolicy"
        }
    }
}

原因

如果 <Quota> 元素中的 ref 属性引用的变量无法解析,就会发生此错误。

例如,如果在 <Quota> 元素中 ref 属性设为了 request.header.quotapolicy,但在 API 代理流中不可用,就会出现上述错误。

<Quota ref="request.header.quotapolicy">

诊断

  1. 检查出现故障的 API 代理中的每个重置配额政策,并标识在其中无法正确解析 <Quota> 元素中指定的引用变量名称的重置配额政策。

  2. 确定变量是否已定义,以及在执行重置配额政策的流中是否可用。

  3. 如果该变量:

    1. 超出范围(在执行政策的特定流中不可用),或者
    2. 无法解析(未定义)

    就会导致错误。

    在下面的示例中,应从名为 quotapolicy 的请求标头检索目标配额政策的名称。但是,Edge 无法解析 request.header.quotapolicy。如果标头 quotapolicy 未作为 API 请求的一部分进行传递,则会发生这种情况。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResetQuota async="false" continueOnError="false" enabled="true" name="Reset_Quota_Demo">
        <DisplayName>Reset_Quota_Demo</DisplayName>
        <Properties/>
        <Quota ref="request.header.quotapolicy">
            <Identifier name="identifierName" ref="request.header.identifier">
                <Allow>100</Allow>
            </Identifier>
        </Quota>
    </ResetQuota>
    

    以下提供了一个示例 API 请求,该请求不会将标头 quotapolicy 作为请求的一部分进行传递:

    curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json"
    

    由于标头 quotapolicy 未作为请求的一部分进行传递,且上述重置配额政策中的 <Quota> 元素中使用的 request.header.quotapolicy 引用未定义,因此无法解析。因此,您会收到错误响应:

    "errorcode": "policies.resetquota.FailedToResolveRLPolicy"
    

解决方法

确保 <Quota> 元素中引用的属性 ref 在运行时解析,并且可在执行重置配额政策的特定流中使用。

如需更正上述示例,您可以修改请求,使其包含 quotapolicy 标头,如下所示:

curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json" -H "quotapolicy:MyQuotaPolicy"