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

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

InvalidRLPolicy

Код ошибки

policies.resetquota.InvalidRLPolicy

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

{
    "fault": {
        "faultstring": "Invalid rate limit policy quota_policy_name",
        "detail": {
            "errorcode": "policies.resetquota.InvalidRLPolicy"
        }
    }
}

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

{
    "fault": {
        "faultstring": "Invalid rate limit policy MyQuotaPolicy",
        "detail": {
            "errorcode": "policies.resetquota.InvalidRLPolicy"
        }
    }
}

Причина

Эта ошибка возникает, если правило квоты, указанное в элементе <Quota> правила "Сброс квоты", не определено в прокси-сервере API. Элемент <Quota> является обязательным и определяет целевую политику квоты, счетчик которой должен быть обновлен с помощью политики сброса квоты. Это целевое правило квоты должно быть создано и определено в том же прокси-сервере API и быть доступно во время выполнения потока.

Например, элемент <Quota> определен так, как показано ниже, но если MyQuotaPolicy не определен в прокси API, то вы получите указанную выше ошибку.

<Quota name="MyQuotaPolicy">

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

  1. Определите недопустимое название правила квоты, указанное в правиле сброса квоты. Название правила квоты можно найти в строке ошибки. Например, в следующей строке ошибки название правила "Квота" – MyQuotaPolicy::

    "faultstring": "Invalid rate limit policy MyQuotaPolicy"
    
  2. Проверьте все правила сброса квоты в прокси API, в котором произошла ошибка. Найдите правило сброса квоты, в котором правило квоты, указанное в обязательном элементе <Quota>, совпадает с названием, определенным на шаге 1.

    Например, в приведенных ниже правилах Reset Quota (Сброс квоты) заданы правила Quota (Квота) с названием MyQuotaPolicy, которое соответствует строке ошибки:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ResetQuota async="false" continueOnError="false" enabled="true" name="Reset_Quota_Demo">
        <DisplayName>Reset_Quota_Demo</DisplayName>
        <Properties/>
        <Quota name="MyQuotaPolicy">
           <Identifier name="identifierName" ref="request.header.identifier">
                <Allow>100</Allow>
            </Identifier>
        </Quota>
    </ResetQuota>
    
    
  3. Определите, создано ли правило квоты и задано ли оно в том же прокси-сервере API. Если в том же прокси-сервере API нет правила квоты, это и является причиной ошибки.

    В приведенном выше примере политика квоты MyQuotaPolicy должна существовать в потоке до выполнения политики сброса квоты Reset_Quota_Demo.

    Поскольку в потоке нет правила квоты MyQuotaPolicy, вы получите код ошибки:

"errorcode": "policies.resetquota.InvalidRLPolicy"

Разрешение

Убедитесь, что правила квоты, объявленные в элементе <Quota>, определены в прокси-сервере API. Это целевое правило квоты должно быть доступно при выполнении правила "Сброс квоты".

FailedToResolveAllowCountRef

Код ошибки

policies.resetquota.FailedToResolveAllowCountRef

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

Failed to resolve allow count reference reference_name for identifier identifier_name
in ResetQuotaStepDefinition:policy_name;API Proxy:proxy_name;Revision:
revision_number;Environment:env_name;Organization:org_name

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

Failed to resolve allow count reference request.header.allowcount for identifier
identifierName in ResetQuotaStepDefinition:ResetQuota;API Proxy:Reset_Quota;
Revision:10;Environment:test;Organization:demo

Клиенту будет возвращена ошибка policies.ratelimit.QuotaViolation.

Причина

