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

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

Неверный вес сообщения

Код ошибки

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>