Solucionar problemas de errores del entorno de ejecución de la política de retención de picos

Estás consultando la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

InvalidMessageWeight

Código de error

policies.ratelimit.InvalidMessageWeight

Cuerpo de respuesta de error

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

Ejemplo de mensaje de error

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

Causa

Este error se produce si el valor especificado para el elemento <MessageWeight> a través de una variable de flujo no es válido (es decir, no es un valor entero).

Por ejemplo, si el valor de la variable de flujo especificada para el elemento <MessageWeight> es 1,5 (un valor no entero), se produce un error.

Diagnóstico

  1. Identifica el valor no válido que se ha usado en el elemento <MessageWeight> de la política Spike Arrest. Puede encontrar esta información en el elemento faultstring de la respuesta de error. Por ejemplo, en el siguiente error, el valor no válido que se ha usado para el elemento <MessageWeight> es 1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. Examina todas las políticas de Spike Arrest del proxy de API específico en el que se ha producido el error. Puede haber una o varias políticas de Spike Arrest en las que se especifique el elemento <MessageWeight>.

    Por ejemplo, la siguiente política especifica el valor de <MessageWeight> mediante una variable de flujo llamada message_weight:

    <?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. Determina el valor de la variable utilizada en el elemento <MessageWeight> de las políticas de Spike Arrest identificadas. El valor de la variable de flujo se puede extraer de los encabezados HTTP, los parámetros de consulta, la carga útil de una solicitud XML o JSON, o bien se puede definir en otra política.

    1. Busca el código en el proxy de API donde se definió la variable por primera vez.
    2. Una vez que hayas determinado la política en la que se define y se rellena la variable por primera vez, comprueba cómo se asigna el valor de la variable.
    3. Si el valor de la variable de flujo coincide con el valor identificado en el paso 1 anterior, esa es la causa del error.

    Por ejemplo, supongamos que se usa una política de JavaScript antes de la política Spike Arrest para definir la variable message_weight en función del método de solicitud, tal como se muestra a continuación:

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

    Fíjate en que el valor de la variable message_weight es 1.5, que no es válido (no es un número entero).

Resolución

Asegúrese de que el valor del elemento MessageWeight sea válido (valor entero).

Para corregir el ejemplo anterior, puedes modificar el valor de la variable message_weight en JavaScript para que sea un número entero:

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

FailedToResolveSpikeArrestRate

Código de error

policies.ratelimit.FailedToResolveSpikeArrestRate

Cuerpo de respuesta de error

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

Ejemplo de mensaje de error

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

Causa

Este error se produce si la referencia a la variable que contiene el ajuste de la tarifa del elemento <Rate> no se puede resolver en un valor de la política Spike Arrest. Este elemento es obligatorio y se usa para especificar la tasa de supresión de picos en forma de {int}pm o {int}ps. Por ejemplo, {int}pm podría ser 500pm, lo que significa 500 llamadas por minuto. Del mismo modo, el valor 10ps significa 10 llamadas por segundo.

Diagnóstico

  1. Identifica la política Spike Arrest en la que se ha producido el error y el nombre de la referencia que no se puede resolver correctamente. Puedes encontrar ambos elementos en el elemento faultstring de la respuesta de error.

    Por ejemplo, en el siguiente faultstring, el nombre de la política es SpikeArrest_AuthProxy y la referencia es request.header.rate:

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. En el XML de la política de Spike Arrest fallida, comprueba que el nombre de la referencia utilizada coincida con el nombre de la referencia identificada en la cadena de error (paso 1 anterior). ** **

    Por ejemplo, la siguiente política define el elemento con la referencia llamada request.header.rate, que coincide con lo que hay en 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. Determina si la variable está definida y disponible en el flujo en el que se ejecuta la política Spike Arrest.

  4. Si la variable es:

    • Fuera del ámbito (no disponible en el flujo específico en el que se está ejecutando la política) o
    • no se puede resolver (no está definido)

    entonces, esa es la causa del error.

    En el ejemplo anterior, se supone que el valor de la tasa de detención de picos del elemento <Rate> se obtiene del encabezado de solicitud llamado rate. Sin embargo, Apigee no puede resolver request.header.rate. Esto ocurre si el encabezado rate no se incluye en la solicitud a la API.

    A continuación, se muestra una solicitud de API de ejemplo que no incluye el encabezado rate como parte de la solicitud:

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

    Donde your_host_alias es un dominio público que se usa para acceder a tus APIs, tal como se ha configurado en la propiedad virtualhosts.hostAliases de tu archivo de anulaciones. Consulta Especificar anulaciones de configuración.

    Como el encabezado rate no se transfiere como parte de la solicitud, la referencia request.header.rate utilizada en el elemento <Rate> de la política SpikeArrest anterior no está definida y, por lo tanto, no se puede resolver. Por lo tanto, recibirás el código de error:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Resolución

Asegúrate de que la variable a la que se hace referencia en el elemento <Rate> exista o esté definida y disponible en el flujo específico en el que se ejecuta la política Spike Arrest.

Para corregir el ejemplo anterior, puede modificar la solicitud para incluir el encabezado rate, tal como se muestra a continuación:

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

Donde your_host_alias es un dominio público que se usa para acceder a tus APIs, tal como se ha configurado en la propiedad virtualhosts.hostAliases de tu archivo de anulaciones. Consulta Especificar anulaciones de configuración.