Устранение неполадок с ошибками, связанными с квотой

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

InvalidMessageWeight

Код ошибки

policies.ratelimit.InvalidMessageWeight

Тело ответа с ошибкой

{
    "fault": {
        "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. Определите недопустимое значение, используемое для элемента <MessageWeight> в правиле квоты. Эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в приведенной ниже ошибке недопустимое значение элемента <MessageWeight> – 1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. Проверьте все правила квоты в определенном прокси API, где произошел сбой. Может быть одно или несколько правил квоты, в которых указан элемент <MessageWeight>.

    Например, в следующих правилах параметр <MessageWeight> задается с помощью переменной потока 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. Определите значение переменной, используемой для <MessageWeight>, в выявленных правилах квоты. Значение переменной потока можно извлечь из HTTP-заголовков, параметров запроса, полезной нагрузки запроса XML или JSON или определить в другом правиле:

    1. Найдите в пакете прокси API код, в котором переменная была определена впервые.
    2. Определив правило, в котором переменная задается и заполняется первой, проверьте, как устанавливается значение переменной.
    3. Если значение переменной потока совпадает со значением, определенным на шаге 1, то это и есть причина ошибки.

    Предположим, что политика 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, указанное переменной потока, является действительным (целым числом).

Чтобы исправить приведенный выше пример, измените значение переменной message_weight в коде JavaScript на целое число.

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

FailedToResolveQuotaIntervalReference

Код ошибки

policies.ratelimit.FailedToResolveQuotaIntervalReference

Тело ответа с ошибкой

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

Пример сообщения об ошибке

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

Причина

Эта ошибка возникает, если элемент <Interval> не определен в правиле "Квота". Этот элемент обязателен и используется для указания временного интервала, к которому применяется квота. Временной интервал может быть в минутах, часах, днях, неделях или месяцах, как определено элементом <TimeUnit>.

диагностика;

  1. Проверьте все правила квоты в прокси API, в котором произошла ошибка. Если в каком-либо правиле квоты не определен обязательный элемент <Interval>, это и является причиной ошибки.

    Например, в следующих правилах в отношении квоты отсутствует обязательный элемент <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>
    

    Поскольку обязательный элемент <TimeUnit> не определен в указанной выше политике квот, вы получите код ошибки:

    policies.ratelimit.FailedToResolveQuotaIntervalReference
    

Разрешение

Убедитесь, что во всех правилах квоты для определенного прокси-сервера API правильно задан обязательный элемент <Interval>.

Чтобы исправить пример, приведенный выше, измените правило, добавив элемент <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>
    <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
    <StartTime>2017-7-16 12:00:00</StartTime>
</Quota>

FailedToResolveQuotaIntervalTimeUnitReference

Код ошибки

policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference

Тело ответа с ошибкой

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

Пример сообщения об ошибке

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

Причина

Эта ошибка возникает, если элемент <TimeUnit> не определен в правиле квоты. Этот элемент обязателен и используется для указания единицы времени, применимой к квоте. Временной интервал может быть указан в минутах, часах, днях, неделях или месяцах.

диагностика;

  1. Проверьте все правила квоты в прокси API, в котором произошла ошибка. Если в каком-либо правиле квоты не определен обязательный элемент <TimeUnit>, это и является причиной ошибки.

    Например, в следующих правилах в отношении квоты отсутствует обязательный элемент <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>
    

    Поскольку обязательный элемент <TimeUnit> не определен в указанной выше политике квот, вы получите код ошибки:

    policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference
    

Разрешение

Убедитесь, что во всех правилах квоты для определенного прокси-сервера API задан обязательный элемент <TimeUnit>.

Чтобы исправить пример, приведенный выше, измените правило, добавив элемент <TimeUnit>, как показано ниже.

<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>