Anti-Pattern: Verwendung der RaiseFault-Richtlinie unter unangemessenen Bedingungen

Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.

RaiseFault-Richtlinie können API-Entwickler einen Fehlerablauf initiieren, Fehlervariablen in einer Antworttextnachricht festlegen und die entsprechenden Antwortstatuscodes festlegen. Sie können auch die RaiseFault-Richtlinie verwenden, um Ablauffehler, die sich auf den Fehler beziehen, festzulegen, z. B. fault.name, fault.type und fault.category. Da diese Variablen in Analysedaten und Router-Zugriffslogs angezeigt werden, die für die Fehlerbehebung verwendet werden, ist es wichtig, den Fehler genau zu identifizieren.

Sie können die RaiseFault-Richtlinie verwenden, um bestimmte Bedingungen als Fehler zu behandeln, auch wenn kein tatsächlicher Fehler in einer anderen Richtlinie oder auf dem Back-End-Server des API-Proxys aufgetreten ist. Wenn der Proxy zum Beispiel eine benutzerdefinierte Fehlermeldung an die Client-App senden soll, wenn der Back-End-Antworttext den String unavailable enthält, können Sie die RaiseFault-Richtlinie wie in Code-Snippet unten aufrufen:

<!-- /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>
...

Der Name der RaiseFault-Richtlinie ist in API Monitoring als fault.name und in den Zugriffs- und Routerzugriffslogs als x_apigee_fault_policy sichtbar. Dies hilft, die Fehlerursache zu diagnostizieren.

Anti-Pattern

Verwendung der RaiseFault-Richtlinie in FaultRules, nachdem bereits eine andere Richtlinie einen Fehler ausgelöst hat

Betrachten Sie das folgende Beispiel, bei dem eine OAuthV2-Richtlinie im API-Proxy-Ablauf mit dem InvalidAccessToken-Fehler fehlgeschlagen ist. Bei einem Fehler wendet Apigee den fault.name als InvalidAccessToken an, fügt den Fehlerablauf ein und führt alle definierten FaultRules aus. In der FaultRule gibt es eine RaiseFault-Richtlinie mit dem Namen RaiseFault, die immer dann eine benutzerdefinierte Fehlerantwort sendet, wenn ein InvalidAccessToken-Fehler auftritt. Die Verwendung der RaiseFault-Richtlinie in einer FaultRule bedeutet jedoch, dass die fault.name-Variable überschrieben wird und die tatsächliche Fehlerursache maskiert.

<!-- /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-Richtlinie in einer FaultRule unter allen Bedingungen verwenden

Im folgenden Beispiel wird eine RaiseFault-Richtlinie mit dem Namen RaiseFault ausgeführt, wenn fault.name nicht RaiseFault ist:

<!-- /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>

Wie im ersten Szenario werden die Schlüsselfehlervariablen fault.name, fault.code und fault.policy durch den Namen der RaiseFault-Richtlinie überschrieben. Dadurch ist es nahezu unmöglich, herauszufinden, welche Richtlinie den Fehler verursacht hat, ohne auf eine Trace-Datei zuzugreifen, die den Fehler anzeigt oder das Problem reproduziert.

Verwendung der RaiseFault-Richtlinie zur Rückgabe einer HTTP-2x-Antwort außerhalb des Fehlerflusses.

Im folgenden Beispiel wird eine RaiseFault-Richtlinie namens HandleOptionsRequest ausgeführt, wenn das Verb der Anfrage OPTIONS lautet:

<!-- /antipatterns/examples/raise-fault-conditions-4.xml  -->
<PreFlow name="PreFlow">
    <Request>

        <Step>
            <Name>HandleOptionsRequest</Name>
            <Condition>(request.verb Equals "OPTIONS")</Condition>
        </Step>

</PreFlow>

Der Intent ist, die Antwort sofort an den API-Client zurückzugeben, ohne dass weitere Richtlinien verarbeitet werden. Dies führt jedoch zu irreführenden Analysedaten, da die Fehlervariablen den Namen der RaiseFault-Richtlinie enthalten und den Proxy erschweren. Die richtige Methode zur Implementierung des gewünschten Verhaltens ist die Verwendung von Abläufen mit besonderen Bedingungen, wie unter CORS-Unterstützung hinzufügen beschrieben.

Auswirkungen

Wenn Sie wie oben beschrieben die Richtlinie "Capturefault" verwenden, werden Schlüsselfehlervariablen mit dem Namen der RaiseFault-Richtlinie anstelle des Namens der fehlerhaften Richtlinie überschrieben. In Analytics- und NGINX Access-Logs werden die Variablen x_apigee_fault_code und x_apigee_fault_policy überschrieben. In API Monitoring werden Fault Code und Fault Policy überschrieben. Dieses Verhalten erschwert die Fehlerbehebung und bestimmt, welche Richtlinie die tatsächliche Ursache des Fehlers ist.

Im folgenden Screenshot aus API-Monitoring sehen Sie, dass der Fehlercode und die Fehlerrichtlinie auf allgemeine RaiseFault-Werte überschrieben wurden. Dadurch ist es unmöglich, die Ursache des Fehlers in den Logs zu bestimmen:

Noch offen

Best Practice

Wenn eine Apigee-Richtlinie einen Fehler auslöst und Sie die Fehlerantwortnachricht anpassen möchten, verwenden Sie statt der RaiseFault-Richtlinie die AssignMessage- oder die JavaScript-Richtlinie.

Die RaiseFault-Richtlinie sollte in einem nicht fehlerfreien Ablauf verwendet werden. Das bedeutet, dass Sie eine Ausnahme nur als RaiseFault behandeln, wenn eine bestimmte Bedingung als Fehler behandelt wird, selbst wenn tatsächlich ein Fehler in einer Richtlinie oder im Back-End-Server des API-Proxys aufgetreten ist. Sie können beispielsweise die Richtlinie "RaiseFault" verwenden, um zu signalisieren, dass erforderliche Eingabeparameter fehlen oder eine falsche Syntax haben.

Sie können RaiseFault auch in einer Fehlerregel verwenden, wenn Sie einen Fehler bei der Verarbeitung eines Fehlers erkennen möchten. Der Fehler-Handler selbst kann beispielsweise einen Fehler verursachen, den Sie mit "RaiseFault" signalisieren möchten.

Weitere Informationen