Solución de problemas de errores de entorno de ejecución de la cuota

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": {
        "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 del elemento <MessageWeight> que se especificó a través de una variable de flujo no es válido (un valor de un número que no es entero).

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

Diagnóstico

  1. Identifica el valor no válido que se usa para el elemento <MessageWeight> en la política de cuotas. 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. Examine todas las políticas de cuotas en el proxy de API específico en el que se produjo el error. Podría haber una o más políticas de cuotas en las que se especifica el elemento <MessageWeight>.

    Por ejemplo, la siguiente política especifica el <MessageWeight> a través de una variable de flujo message_weight:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Quota async="false" continueOnError="false" enabled="true" name="Quota_with_weight" type="calendar">
        <DisplayName>Quota_with_weight</DisplayName>
        <Properties/>
        <Allow count="3"/>
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <StartTime>2017-7-16 12:00:00</StartTime>
        <MessageWeight ref="message_weight"/>
    </Quota>
    
  3. Determina el valor de la variable que se usa para <MessageWeight> en las políticas de cuota identificadas. El valor de la variable de flujo se puede extraer de los encabezados HTTP, los parámetros de consulta, la carga útil de solicitud XML o JSON o se define en otra política:

    1. Ubica el código en el paquete del proxy de API, en el que la variable se definió primero.
    2. Una vez que descubras la política en la que se define y propaga 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 una política de JavaScript que se usó antes de que la política de cuotas establece la variable message_weight según el tipo 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 no es un valor no válido (un número que no es entero).

Solución

Asegúrate de que el valor que representa el MessageWeight especificado por la variable de flujo sea un valor válido (valor de número entero).

Para corregir el ejemplo anterior, puedes modificar el valor de la variable message_weight en JavaScript como un número entero.

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

FailedToResolveQuotaIntervalReference

Código de error

policies.ratelimit.FailedToResolveQuotaIntervalReference

Cuerpo de la respuesta de error

{
    "fault": {
        "faultstring": "Failed to resolve quota interval reference [reference] in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalReference"
        }
    }
}

Ejemplo de mensaje de error

{
    "fault": {
        "faultstring": "Failed to resolve quota interval reference api.product.developer.quota.interval in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalReference"
        }
    }
}

Causa

Este error se genera si el elemento <Interval> no se define en la política de cuotas. Este elemento es obligatorio y se usa para especificar el intervalo de tiempo aplicable a la cuota. El intervalo de tiempo pueden ser minutos, horas, días, semanas o meses, según se defina con el elemento <TimeUnit>.

Diagnóstico

  1. Examine cada una de las políticas de cuota en el proxy de API en el que se produjo el error. Si existe una política de cuotas en la que el elemento obligatorio <Interval> no está definido, esa es la causa del error.

    Por ejemplo, la siguiente política de cuotas no tiene el elemento obligatorio <Interval>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
        <DisplayName>CheckQuota</DisplayName>
        <Properties/>
        <Allow count="3"/>
            <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
        <StartTime>2017-7-16 12:00:00</StartTime>
    </Quota>
    

    Debido a que el elemento obligatorio <TimeUnit> no está definido en la política de cuota anterior, recibirá el siguiente código de error:

    policies.ratelimit.FailedToResolveQuotaIntervalReference
    

Solución

Asegúrate de que todas las políticas de cuota para un proxy de API determinado tengan el elemento obligatorio <Interval> definido de forma correcta.

Para corregir el ejemplo anterior, puedes modificar la política a fin de incluir el elemento <Interval> como se muestra a continuación.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
    <DisplayName>CheckQuota</DisplayName>
    <Properties/>
    <Allow count="3"/>
    <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
    <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
    <StartTime>2017-7-16 12:00:00</StartTime>
</Quota>

FailedToResolveQuotaIntervalTimeUnitReference

Código de error

policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference

Cuerpo de la respuesta de error

{
    "fault": {
        "faultstring": "Failed to resolve quota time unit reference [reference] in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference"
        }
    }
}

Ejemplo de mensaje de error

{
    "fault": {
        "faultstring": "Failed to resolve quota time unit reference apiproduct.developer.quota.timeunity in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference"
        }
    }
}

Causa

Este error se genera si el elemento <TimeUnit> no se define en la política de cuotas. Este elemento es obligatorio y se usa para especificar la unidad de tiempo aplicable a la cuota. El intervalo de tiempo puede ser en minutos, horas, días, semanas o meses.

Diagnóstico

  1. Examine cada una de las políticas de cuota en el proxy de API en el que se produjo el error. Si existe una política de cuotas en la que el elemento obligatorio <TimeUnit> no está definido, esa es la causa del error.

    Por ejemplo, la siguiente política de cuotas no tiene el elemento obligatorio <TimeUnit>:

    <Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
      <DisplayName>CheckQuota</DisplayName>
      <Properties/>
      <Allow count="3"/>
          <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
      <StartTime>2017-7-16 12:00:00</StartTime>
    </Quota>
    

    Debido a que el elemento obligatorio <TimeUnit> no está definido en la política de cuota anterior, recibirá el siguiente código de error:

    policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference
    

Solución

Asegúrate de que todas las políticas de cuotas para un proxy de API determinado tengan el elemento obligatorio <TimeUnit> definido.

Para corregir el ejemplo anterior, puedes modificar la política a fin de incluir el elemento <TimeUnit> como se muestra a continuación.

<Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
    <DisplayName>CheckQuota</DisplayName>
    <Properties/>
    <Allow count="3"/>
    <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
    <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
    <StartTime>2017-7-16 12:00:00</StartTime>
</Quota>