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

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

InvalidMessageWeight

Код ошибки

policies.ratelimit.InvalidMessageWeight

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

{
    "fault": {jdoe
        "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"?>
        <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. Определите значение переменной, используемой в элементе <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");
}

FailToResolveSpikeArrestRate

Код ошибки

policies.ratelimit.FailedToResolveSpikeArrestRate

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

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

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

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

Причина

Эта ошибка возникает, если ссылка на переменную, содержащую настройку скорости внутри элемента <Rate> , не может быть преобразована в значение в политике предотвращения скачков нагрузки. Этот элемент является обязательным и используется для указания скорости предотвращения скачков нагрузки в формате {int}pm или {int}ps . Например, {int}pm может быть 500pm , что означает 500 звонков в минуту. Аналогично, значение 10ps означает 10 звонков в секунду.

Диагноз

  1. Укажите политику Spike Arrest, в которой произошла ошибка, и имя ссылки, которую не удалось корректно разрешить. Оба эти элемента можно найти в элементе faultstring ответа об ошибке.

    Например, в следующей строке ошибки имя политики — SpikeArrest_AuthProxy , а ссылка — request.header.rate :

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. В XML-файле политики Spike Arrest, в котором произошел сбой, убедитесь, что имя используемой ссылки совпадает с именем ссылки, указанным в строке ошибки (шаг № 1 выше).

    Например, следующая политика устанавливает элемент со ссылкой на request.header.rate , которая соответствует содержимому строки ошибки:

    <?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. Определите, определена ли переменная и доступна ли она в потоке, в котором выполняется политика предотвращения скачков активности.

  4. Если переменная имеет одно из следующих значений:

    • выходит за рамки действия (недоступно в конкретном процессе, в котором выполняется политика) или
    • Не может быть решено (не определено)

    Тогда в этом и заключается причина ошибки.

    В приведенном выше примере значение параметра spike stop rate в элементе <Rate> должно быть получено из заголовка запроса с именем rate . Однако Edge не может разрешить request.header.rate . Это происходит, если заголовок rate не передается в составе API-запроса.

    Вот пример API-запроса, в котором заголовок rate не передается в качестве части запроса:

        curl -v http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json"
    

    Поскольку параметр ` rate` в заголовке запроса не передается, ссылка `request.header.rate` , используемая в элементе <Rate> в указанной выше политике защиты от скачков нагрузки, не определена и, следовательно, не может быть разрешена. Поэтому вы получите код ошибки:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Разрешение

Убедитесь, что переменная, на которую ссылается элемент <Rate> существует/определена и доступна в конкретном потоке, где выполняется политика предотвращения скачков нагрузки.

Чтобы исправить приведенный выше пример, вы можете изменить запрос, добавив заголовок rate , как показано ниже:

curl -v  http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json" -H "rate:30ps"