Solución de problemas relacionados con el entorno de ejecución de la política Spike Arrest

Estás viendo 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 la 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 (un número no entero).

Por ejemplo, si el valor de la variable de flujo especificado para el elemento <MessageWeight> es 1.5 (un número no entero), se produce el error.

Diagnóstico

  1. Identifica elvalor no válido que se usó para el elemento <MessageWeight> en la política de protección contra aumentos de tráfico. Puedes 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 usa para el elemento <MessageWeight> es 1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. Examina todas las políticas Spike Arrest en el proxy de API específico en el que se produjo la falla. Podría haber una o más políticas de protección contra aumentos de tráfico en la que se especifique el elemento <MessageWeight>.

    Por ejemplo, la siguiente política especifica el valor de <MessageWeight> a través de 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 que se usó en el elemento <MessageWeight> de las políticas Spike Arrest identificadas. El valor de la variable de flujo se puede extraer de los encabezados HTTP, los parámetros de consulta yla carga útil de solicitud XML o JSON, o bien se define en otra política:

    1. Ubica el código en el proxy de API, donde la variable se definió primero.
    2. Una vez que descubras la política en la que se define y propagas la variable primero, verifica cómo se establece su valor.
    3. Si el valor de la variable de flujo coincide con el valor identificado en el paso 1, esa es la causa del error.

    Por ejemplo, supongamos que se usa una política de JavaScript antes de la política de protección contra aumentos de tráficopara configurar la variable message_weight según el método de solicitud 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");
    }
    

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

Solución

Asegúrate de que el valor del elemento MessageWeight sea un valor válido (número entero).

Para corregir el ejemplo anterior, puedes modificar el valor de la variable message_weight en JavaScript para que seaun 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 la 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 la configuración de tarifa dentro del elemento <Rate> no se puede resolver en un valor dentro de la política de Spike Arrest. Este elemento es obligatorio y se usa para especificar el índice de protección contra aumentos de tráfico en el formato de {int}pm o {int}ps. Por ejemplo, {int}pm podría ser 500pm, lo que significa 500 llamadas por minuto. Del mismo modo, un valor de 10ps significa 10 llamadas por segundo.

Diagnóstico

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

    Por ejemplo, en la siguiente string con errores, 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 archivo XML de la política Spike Arrest con errores, verifica que el nombre de la referencia usada coincida con el nombre de referencia identificado en la string con errores(paso 1 anterior). ** **

    Por ejemplo, en la siguiente política, se establece el elemento con la referencia llamada request.header.rate, que coincide con lo que hay en la string con errores:

    <?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 de protección contra el aumento de tráfico.

  4. Verifica si la variable tiene una de las siguientes características:

    • fuera de alcance (no disponible en el flujo específico en el que se ejecuta la política)
    • no se puede resolver (no está definido)

    entonces esa es la causa del error.

    En el ejemplo anterior, el valor de la tasa de interrupción de aumento de tráfico en el elemento <Rate> se debería recuperar del encabezado de solicitud llamado rate. Sin embargo, Apigee no puede resolver request.header.rate. Esto sucede si no se pasa el encabezado rate como parte de la solicitud a la API.

    La siguiente es una solicitud a la API de muestra que no pasa el encabezado rate como parte de la solicitud:

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

    En el que your_host_alias es un dominio público que se usa para acceder a tus API, como se configura en la propiedad virtualhosts.hostAliases en tu archivo de anulaciones. Consulta la página Especifica anulaciones de configuración.

    Debido a que el encabezado rate no se pasa como parte de la solicitud, el request.header.rate de referencia que se usa en el elemento <Rate> en la política de protección contra el aumento de tráfico anterior es indefinido y, por lo tanto, no se puede resolver. Por lo tanto, recibirás el código de error:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Solució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 que se muestra arriba, puedes modificar la solicitud para incluir el encabezado rate como se muestra a continuación:

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

En el que your_host_alias es un dominio público que se usa para acceder a tus API, como se configura en la propiedad virtualhosts.hostAliases en tu archivo de anulaciones. Consulta la página Especifica anulaciones de configuración.