{
  "encassConfigs": [
    {
      "goid": "c3d4e5f6333344449555666677778888",
      "guid": "c3d4e5f6-3333-4444-9555-666677778888",
      "name": "CaptureMetrics-1.0",
      "description": "Canonical Response Processing template that finalises every portal.analytics.* variable so the Portal's global analytics policy can pick them up at end-of-message processing. Run this template LAST in any Policy Template Category chain - after authentication, rate/quota, validation, and routing - so it sees the finalised state of the request. The template is fully automatic: no publisher inputs. It (1) backfills portal.analytics.action with the SOAPAction header for SOAP requests or the request URI for REST; (2) backfills portal.analytics.api.uuid with the Portal-managed service apiId; (3) defaults portal.analytics.authType to NO_AUTH if no auth template set it; (4) always captures portal.analytics.routingTotalTime from ${request.routingTotalTime}; and (5) backfills portal.analytics.response.code from the backend response status if no upstream template set it explicitly.",
      "policyName": "CaptureMetrics-1.0",
      "encassArgs": [
        {
          "name": "portal.managed.service.apiId",
          "type": "STRING",
          "ordinal": 1,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.action",
          "type": "STRING",
          "ordinal": 2,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.api.uuid",
          "type": "STRING",
          "ordinal": 3,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.apikey",
          "type": "STRING",
          "ordinal": 4,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.application.name",
          "type": "STRING",
          "ordinal": 5,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.application.uuid",
          "type": "STRING",
          "ordinal": 6,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.authType",
          "type": "STRING",
          "ordinal": 7,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.organization.name",
          "type": "STRING",
          "ordinal": 8,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.organization.uuid",
          "type": "STRING",
          "ordinal": 9,
          "guiPrompt": false
        },
        {
          "name": "portal.analytics.response.code",
          "type": "STRING",
          "ordinal": 10,
          "guiPrompt": false
        }
      ],
      "encassResults": [
        {
          "name": "portal.analytics.action",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.api.uuid",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.apikey",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.application.name",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.application.uuid",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.authType",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.organization.name",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.organization.uuid",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.response.code",
          "type": "STRING"
        },
        {
          "name": "portal.analytics.routingTotalTime",
          "type": "STRING"
        }
      ],
      "properties": [
        {
          "name": "allowTracing",
          "value": "false"
        },
        {
          "name": "paletteFolder",
          "value": "customAssertions"
        },
        {
          "name": "passMetricsToParent",
          "value": "false"
        }
      ]
    }
  ],
  "policies": [
    {
      "goid": "d4e5f6a7444445559666777788889999",
      "guid": "d4e5f6a7-4444-4555-9666-777788889999",
      "name": "CaptureMetrics-1.0",
      "policyType": "FRAGMENT",
      "enabled": true,
      "folderPath": "/Portal Templates",
      "soap": false,
      "policy": {
        "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<wsp:Policy xmlns:L7p=\"http://www.layer7tech.com/ws/policy\" xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\">\n    <wsp:All wsp:Usage=\"Required\">\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"CaptureMetrics-1.0 - canonical Response Processing template that finalises every portal.analytics.* variable so the Portal global analytics policy can pick them up at end-of-message processing.\"/>\n        </L7p:CommentAssertion>\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"Step 1: backfill portal.analytics.action if no upstream template set it. SOAP requests use the SOAPAction header; REST requests use the request URI.\"/>\n        </L7p:CommentAssertion>\n        <wsp:OneOrMore wsp:Usage=\"Required\">\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:ComparisonAssertion>\n                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                    <L7p:Expression1 stringValue=\"${portal.analytics.action}\"/>\n                    <L7p:Operator operatorNull=\"null\"/>\n                    <L7p:Predicates predicates=\"included\">\n                        <L7p:item dataType=\"included\">\n                            <L7p:Type variableDataType=\"string\"/>\n                        </L7p:item>\n                        <L7p:item binary=\"included\">\n                            <L7p:Operator operator=\"EMPTY\"/>\n                            <L7p:RightValue stringValue=\"\"/>\n                        </L7p:item>\n                    </L7p:Predicates>\n                </L7p:ComparisonAssertion>\n                <wsp:OneOrMore wsp:Usage=\"Required\">\n                    <wsp:All wsp:Usage=\"Required\">\n                        <L7p:ComparisonAssertion>\n                            <L7p:CaseSensitive booleanValue=\"false\"/>\n                            <L7p:Expression1 stringValue=\"${request.http.header.soapaction}\"/>\n                            <L7p:Operator operatorNull=\"null\"/>\n                            <L7p:Predicates predicates=\"included\">\n                                <L7p:item dataType=\"included\">\n                                    <L7p:Type variableDataType=\"string\"/>\n                                </L7p:item>\n                                <L7p:item binary=\"included\">\n                                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                                    <L7p:Negated booleanValue=\"true\"/>\n                                    <L7p:Operator operator=\"EMPTY\"/>\n                                    <L7p:RightValue stringValue=\"\"/>\n                                </L7p:item>\n                            </L7p:Predicates>\n                        </L7p:ComparisonAssertion>\n                        <L7p:SetVariable>\n                            <L7p:Base64Expression stringValue=\"JHtyZXF1ZXN0Lmh0dHAuaGVhZGVyLnNvYXBhY3Rpb259\"/>\n                            <L7p:VariableToSet stringValue=\"portal.analytics.action\"/>\n                        </L7p:SetVariable>\n                    </wsp:All>\n                    <L7p:SetVariable>\n                        <L7p:Base64Expression stringValue=\"JHtyZXF1ZXN0Lmh0dHAudXJpfQ==\"/>\n                        <L7p:VariableToSet stringValue=\"portal.analytics.action\"/>\n                    </L7p:SetVariable>\n                </wsp:OneOrMore>\n            </wsp:All>\n            <L7p:TrueAssertion/>\n        </wsp:OneOrMore>\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"Step 2: backfill portal.analytics.api.uuid if no upstream template set it (defensive - auth templates normally do).\"/>\n        </L7p:CommentAssertion>\n        <wsp:OneOrMore wsp:Usage=\"Required\">\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:ComparisonAssertion>\n                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                    <L7p:Expression1 stringValue=\"${portal.analytics.api.uuid}\"/>\n                    <L7p:Operator operatorNull=\"null\"/>\n                    <L7p:Predicates predicates=\"included\">\n                        <L7p:item dataType=\"included\">\n                            <L7p:Type variableDataType=\"string\"/>\n                        </L7p:item>\n                        <L7p:item binary=\"included\">\n                            <L7p:Operator operator=\"EMPTY\"/>\n                            <L7p:RightValue stringValue=\"\"/>\n                        </L7p:item>\n                    </L7p:Predicates>\n                </L7p:ComparisonAssertion>\n                <L7p:SetVariable>\n                    <L7p:Base64Expression stringValue=\"JHtwb3J0YWwubWFuYWdlZC5zZXJ2aWNlLmFwaUlkfQ==\"/>\n                    <L7p:VariableToSet stringValue=\"portal.analytics.api.uuid\"/>\n                </L7p:SetVariable>\n            </wsp:All>\n            <L7p:TrueAssertion/>\n        </wsp:OneOrMore>\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"Step 3: backfill portal.analytics.authType to NO_AUTH if no upstream auth template set it. Auth templates set this to API_KEY, OAUTH_2, etc.\"/>\n        </L7p:CommentAssertion>\n        <wsp:OneOrMore wsp:Usage=\"Required\">\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:ComparisonAssertion>\n                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                    <L7p:Expression1 stringValue=\"${portal.analytics.authType}\"/>\n                    <L7p:Operator operatorNull=\"null\"/>\n                    <L7p:Predicates predicates=\"included\">\n                        <L7p:item dataType=\"included\">\n                            <L7p:Type variableDataType=\"string\"/>\n                        </L7p:item>\n                        <L7p:item binary=\"included\">\n                            <L7p:Operator operator=\"EMPTY\"/>\n                            <L7p:RightValue stringValue=\"\"/>\n                        </L7p:item>\n                    </L7p:Predicates>\n                </L7p:ComparisonAssertion>\n                <L7p:SetVariable>\n                    <L7p:Base64Expression stringValue=\"Tk9fQVVUSA==\"/>\n                    <L7p:VariableToSet stringValue=\"portal.analytics.authType\"/>\n                </L7p:SetVariable>\n            </wsp:All>\n            <L7p:TrueAssertion/>\n        </wsp:OneOrMore>\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"Step 4: always capture the routing time. ${request.routingTotalTime} is a Gateway built-in populated by the Route via HTTP(S) assertion that ran earlier in the chain.\"/>\n        </L7p:CommentAssertion>\n        <L7p:SetVariable>\n            <L7p:Base64Expression stringValue=\"JHtyZXF1ZXN0LnJvdXRpbmdUb3RhbFRpbWV9\"/>\n            <L7p:VariableToSet stringValue=\"portal.analytics.routingTotalTime\"/>\n        </L7p:SetVariable>\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"Step 5: backfill portal.analytics.response.code from the actual backend response if no upstream template set it. Threat protection / auth / rate-quota templates set this explicitly to 4xx / 503 on rejection; on the happy path the value reflects the backend.\"/>\n        </L7p:CommentAssertion>\n        <wsp:OneOrMore wsp:Usage=\"Required\">\n            <wsp:All wsp:Usage=\"Required\">\n                <L7p:ComparisonAssertion>\n                    <L7p:CaseSensitive booleanValue=\"false\"/>\n                    <L7p:Expression1 stringValue=\"${portal.analytics.response.code}\"/>\n                    <L7p:Operator operatorNull=\"null\"/>\n                    <L7p:Predicates predicates=\"included\">\n                        <L7p:item dataType=\"included\">\n                            <L7p:Type variableDataType=\"string\"/>\n                        </L7p:item>\n                        <L7p:item binary=\"included\">\n                            <L7p:Operator operator=\"EMPTY\"/>\n                            <L7p:RightValue stringValue=\"\"/>\n                        </L7p:item>\n                    </L7p:Predicates>\n                </L7p:ComparisonAssertion>\n                <L7p:SetVariable>\n                    <L7p:Base64Expression stringValue=\"JHtyZXNwb25zZS5odHRwLnN0YXR1c30=\"/>\n                    <L7p:VariableToSet stringValue=\"portal.analytics.response.code\"/>\n                </L7p:SetVariable>\n            </wsp:All>\n            <L7p:TrueAssertion/>\n        </wsp:OneOrMore>\n        <L7p:CommentAssertion>\n            <L7p:Comment stringValue=\"Step 6: export every portal.analytics.* variable so the parent template / Portal global analytics policy reads the finalised values.\"/>\n        </L7p:CommentAssertion>\n        <L7p:ExportVariables>\n            <L7p:ExportedVars stringArrayValue=\"included\">\n                <L7p:item stringValue=\"portal.analytics.action\"/>\n                <L7p:item stringValue=\"portal.analytics.api.uuid\"/>\n                <L7p:item stringValue=\"portal.analytics.apikey\"/>\n                <L7p:item stringValue=\"portal.analytics.application.name\"/>\n                <L7p:item stringValue=\"portal.analytics.application.uuid\"/>\n                <L7p:item stringValue=\"portal.analytics.authType\"/>\n                <L7p:item stringValue=\"portal.analytics.organization.name\"/>\n                <L7p:item stringValue=\"portal.analytics.organization.uuid\"/>\n                <L7p:item stringValue=\"portal.analytics.response.code\"/>\n                <L7p:item stringValue=\"portal.analytics.routingTotalTime\"/>\n            </L7p:ExportedVars>\n        </L7p:ExportVariables>\n    </wsp:All>\n</wsp:Policy>\n"
      }
    }
  ],
  "properties": {
    "defaultAction": "NEW_OR_UPDATE",
    "meta": {
      "name": "CaptureMetrics-1.0 Bundle",
      "schema": "11.2.1"
    },
    "mappings": {}
  }
}