Spike Arrest 政策运行时错误问题排查

您正在查看 Apigee X 文档。
查看 Apigee Edge 文档。

InvalidMessageWeight

错误代码

policies.ratelimit.InvalidMessageWeight

错误响应正文

{
    "fault": {jdoe
        "faultstring": "Invalid message weight value [invalid_value]",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

错误消息示例

{
    "fault": {
        "faultstring": "Invalid message weight value 1.5",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

原因

如果通过流变量为 <MessageWeight> 元素指定的值无效(非整数值),就会出现此错误。

例如,如果为 <MessageWeight> 元素指定的流变量值为 1.5(非整数值),就会发生此错误。

诊断

  1. 标识用于 Spike Arrest 政策中的 <MessageWeight> 元素的无效值。您可以在错误响应的 faultstring 元素中找到此信息。例如,在以下错误中,用于 <MessageWeight> 元素的无效值为 1.5

    "faultstring": "Invalid message weight value 1.5"
    
  2. 检查发生故障的特定 API 代理中的所有 Spike Arrest 政策。可能还有一个或多个指定了 <MessageWeight> 元素的 Spike Arrest 政策。

    例如,以下政策通过名为 message_weight: 的流变量指定 <MessageWeight> 的值

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate>100ps</Rate>
        <MessageWeight ref="message_weight"/>
    </SpikeArrest>
    
  3. 确定发现的 Spike Arrest 政策的 <MessageWeight> 元素中使用的变量值。流变量的值可以从 HTTP 标头、查询参数、XML 或 JSON 请求载荷中提取,或在其他政策中定义。

    1. 找到先定义了变量的 API 代理中的代码。
    2. 确定了首先定义和填充变量的政策后,请检查变量值的设置方式。
    3. 如果流变量的值与上面的第 1 步中确定的值相匹配,则会导致此错误。

    例如,假设在 Spike Arrest 政策之前使用了一个 JavaScript 政策来根据请求方法设置变量 message_weight,如下所示:

    var verb = context.getVariable("request.verb");
    context.setVariable("message_weight", "1.5");
    if (verb == 'POST') {
      context.setVariable("message_weight", "2");
    }
    

    请注意,变量 message_weight 的值为 1.5,这是无效(非整数)值。

解决方法

确保 MessageWeight 元素的值为有效值(整数值)。

要更正上面显示的示例,您可以将 JavaScript 中变量 message_weight 的值修改为整数值:

var verb = context.getVariable("request.verb");
context.setVariable("message_weight", "1");
if (verb == 'POST') {
  context.setVariable("message_weight", "2");
}

FailedToResolveSpikeArrestRate

错误代码

policies.ratelimit.FailedToResolveSpikeArrestRate

错误响应正文

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference [reference] in SpikeArrest policy [api_policy]",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

错误消息示例

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

原因

如果对 <Rate> 元素中包含 rate 设置的变量的引用无法解析为 Spike Arrest 政策中的值,则会出现此错误。此元素是必需的,以 {int}pm{int}ps 的形式指定 Spike Arrest 率。例如,{int}pm 可能是 500pm,这意味着每分钟调用 500 次。同样,10ps 值表示每秒调用 10 次。

诊断

  1. 标识出错的 Spike Arrest 政策以及无法正确解析的引用名称。您可以在错误响应的 faultstring 元素中找到这两项。

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

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. 在失败的 Spike Arrest 政策 XML 中,验证所用的引用名称是否与故障字符串中标识(上述第 1 步)的引用名称相匹配。** **

    例如,以下政策设置了具有名为 request.header.rate 的引用的元素,该元素与 faultstring 中的内容相匹配

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate ref="request.header.rate"/>
    </SpikeArrest>
    
    
  3. 确定变量是否已定义,以及在执行 Spike Arrest 政策的流中是否可用。

  4. 如果该变量:

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

    就会导致错误。

    在上述示例中,<Rate> 元素中的 Spike Arrest 率的值应从名为 rate 的请求标头检索。但是,Apigee 无法解析 request.header.rate。如果没有将标头 rate 作为 API 请求的一部分进行传递,就会发生这种情况。

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

      curl -v http://your_host_alias/check_spikearrest -H "Content-Type: application/json"
    

    其中 your_host_alias 是用于访问您的 API 的公共域名,如替换文件中的 virtualhosts.hostAliases 属性中所配置。 请参阅指定配置替换

    由于标头 rate 未作为请求的一部分传递,因而上面的 Spike Arrest 政策中元素 <Rate> 中使用的引用 request.header.rate 未定义,因此无法解析。您将收到错误代码:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

解决方法

确保 <Rate> 元素中引用的变量存在/已定义,并且在执行 Spike Arrest 政策的特定流中可用。

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

curl -v  http://your_host_alias/check_spikearrest -H "Content-Type: application/json" -H "rate:30ps"

其中 your_host_alias 是用于访问您的 API 的公共域名,如替换文件中的 virtualhosts.hostAliases 属性中所配置。 请参阅指定配置替换