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

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

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

    "faultstring": "Invalid message weight value 1.5"
    
  2. Проверьте все правила Spike Arrest в определенном прокси-сервере API, где произошла ошибка. Может быть одно или несколько правил Spike Arrest, в которых указан элемент <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 используется до правила Spike Arrest Policy, чтобы задать переменную 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");
}

FailedToResolveSpikeArrestRate

Код ошибки

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> нельзя преобразовать в значение в правиле Spike Arrest. Этот элемент обязателен. Он используется для указания скорости подавления скачков в формате {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, которая соответствует тому, что указано в faultstring:

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

  4. Если переменная:

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

    то это и есть причина ошибки.

    В примере выше значение параметра spike arrest 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> в приведенных выше правилах Spike Arrest, не определена и поэтому не может быть разрешена. Поэтому вы получите код ошибки:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Разрешение

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

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

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