Антипаттерн: используйте политику RaiseFault в неподходящих условиях.

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

Политика RaiseFault позволяет разработчикам API инициировать поток ошибок, устанавливать переменные ошибок в теле сообщения ответа и устанавливать соответствующие коды состояния ответа. Вы также можете использовать политику RaiseFault для установки переменных потока, относящихся к ошибке, таких как fault.name , fault.type и fault.category . Поскольку эти переменные видны в аналитических данных и журналах доступа к маршрутизатору, используемых для отладки, важно точно определить неисправность.

Вы можете использовать политику RaiseFault для обработки определенных условий как ошибок, даже если фактическая ошибка не произошла в другой политике или на внутреннем сервере прокси-сервера API. Например, если вы хотите, чтобы прокси-сервер отправлял пользовательское сообщение об ошибке клиентскому приложению всякий раз, когда тело ответа серверной части содержит строку unavailable , вы можете вызвать политику RaiseFault, как показано в фрагменте кода ниже:

<!-- /antipatterns/examples/raise-fault-conditions-1.xml  -->
<TargetEndpoint name="default">
...
  <Response>
    <Step>
      <Name>RF-Service-Unavailable</Name>
      <Condition>(message.content Like "*unavailable*")</Condition>
   </Step>
  </Response>
...

Имя политики RaiseFault отображается как fault.name в мониторинге API и как x_apigee_fault_policy в журналах аналитики и доступа к маршрутизатору. Это помогает легко диагностировать причину ошибки.

Антипаттерн

Использование политики RaiseFault в FaultRules после того, как другая политика уже выдала ошибку.

Рассмотрим приведенный ниже пример, в котором политика OAuthV2 в потоке прокси-сервера API завершилась с ошибкой InvalidAccessToken . В случае сбоя Edge установит fault.name как InvalidAccessToken , войдет в поток ошибок и выполнит все определенные FaultRules. В FaultRule есть политика RaiseFault с именем RaiseFault , которая отправляет настроенный ответ об ошибке всякий раз, когда возникает ошибка InvalidAccessToken . Однако использование политики RaiseFault в FaultRule означает, что переменная fault.name перезаписывается и маскирует истинную причину сбоя.

<!-- /antipatterns/examples/raise-fault-conditions-2.xml  -->
<FaultRules>
  <FaultRule name="generic_raisefault">
    <Step>
        <Name>RaiseFault</Name>
        <Condition>(fault.name equals "invalid_access_token") or (fault.name equals "InvalidAccessToken")</Condition>
    </Step>
  </FaultRule>
</FaultRules>

Использование политики RaiseFault в FaultRule при любых условиях

В приведенном ниже примере политика RaiseFault с именем RaiseFault выполняется, если fault.name не RaiseFault :

<!-- /antipatterns/examples/raise-fault-conditions-3.xml  -->
<FaultRules>
    <FaultRule name="fault_rule">
        ....
        <Step>
            <Name>RaiseFault</Name>
            <Condition>!(fault.name equals "RaiseFault")</Condition>
        </Step>
    </FaultRule>
</FaultRules>

Как и в первом сценарии, ключевые переменные ошибки fault.name , fault.code и fault.policy перезаписываются именем политики RaiseFault. Такое поведение делает практически невозможным определить, какая политика на самом деле вызвала сбой, без доступа к файлу трассировки, показывающему сбой или воспроизводящему проблему.

Использование политики RaiseFault для возврата ответа HTTP 2xx вне потока ошибок.

В приведенном ниже примере политика RaiseFault с именем HandleOptionsRequest выполняется, когда глагол запроса имеет значение OPTIONS :

<!-- /antipatterns/examples/raise-fault-conditions-4.xml  -->
<PreFlow name="PreFlow">
    <Request>
        …
        <Step>
            <Name>HandleOptionsRequest</Name>
            <Condition>(request.verb Equals "OPTIONS")</Condition>
        </Step>
        …
</PreFlow>

Цель состоит в том, чтобы немедленно вернуть ответ клиенту API без обработки других политик. Однако это приведет к получению ошибочных аналитических данных, поскольку переменные ошибки будут содержать имя политики RaiseFault, что усложнит отладку прокси-сервера. Правильный способ реализовать желаемое поведение — использовать Flows со специальными условиями, как описано в разделе Добавление поддержки CORS .

Влияние

Использование политики RaiseFault, как описано выше, приводит к перезаписи ключевых переменных ошибки именем политики RaiseFault вместо имени сбойной политики. В журналах Analytics и NGINX Access x_apigee_fault_code и x_apigee_fault_policy переменные перезаписываются. При мониторинге API Fault Code и Fault Policy перезаписываются. Такое поведение затрудняет устранение неполадок и определение того, какая политика является истинной причиной сбоя.

На скриншоте ниже из API Monitoring вы можете видеть, что код ошибки и политика ошибки были перезаписаны на общие значения RaiseFault , что делает невозможным определение основной причины сбоя по журналам:

Лучшая практика

Если политика Edge выдает ошибку и вы хотите настроить ответное сообщение об ошибке, используйте политики AssignMessage или JavaScript вместо политики RaiseFault.

Политику RaiseFault следует использовать в потоке без ошибок. То есть используйте RaiseFault только для обработки определенного состояния как ошибки, даже если фактическая ошибка не произошла в политике или на внутреннем сервере прокси-сервера API. Например, вы можете использовать политику RaiseFault, чтобы сигнализировать об отсутствии обязательных входных параметров или их неправильном синтаксисе.

Вы также можете использовать RaiseFault в правиле сбоя, если хотите обнаружить ошибку во время обработки сбоя. Например, сам обработчик ошибок может вызвать ошибку, о которой вы хотите сообщить с помощью RaiseFault.

Дальнейшее чтение