Get hands-on experience with 20+ free Google Cloud products and $300 in free credit for new customers.

Error handling Pattern for Apigee X With Shared Flow. What is the best practice?

I based myself on this publication (An error handling pattern for Apigee proxies ) and implemented a proxy in apigee X as shown in the attachment. But it didn't work well with Apigee X. Is there a more recent pattern than the one suggested by @ozanseymen or some best practice adopted by the apigee community?

<ProxyEndpoint name="default">
  <Description/>
  <FaultRules>
    <FaultRule name="Spike Arrest Fault">
      <Step>
        <Name>AM-RateLimitErrorSet429</Name>
        <Condition>
            (fault.name = "SpikeArrestViolation") or
            (fault.name = "InvalidMessageWeight") or
            (fault.name = "ErrorLoadingProperties") or
            (fault.name = "InvalidAllowedRate") or
            (fault.name = "FailedToResolveSpikeArrestRate")
        </Condition>
      </Step>
    </FaultRule>
    <FaultRule name="Quota Fault">
      <Step>
        <Name>AM-RateLimitErrorSet429</Name>
        <Condition>
            (fault.name = "QuotaViolation") or
            (fault.name = "InvalidMessageWeight") or
            (fault.name = "InvalidQuotaInterval") or
            (fault.name = "FailedToResolveQuota\IntervalReference") or
            (fault.name = "FailedToResolveQuota\IntervalTimeUnitReference") or
            (fault.name = "InvalidQuotaTimeUnit")
        </Condition>
      </Step>
    </FaultRule>
    <FaultRule name="Forbidden Fault">
      <Condition>(error.status.code = 403)</Condition>
      <Step>
        <Name>AM-SetForbidden</Name>
      </Step>
    </FaultRule>
    <FaultRule name="InvalidBasicAuthenticationSource">
      <Condition>(fault.name = "InvalidBasicAuthenticationSource") || (fault.name = InvalidApiKeyForGivenResource)</Condition>
      <Step>
        <Name>AM-SetUnathorizedVariables</Name>
      </Step>
    </FaultRule>
    <FaultRule name="InvalidApiKey">
      <Step>
        <Name>AM-SetUnathorizedVariables</Name>
        <Condition>(fault.name = "DeveloperStatusNotActive") || (fault.name = "FailedToResolveAPIKey") || (fault.name == "InvalidApiKey") || (oauthV2.VA-VerifyApiKey.failed = true)</Condition>
      </Step>
      <Step>
        <Name>AM-SetUnathorizedVariables</Name>
        <Condition>verifyapikey.VA-VerifyApiKey.client_secret != private.apisecret</Condition>
      </Step>
    </FaultRule>
    <FaultRule name="servicecallout Fault">
      <Condition>(servicecallout.SC-GetTokenFunctionBarramento.failed = true)</Condition>
      <Step>
        <Name>AM-SetInternalServerErrorVariables</Name>
      </Step>
    </FaultRule>
    <FaultRule name="NotFound Fault">
      <Condition>(error.reason.phrase = "Not Found")</Condition>
      <Step>
        <Name>AM-SetNotFound</Name>
      </Step>
    </FaultRule>
    <FaultRule name="Bad-Request-Fault">
      <Condition>                      
          (raisefault.RF-BadRequestPacienteHeader.failed = true) or              
          (error.reason.phrase = "Bad Request") or
          (error.status.code = 400)      
      </Condition>
      <Step>
        <Name>AM-SetBadRequest</Name>
      </Step>
    </FaultRule>
    <FaultRule name="Bad Request Fault">
      <Condition>
          (fault.name = "ExceededContainerDepth") or
          (fault.name = "ExceededObjectEntryCount") or
          (fault.name = "ExceededArrayElementCount") or
          (fault.name = "ExceededObjectEntryNameLength") or
          (fault.name = "ExceededStringValueLength") or
          (fault.name = "SourceUnavailable") or
          (fault.name = "NonMessageVariable") or
          (fault.name = "ExecutionFailed") or
          (raisefault.RF-BadRequest.failed = true) or                  
          (error.reason.phrase = "Bad Request")          
      </Condition>
      <Step>
        <Name>AM-SetBadRequest</Name>
      </Step>
    </FaultRule>
    <FaultRule name="Invalid Access Token">
      <Condition>
          (fault.name = "FailedToResolveAccessToken") or          
          (raisefault.RF-Unauthorized.failed = true) or
          (fault.name = "FailedToResolveToken") or
          (fault.name = "FailedToResolveAuthorizationCode") or
          (fault.name = "InsufficientScope") or          
          (fault.name = "InvalidAccessToken") or
          (raisefault.RF-Unauthorized.failed = true) or
          (verifyapikey.VA-VerifyApiKey.failed = true) or
          (fault.name = "InvalidOperation")
      </Condition>
      <Step>
        <Name>AM-SetUnathorizedVariables</Name>
      </Step>
    </FaultRule>
    <FaultRule name="Internal server error">
      <Step>
        <Name>AM-SetInternalServerErrorVariables</Name>
        <Condition>
            (fault.name = "UnresolvedVariable") or          
            (fault.name = "SetVariableFailed") or
            (fault.name = "InvalidVariableName") or
            (fault.name = "ScriptExecutionFailed") or
            (fault.name = "SourceMessageNotAvailable") or  
            (raisefault.RF-Unauthorized.failed = true) or
            (verifyapikey.VA-VerifyApiKey.failed = true) or                        
            (fault.name = "InvalidPayload")
        </Condition>
      </Step>
    </FaultRule>
    <FaultRule name="Bad-Request-Fault">
      <Condition>          
          (raisefault.RF-BadRequest.failed = true) or    
          (raisefault.RF-BadRequestPacienteHeader.failed = true) or              
          (error.reason.phrase = "Bad Request") or
          (error.status.code = 400)      
      </Condition>
      <Step>
        <Name>AM-SetBadRequest</Name>
      </Step>
    </FaultRule>
    <FaultRule name="Bad Request Fault">
      <Condition>
          (fault.name = "ExceededContainerDepth") or
          (fault.name = "ExceededObjectEntryCount") or
          (fault.name = "ExceededArrayElementCount") or
          (fault.name = "ExceededObjectEntryNameLength") or
          (fault.name = "ExceededStringValueLength") or
          (fault.name = "SourceUnavailable") or
          (fault.name = "NonMessageVariable") or
          (fault.name = "ExecutionFailed") or
          (raisefault.RF-BadRequest.failed = true) or                  
          (error.reason.phrase = "Bad Request")          
      </Condition>
      <Step>
        <Name>AM-SetBadRequest</Name>
      </Step>
    </FaultRule>
  </FaultRules>
  <DefaultFaultRule name="fault-rule">
    <AlwaysEnforce>true</AlwaysEnforce>
    <Step>
      <Condition>(flow.error.code = null) and (fault.name = null)</Condition>
      <Name>AM-SetInternalServerErrorVariables</Name>
    </Step>
    <Step>
      <Condition>(fault.name != "ErrorResponseCode")</Condition>
      <Name>RF-JsonError</Name>
    </Step>
  </DefaultFaultRule>
  <PreFlow name="PreFlow">

 

0 2 367
2 REPLIES 2

Hello @FernandoIpnet, we saw your question and wanted to let you know we’re keeping it on our radar. We’ll also invite others in the community to pitch in and share their thoughts.

@FernandoIpnet - have you tried this