Эта ошибка возникает, если ссылка на переменную, содержащую количество разрешений в элементе <Allow> правила, не может быть преобразована в значение. Этот элемент обязателен. Он указывает, на какую величину нужно уменьшить счетчик квоты.

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

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

    Например, в следующей строке ошибки название правила – ResetQuota, а ссылка – request.header.allowcount:

    Failed to resolve allow count reference request.header.allowcount for identifier
    identifierName in ResetQuotaStepDefinition:ResetQuota;API Proxy:Reset_Quota;
    Revision:10;Environment:test;Organization:demo
    
  2. В XML-файле неудачной политики Reset Quota убедитесь, что название используемой переменной reference совпадает с названием, указанным в ответе об ошибке (шаг 1 выше).

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

    <ResetQuota async="false" continueOnError="false" enabled="true" name="ResetQuota">
        <DisplayName>ResetQuota</DisplayName>
        <Properties/>
        <Quota name="MyQuotaPolicy">
            <Identifier name="identifierName">
                <Allow ref="request.header.allowcount"/>
            </Identifier>
        </Quota>
    </ResetQuota>
    
  3. Определите, задана ли переменная и доступна ли она в потоке, в котором выполняется правило "Сброс квоты".

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

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

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

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

    Ниже приведен пример запроса к API, в котором заголовок allowcount не передается как часть запроса:

    curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json"
    

    Поскольку заголовок allowcount не передается как часть запроса, переменная request.header.allowcount, используемая в элементе <Allow> в приведенных выше правилах Reset Quota, не определена и поэтому не может быть разрешена. В результате вы получите ответ об ошибке:

    Failed to resolve allow count reference request.header.allowcount for identifier
    identifierName in ResetQuotaStepDefinition:ResetQuota;API Proxy:Reset_Quota;
    Revision:10;Environment:test;Organization:demo
    

Разрешение

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

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

curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json" -H "allowcount:30"

FailedToResolveRLPolicy

Код ошибки

policies.resetquota.FailedToResolveRLPolicy

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

{
    "fault": {
        "faultstring": "Failed to resolve rate limit policy",
        "detail": {
            "errorcode": "policies.resetquota.FailedToResolveRLPolicy"
        }
    }
}

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

{
    "fault": {
        "faultstring": "Failed to resolve rate limit policy",
        "detail": {
            "errorcode": "policies.resetquota.FailedToResolveRLPolicy"
        }
    }
}

Причина

Эта ошибка возникает, если не удается разрешить переменную, на которую ссылается атрибут ref в элементе <Quota>.

Например, если атрибут ref задан как request.header.quotapolicy в элементе <Quota>, но недоступен в потоке прокси-сервера API, то вы получите указанную выше ошибку.

<Quota ref="request.header.quotapolicy">

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

  1. Проверьте все правила Reset Quota в прокси API, в котором произошла ошибка, и найдите правило Reset Quota, в котором имя переменной, указанной в элементе <Quota>, не может быть правильно разрешено.

  2. Определите, задана ли переменная и доступна ли она в потоке, в котором выполняется правило "Сброс квоты".

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

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

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

    В примере ниже название целевого правила квоты должно быть получено из заголовка запроса quotapolicy. Однако Edge не может обработать request.header.quotapolicy. Это происходит, если заголовок quotapolicy не передается как часть запроса к API.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResetQuota async="false" continueOnError="false" enabled="true" name="Reset_Quota_Demo">
        <DisplayName>Reset_Quota_Demo</DisplayName>
        <Properties/>
        <Quota ref="request.header.quotapolicy">
            <Identifier name="identifierName" ref="request.header.identifier">
                <Allow>100</Allow>
            </Identifier>
        </Quota>
    </ResetQuota>
    

    Ниже приведен пример запроса к API, в котором заголовок quotapolicy не передается как часть запроса:

    curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json"
    

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

    "errorcode": "policies.resetquota.FailedToResolveRLPolicy"
    

Разрешение

Убедитесь, что атрибут ref, на который ссылается элемент <Quota>, разрешается во время выполнения и доступен в определенном потоке, где выполняется правило "Сброс квоты".

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

curl -v http://demo-eval-test.apigee.net/v1/reset_quota -H "Content-Type: application/json" -H "quotapolicy:MyQuotaPolicy"