zuplo 6.67.32 → 6.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/docs/_index.md +44 -0
- package/docs/ai-gateway/apps.mdx +28 -0
- package/docs/ai-gateway/custom-providers.mdx +54 -0
- package/docs/ai-gateway/getting-started.mdx +224 -0
- package/docs/ai-gateway/guardrails.mdx +65 -0
- package/docs/ai-gateway/integrations/ai-sdk.mdx +109 -0
- package/docs/ai-gateway/integrations/claude-code.mdx +49 -0
- package/docs/ai-gateway/integrations/codex.mdx +78 -0
- package/docs/ai-gateway/integrations/goose.mdx +104 -0
- package/docs/ai-gateway/integrations/langchain.mdx +66 -0
- package/docs/ai-gateway/integrations/openai.mdx +99 -0
- package/docs/ai-gateway/introduction.mdx +85 -0
- package/docs/ai-gateway/managing-apps.mdx +46 -0
- package/docs/ai-gateway/managing-providers.mdx +66 -0
- package/docs/ai-gateway/managing-teams.mdx +63 -0
- package/docs/ai-gateway/policies/akamai-ai-firewall.mdx +125 -0
- package/docs/ai-gateway/policies/comet-opik-tracing.mdx +139 -0
- package/docs/ai-gateway/policies/galileo-tracing.mdx +147 -0
- package/docs/ai-gateway/providers.mdx +32 -0
- package/docs/ai-gateway/teams.mdx +38 -0
- package/docs/ai-gateway/universal-api.mdx +43 -0
- package/docs/ai-gateway/usage-limits.mdx +89 -0
- package/docs/api-management/introduction.md +127 -0
- package/docs/articles/accounts/audit-logs.mdx +227 -0
- package/docs/articles/accounts/billing.mdx +25 -0
- package/docs/articles/accounts/default-api-key.mdx +30 -0
- package/docs/articles/accounts/delete-account.mdx +36 -0
- package/docs/articles/accounts/enterprise-sso.mdx +116 -0
- package/docs/articles/accounts/managing-account-members.mdx +45 -0
- package/docs/articles/accounts/managing-project-members.mdx +37 -0
- package/docs/articles/accounts/members-and-roles.mdx +21 -0
- package/docs/articles/accounts/roles-and-permissions.mdx +115 -0
- package/docs/articles/accounts/zuplo-api-keys.mdx +94 -0
- package/docs/articles/add-api-to-backstage.mdx +216 -0
- package/docs/articles/advanced-path-matching.mdx +139 -0
- package/docs/articles/api-key-administration.mdx +47 -0
- package/docs/articles/api-key-api.mdx +220 -0
- package/docs/articles/api-key-authentication.mdx +195 -0
- package/docs/articles/api-key-buckets.mdx +61 -0
- package/docs/articles/api-key-end-users.mdx +52 -0
- package/docs/articles/api-key-leak-detection.mdx +75 -0
- package/docs/articles/api-key-management.mdx +100 -0
- package/docs/articles/api-key-react-component.mdx +90 -0
- package/docs/articles/api-key-service-limits.mdx +14 -0
- package/docs/articles/archiving-requests-to-storage.mdx +119 -0
- package/docs/articles/branch-based-deployments.mdx +184 -0
- package/docs/articles/bypass-policy-for-testing.mdx +117 -0
- package/docs/articles/check-ip-address.mdx +17 -0
- package/docs/articles/ci-cd-azure/basic-deployment.mdx +49 -0
- package/docs/articles/ci-cd-azure/deploy-and-test.mdx +47 -0
- package/docs/articles/ci-cd-azure/local-testing.mdx +59 -0
- package/docs/articles/ci-cd-azure/multi-stage-deployment.mdx +88 -0
- package/docs/articles/ci-cd-azure/pr-preview-environments.mdx +50 -0
- package/docs/articles/ci-cd-azure/tag-based-releases.mdx +37 -0
- package/docs/articles/ci-cd-bitbucket/basic-deployment.mdx +27 -0
- package/docs/articles/ci-cd-bitbucket/deploy-and-test.mdx +41 -0
- package/docs/articles/ci-cd-bitbucket/local-testing.mdx +34 -0
- package/docs/articles/ci-cd-bitbucket/multi-stage-deployment.mdx +52 -0
- package/docs/articles/ci-cd-bitbucket/pr-preview-environments.mdx +46 -0
- package/docs/articles/ci-cd-bitbucket/tag-based-releases.mdx +27 -0
- package/docs/articles/ci-cd-circleci/basic-deployment.mdx +34 -0
- package/docs/articles/ci-cd-circleci/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-circleci/local-testing.mdx +50 -0
- package/docs/articles/ci-cd-circleci/multi-stage-deployment.mdx +82 -0
- package/docs/articles/ci-cd-circleci/pr-preview-environments.mdx +47 -0
- package/docs/articles/ci-cd-circleci/tag-based-releases.mdx +38 -0
- package/docs/articles/ci-cd-github/basic-deployment.mdx +48 -0
- package/docs/articles/ci-cd-github/cleanup-on-branch-delete.mdx +123 -0
- package/docs/articles/ci-cd-github/deploy-and-test.mdx +82 -0
- package/docs/articles/ci-cd-github/local-testing.mdx +102 -0
- package/docs/articles/ci-cd-github/multi-stage-deployment.mdx +136 -0
- package/docs/articles/ci-cd-github/pr-preview-environments.mdx +106 -0
- package/docs/articles/ci-cd-github/tag-based-releases.mdx +99 -0
- package/docs/articles/ci-cd-gitlab/basic-deployment.mdx +28 -0
- package/docs/articles/ci-cd-gitlab/deploy-and-test.mdx +44 -0
- package/docs/articles/ci-cd-gitlab/local-testing.mdx +39 -0
- package/docs/articles/ci-cd-gitlab/mr-preview-environments.mdx +52 -0
- package/docs/articles/ci-cd-gitlab/multi-stage-deployment.mdx +64 -0
- package/docs/articles/ci-cd-gitlab/tag-based-releases.mdx +28 -0
- package/docs/articles/composite-policy-reference.mdx +284 -0
- package/docs/articles/configuring-auth0-for-mcp-auth.mdx +186 -0
- package/docs/articles/configuring-okta-for-mcp-auth.mdx +208 -0
- package/docs/articles/convert-urls-to-openapi.mdx +62 -0
- package/docs/articles/cors.mdx +447 -0
- package/docs/articles/custom-audit-log-policy.mdx +95 -0
- package/docs/articles/custom-ci-cd-azure.mdx +81 -0
- package/docs/articles/custom-ci-cd-bitbucket.mdx +80 -0
- package/docs/articles/custom-ci-cd-circleci.mdx +78 -0
- package/docs/articles/custom-ci-cd-github.mdx +99 -0
- package/docs/articles/custom-ci-cd-gitlab.mdx +79 -0
- package/docs/articles/custom-ci-cd.mdx +82 -0
- package/docs/articles/custom-code-patterns.md +418 -0
- package/docs/articles/custom-domains.mdx +258 -0
- package/docs/articles/custom-logging-example.mdx +139 -0
- package/docs/articles/ddos-protection.mdx +138 -0
- package/docs/articles/development-options.mdx +49 -0
- package/docs/articles/environment-variables.mdx +134 -0
- package/docs/articles/environments.mdx +143 -0
- package/docs/articles/fastly-zuplo-host-setup.mdx +41 -0
- package/docs/articles/github-deployment-testing.mdx +101 -0
- package/docs/articles/gke-with-upstream-auth-policy.mdx +192 -0
- package/docs/articles/graphql-security.mdx +180 -0
- package/docs/articles/handling-form-data.mdx +61 -0
- package/docs/articles/health-checks.mdx +109 -0
- package/docs/articles/hosting-options.mdx +70 -0
- package/docs/articles/lazy-load-configuration-into-cache.mdx +92 -0
- package/docs/articles/limits.mdx +98 -0
- package/docs/articles/local-development-debugging.mdx +44 -0
- package/docs/articles/local-development-env-variables.mdx +23 -0
- package/docs/articles/local-development-installing-packages.mdx +23 -0
- package/docs/articles/local-development-routes-designer.mdx +27 -0
- package/docs/articles/local-development-services.mdx +40 -0
- package/docs/articles/local-development-troubleshooting.mdx +56 -0
- package/docs/articles/local-development.mdx +81 -0
- package/docs/articles/log-plugin-aws-cloudwatch.mdx +83 -0
- package/docs/articles/log-plugin-datadog.mdx +84 -0
- package/docs/articles/log-plugin-dynatrace.mdx +75 -0
- package/docs/articles/log-plugin-gcp.mdx +75 -0
- package/docs/articles/log-plugin-loki.mdx +136 -0
- package/docs/articles/log-plugin-new-relic.mdx +84 -0
- package/docs/articles/log-plugin-splunk.mdx +104 -0
- package/docs/articles/log-plugin-sumo.mdx +73 -0
- package/docs/articles/log-plugin-vmware-log-insight.mdx +154 -0
- package/docs/articles/log-request-response-data.mdx +398 -0
- package/docs/articles/logging.mdx +115 -0
- package/docs/articles/manual-mcp-oauth-testing.mdx +193 -0
- package/docs/articles/mcp-quickstart.mdx +135 -0
- package/docs/articles/metrics-plugins.mdx +371 -0
- package/docs/articles/migrate-from-apigee.md +408 -0
- package/docs/articles/migrate-from-aws-api-gateway.md +248 -0
- package/docs/articles/migrate-from-azure-apim.md +292 -0
- package/docs/articles/migrate-from-kong.md +300 -0
- package/docs/articles/migration-overview.md +81 -0
- package/docs/articles/monetization/api-access.mdx +69 -0
- package/docs/articles/monetization/billing-models.md +520 -0
- package/docs/articles/monetization/developer-portal.md +167 -0
- package/docs/articles/monetization/features.mdx +98 -0
- package/docs/articles/monetization/index.mdx +113 -0
- package/docs/articles/monetization/meters.mdx +135 -0
- package/docs/articles/monetization/monetization-policy.md +314 -0
- package/docs/articles/monetization/plan-examples.mdx +366 -0
- package/docs/articles/monetization/plans.mdx +266 -0
- package/docs/articles/monetization/pricing-models.mdx +225 -0
- package/docs/articles/monetization/private-plans.md +154 -0
- package/docs/articles/monetization/quickstart.md +355 -0
- package/docs/articles/monetization/rate-cards.mdx +171 -0
- package/docs/articles/monetization/stripe-integration.md +195 -0
- package/docs/articles/monetization/subscription-lifecycle.md +298 -0
- package/docs/articles/monetization/tax-collection.md +166 -0
- package/docs/articles/monetization/troubleshooting.md +272 -0
- package/docs/articles/monetization-custom.mdx +71 -0
- package/docs/articles/monetization-integrations.mdx +104 -0
- package/docs/articles/monitoring-your-gateway.mdx +53 -0
- package/docs/articles/monorepo-deployment.mdx +350 -0
- package/docs/articles/multiple-auth-policies.mdx +81 -0
- package/docs/articles/non-standard-ports.mdx +30 -0
- package/docs/articles/oauth-authentication.mdx +54 -0
- package/docs/articles/openapi-server-urls.mdx +60 -0
- package/docs/articles/openapi.mdx +130 -0
- package/docs/articles/opentelemetry.mdx +250 -0
- package/docs/articles/per-user-rate-limits-using-db.mdx +112 -0
- package/docs/articles/performance-testing.mdx +304 -0
- package/docs/articles/plugin-akamai-api-security.mdx +76 -0
- package/docs/articles/plugin-azure-blob.mdx +73 -0
- package/docs/articles/plugin-azure-event-hubs.mdx +64 -0
- package/docs/articles/plugin-hydrolix-traffic-peak.mdx +147 -0
- package/docs/articles/policies.mdx +33 -0
- package/docs/articles/rename-or-move-project.mdx +39 -0
- package/docs/articles/rick-and-morty-api-developer-portal-example.mdx +23 -0
- package/docs/articles/routing.mdx +193 -0
- package/docs/articles/s3-signed-url-uploads.mdx +521 -0
- package/docs/articles/secure-tunnel.mdx +84 -0
- package/docs/articles/securing-backend-mtls.mdx +268 -0
- package/docs/articles/securing-your-backend.mdx +148 -0
- package/docs/articles/security.mdx +105 -0
- package/docs/articles/sharing-code-across-projects.mdx +412 -0
- package/docs/articles/source-control-setup-azure.mdx +13 -0
- package/docs/articles/source-control-setup-bitbucket.mdx +43 -0
- package/docs/articles/source-control-setup-github.mdx +172 -0
- package/docs/articles/source-control-setup-gitlab.mdx +12 -0
- package/docs/articles/source-control.mdx +80 -0
- package/docs/articles/step-1-setup-basic-gateway-local.mdx +136 -0
- package/docs/articles/step-1-setup-basic-gateway.mdx +118 -0
- package/docs/articles/step-2-add-rate-limiting-local.mdx +126 -0
- package/docs/articles/step-2-add-rate-limiting.mdx +82 -0
- package/docs/articles/step-3-add-api-key-auth-local.mdx +199 -0
- package/docs/articles/step-3-add-api-key-auth.mdx +166 -0
- package/docs/articles/step-4-deploying-to-the-edge.mdx +220 -0
- package/docs/articles/step-5-dynamic-rate-limiting.mdx +167 -0
- package/docs/articles/support.mdx +144 -0
- package/docs/articles/terraform.mdx +114 -0
- package/docs/articles/testing-graphql.mdx +34 -0
- package/docs/articles/testing.mdx +522 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +301 -0
- package/docs/articles/troubleshooting.md +302 -0
- package/docs/articles/tsconfig.mdx +105 -0
- package/docs/articles/tunnel-setup.mdx +195 -0
- package/docs/articles/tunnel-troubleshooting.mdx +50 -0
- package/docs/articles/update-zup-in-github-action.mdx +110 -0
- package/docs/articles/use-openapi-extension-data.mdx +79 -0
- package/docs/articles/users/multifactor-authentication.mdx +64 -0
- package/docs/articles/users/profile.mdx +13 -0
- package/docs/articles/versioning-on-zuplo.mdx +89 -0
- package/docs/articles/waf-ddos-akamai.md +133 -0
- package/docs/articles/waf-ddos-aws-waf-shield.mdx +85 -0
- package/docs/articles/waf-ddos-fastly.mdx +251 -0
- package/docs/articles/waf-ddos.mdx +140 -0
- package/docs/articles/zuplo-waf.mdx +156 -0
- package/docs/ask.mdx +3 -0
- package/docs/cli/authentication.mdx +56 -0
- package/docs/cli/connectivity.mdx +38 -0
- package/docs/cli/create-zuplo-api.mdx +80 -0
- package/docs/cli/delete.mdx +79 -0
- package/docs/cli/deploy.mdx +156 -0
- package/docs/cli/deploy.partial.mdx +46 -0
- package/docs/cli/dev.mdx +115 -0
- package/docs/cli/docs.mdx +66 -0
- package/docs/cli/editor.mdx +50 -0
- package/docs/cli/global-options.mdx +19 -0
- package/docs/cli/init.mdx +74 -0
- package/docs/cli/link.mdx +74 -0
- package/docs/cli/list.mdx +55 -0
- package/docs/cli/mtls-certificate-create.mdx +94 -0
- package/docs/cli/mtls-certificate-delete.mdx +55 -0
- package/docs/cli/mtls-certificate-describe.mdx +55 -0
- package/docs/cli/mtls-certificate-disable.mdx +55 -0
- package/docs/cli/mtls-certificate-list.mdx +47 -0
- package/docs/cli/mtls-certificate-update.mdx +72 -0
- package/docs/cli/openapi-convert.mdx +111 -0
- package/docs/cli/openapi-merge.mdx +138 -0
- package/docs/cli/openapi-merge.partial.mdx +29 -0
- package/docs/cli/openapi-overlay.mdx +123 -0
- package/docs/cli/overview.mdx +78 -0
- package/docs/cli/project-create.mdx +43 -0
- package/docs/cli/source-migrate.mdx +18 -0
- package/docs/cli/source-upgrade.mdx +41 -0
- package/docs/cli/test.mdx +70 -0
- package/docs/cli/test.partial.mdx +7 -0
- package/docs/cli/tunnel-create.mdx +53 -0
- package/docs/cli/tunnel-create.partial.mdx +9 -0
- package/docs/cli/tunnel-delete.mdx +35 -0
- package/docs/cli/tunnel-delete.partial.mdx +9 -0
- package/docs/cli/tunnel-describe.mdx +45 -0
- package/docs/cli/tunnel-describe.partial.mdx +5 -0
- package/docs/cli/tunnel-list.mdx +35 -0
- package/docs/cli/tunnel-list.partial.mdx +9 -0
- package/docs/cli/tunnel-rate-token.partial.mdx +9 -0
- package/docs/cli/tunnel-rotate-token.mdx +39 -0
- package/docs/cli/tunnel-services-describe.mdx +45 -0
- package/docs/cli/tunnel-services-describe.partial.mdx +9 -0
- package/docs/cli/tunnel-services-update.mdx +48 -0
- package/docs/cli/variable-create.mdx +91 -0
- package/docs/cli/variable-create.partial.mdx +5 -0
- package/docs/cli/variable-update.mdx +75 -0
- package/docs/cli/variable-update.partial.mdx +5 -0
- package/docs/concepts/api-keys.md +146 -0
- package/docs/concepts/authentication.mdx +109 -0
- package/docs/concepts/how-zuplo-works.mdx +120 -0
- package/docs/concepts/project-structure.mdx +174 -0
- package/docs/concepts/rate-limiting.md +246 -0
- package/docs/concepts/request-lifecycle.mdx +56 -0
- package/docs/concepts/source-control-and-deployment.mdx +229 -0
- package/docs/conferences/conference-prize-terms.mdx +80 -0
- package/docs/dedicated/akamai/ai-powered-applications.mdx +223 -0
- package/docs/dedicated/akamai/architecture.mdx +280 -0
- package/docs/dedicated/akamai/caching.mdx +212 -0
- package/docs/dedicated/akamai/cdn.mdx +156 -0
- package/docs/dedicated/architecture.mdx +208 -0
- package/docs/dedicated/custom-domains.mdx +31 -0
- package/docs/dedicated/federated-gateways.mdx +80 -0
- package/docs/dedicated/networking.mdx +69 -0
- package/docs/dedicated/overview.mdx +80 -0
- package/docs/dedicated/source-control.mdx +63 -0
- package/docs/dev-portal/dev-portal-create-consumer-on-auth.mdx +134 -0
- package/docs/dev-portal/introduction.mdx +65 -0
- package/docs/dev-portal/local-development.mdx +72 -0
- package/docs/dev-portal/migration.mdx +526 -0
- package/docs/dev-portal/node-modules.mdx +45 -0
- package/docs/dev-portal/updating.mdx +28 -0
- package/docs/dev-portal/zudoku/components/alert.mdx +130 -0
- package/docs/dev-portal/zudoku/components/badge.mdx +70 -0
- package/docs/dev-portal/zudoku/components/button.mdx +132 -0
- package/docs/dev-portal/zudoku/components/callout.mdx +112 -0
- package/docs/dev-portal/zudoku/components/card.mdx +104 -0
- package/docs/dev-portal/zudoku/components/checkbox.mdx +72 -0
- package/docs/dev-portal/zudoku/components/client-only.mdx +79 -0
- package/docs/dev-portal/zudoku/components/code-tabs.mdx +179 -0
- package/docs/dev-portal/zudoku/components/dialog.mdx +167 -0
- package/docs/dev-portal/zudoku/components/head.mdx +199 -0
- package/docs/dev-portal/zudoku/components/icons.mdx +27 -0
- package/docs/dev-portal/zudoku/components/input.mdx +96 -0
- package/docs/dev-portal/zudoku/components/label.mdx +86 -0
- package/docs/dev-portal/zudoku/components/link.mdx +242 -0
- package/docs/dev-portal/zudoku/components/markdown.mdx +151 -0
- package/docs/dev-portal/zudoku/components/mermaid.mdx +81 -0
- package/docs/dev-portal/zudoku/components/playground.mdx +87 -0
- package/docs/dev-portal/zudoku/components/secret.mdx +78 -0
- package/docs/dev-portal/zudoku/components/select.mdx +176 -0
- package/docs/dev-portal/zudoku/components/shadcn.mdx +73 -0
- package/docs/dev-portal/zudoku/components/slider.mdx +108 -0
- package/docs/dev-portal/zudoku/components/slot.mdx +119 -0
- package/docs/dev-portal/zudoku/components/stepper.mdx +138 -0
- package/docs/dev-portal/zudoku/components/switch.mdx +96 -0
- package/docs/dev-portal/zudoku/components/syntax-highlight.mdx +602 -0
- package/docs/dev-portal/zudoku/components/textarea.mdx +78 -0
- package/docs/dev-portal/zudoku/components/tooltip.mdx +195 -0
- package/docs/dev-portal/zudoku/components/typography.mdx +61 -0
- package/docs/dev-portal/zudoku/configuration/ai-assistants.md +64 -0
- package/docs/dev-portal/zudoku/configuration/api-catalog.md +108 -0
- package/docs/dev-portal/zudoku/configuration/api-reference.md +397 -0
- package/docs/dev-portal/zudoku/configuration/authentication-auth0.md +173 -0
- package/docs/dev-portal/zudoku/configuration/authentication-azure-ad.md +238 -0
- package/docs/dev-portal/zudoku/configuration/authentication-clerk.md +110 -0
- package/docs/dev-portal/zudoku/configuration/authentication-firebase.md +61 -0
- package/docs/dev-portal/zudoku/configuration/authentication-pingfederate.md +136 -0
- package/docs/dev-portal/zudoku/configuration/authentication-supabase.md +225 -0
- package/docs/dev-portal/zudoku/configuration/authentication.md +199 -0
- package/docs/dev-portal/zudoku/configuration/build-configuration.mdx +147 -0
- package/docs/dev-portal/zudoku/configuration/docs.md +282 -0
- package/docs/dev-portal/zudoku/configuration/footer.mdx +214 -0
- package/docs/dev-portal/zudoku/configuration/llms.md +89 -0
- package/docs/dev-portal/zudoku/configuration/navigation.mdx +408 -0
- package/docs/dev-portal/zudoku/configuration/overview.md +380 -0
- package/docs/dev-portal/zudoku/configuration/protected-routes.md +149 -0
- package/docs/dev-portal/zudoku/configuration/search.md +169 -0
- package/docs/dev-portal/zudoku/configuration/sentry.mdx +44 -0
- package/docs/dev-portal/zudoku/configuration/site.md +124 -0
- package/docs/dev-portal/zudoku/configuration/slots.mdx +124 -0
- package/docs/dev-portal/zudoku/configuration/vite-config.md +18 -0
- package/docs/dev-portal/zudoku/custom-plugins.md +287 -0
- package/docs/dev-portal/zudoku/customization/colors-theme.mdx +275 -0
- package/docs/dev-portal/zudoku/customization/fonts.md +110 -0
- package/docs/dev-portal/zudoku/extending/events.md +124 -0
- package/docs/dev-portal/zudoku/guides/custom-pages.md +106 -0
- package/docs/dev-portal/zudoku/guides/environment-variables.md +99 -0
- package/docs/dev-portal/zudoku/guides/mermaid.mdx +70 -0
- package/docs/dev-portal/zudoku/guides/navigation-migration.md +87 -0
- package/docs/dev-portal/zudoku/guides/navigation-rules.mdx +197 -0
- package/docs/dev-portal/zudoku/guides/processors.mdx +234 -0
- package/docs/dev-portal/zudoku/guides/static-files.md +55 -0
- package/docs/dev-portal/zudoku/guides/transforming-examples.md +156 -0
- package/docs/dev-portal/zudoku/guides/using-multiple-apis.md +87 -0
- package/docs/dev-portal/zudoku/markdown/admonitions.md +128 -0
- package/docs/dev-portal/zudoku/markdown/code-blocks.md +196 -0
- package/docs/dev-portal/zudoku/markdown/frontmatter.md +172 -0
- package/docs/dev-portal/zudoku/markdown/mdx.md +68 -0
- package/docs/dev-portal/zudoku/markdown/overview.md +275 -0
- package/docs/dev-portal/zudoku/plugins.md +5 -0
- package/docs/dev-portal/zudoku/writing.mdx +72 -0
- package/docs/errors/bad-request.mdx +39 -0
- package/docs/errors/build-error.mdx +45 -0
- package/docs/errors/fatal-project-error.mdx +39 -0
- package/docs/errors/gateway-timeout.mdx +33 -0
- package/docs/errors/get-head-body-error.mdx +41 -0
- package/docs/errors/main-mod-error.mdx +40 -0
- package/docs/errors/no-project-set.mdx +41 -0
- package/docs/errors/not-found.mdx +43 -0
- package/docs/errors/rate-limit-exceeded.mdx +31 -0
- package/docs/errors/schema-validation-failed.mdx +51 -0
- package/docs/errors/system-configuration-error.mdx +44 -0
- package/docs/errors/unauthorized.mdx +50 -0
- package/docs/errors/unknown-error.mdx +42 -0
- package/docs/errors.mdx +14 -0
- package/docs/guides/canary-routing-for-employees.mdx +385 -0
- package/docs/guides/geolocation-backend-routing.mdx +404 -0
- package/docs/guides/modify-openapi-paths.mdx +371 -0
- package/docs/guides/openapi-overlays.mdx +492 -0
- package/docs/guides/overview.mdx +12 -0
- package/docs/guides/user-based-backend-routing.mdx +437 -0
- package/docs/handlers/aws-lambda.mdx +201 -0
- package/docs/handlers/custom-handler.mdx +112 -0
- package/docs/handlers/legacy-dev-portal-handler.mdx +135 -0
- package/docs/handlers/mcp-server.mdx +730 -0
- package/docs/handlers/openapi.mdx +78 -0
- package/docs/handlers/redirect.mdx +115 -0
- package/docs/handlers/system-handlers.mdx +41 -0
- package/docs/handlers/url-forward.mdx +204 -0
- package/docs/handlers/url-rewrite.mdx +224 -0
- package/docs/handlers/websocket-handler.mdx +154 -0
- package/docs/home.mdx +6 -0
- package/docs/managed-edge/overview.md +78 -0
- package/docs/mcp-server/configuration-migration-guide.mdx +344 -0
- package/docs/mcp-server/custom-tools.mdx +487 -0
- package/docs/mcp-server/graphql.mdx +241 -0
- package/docs/mcp-server/introduction.mdx +122 -0
- package/docs/mcp-server/openai-apps-sdk.mdx +160 -0
- package/docs/mcp-server/prompts.mdx +283 -0
- package/docs/mcp-server/resources.mdx +288 -0
- package/docs/mcp-server/testing.mdx +53 -0
- package/docs/mcp-server/tools.mdx +306 -0
- package/docs/policies/_index.md +92 -0
- package/docs/policies/ab-test-inbound/intro.md +8 -0
- package/docs/policies/ab-test-inbound/policy.ts +14 -0
- package/docs/policies/ab-test-inbound/schema.json +27 -0
- package/docs/policies/ab-test-outbound/intro.md +8 -0
- package/docs/policies/ab-test-outbound/policy.ts +26 -0
- package/docs/policies/ab-test-outbound/schema.json +27 -0
- package/docs/policies/acl-policy-inbound/intro.md +5 -0
- package/docs/policies/acl-policy-inbound/policy.ts +32 -0
- package/docs/policies/acl-policy-inbound/schema.json +52 -0
- package/docs/policies/akamai-ai-firewall/schema.json +98 -0
- package/docs/policies/amberflo-metering-inbound/doc.md +183 -0
- package/docs/policies/amberflo-metering-inbound/intro.md +20 -0
- package/docs/policies/amberflo-metering-inbound/schema.json +108 -0
- package/docs/policies/api-key-inbound/doc.md +77 -0
- package/docs/policies/api-key-inbound/intro.md +30 -0
- package/docs/policies/api-key-inbound/schema.json +84 -0
- package/docs/policies/archive-request-aws-s3-inbound/intro.md +4 -0
- package/docs/policies/archive-request-aws-s3-inbound/policy.ts +58 -0
- package/docs/policies/archive-request-aws-s3-inbound/schema.json +68 -0
- package/docs/policies/archive-request-azure-storage-inbound/doc.md +31 -0
- package/docs/policies/archive-request-azure-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-azure-storage-inbound/policy.ts +54 -0
- package/docs/policies/archive-request-azure-storage-inbound/schema.json +53 -0
- package/docs/policies/archive-request-gcp-storage-inbound/doc.md +63 -0
- package/docs/policies/archive-request-gcp-storage-inbound/intro.md +4 -0
- package/docs/policies/archive-request-gcp-storage-inbound/policy.ts +68 -0
- package/docs/policies/archive-request-gcp-storage-inbound/schema.json +47 -0
- package/docs/policies/archive-response-aws-s3-outbound/intro.md +2 -0
- package/docs/policies/archive-response-aws-s3-outbound/policy.ts +59 -0
- package/docs/policies/archive-response-aws-s3-outbound/schema.json +68 -0
- package/docs/policies/archive-response-azure-storage-outbound/doc.md +31 -0
- package/docs/policies/archive-response-azure-storage-outbound/intro.md +3 -0
- package/docs/policies/archive-response-azure-storage-outbound/policy.ts +54 -0
- package/docs/policies/archive-response-azure-storage-outbound/schema.json +53 -0
- package/docs/policies/audit-log-inbound/doc.md +78 -0
- package/docs/policies/audit-log-inbound/intro.md +10 -0
- package/docs/policies/audit-log-inbound/schema.json +81 -0
- package/docs/policies/auth0-jwt-auth-inbound/doc.md +125 -0
- package/docs/policies/auth0-jwt-auth-inbound/intro.md +17 -0
- package/docs/policies/auth0-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/authzen-inbound/doc.md +24 -0
- package/docs/policies/authzen-inbound/intro.md +31 -0
- package/docs/policies/authzen-inbound/schema.json +126 -0
- package/docs/policies/axiomatics-authz-inbound/doc.md +144 -0
- package/docs/policies/axiomatics-authz-inbound/intro.md +11 -0
- package/docs/policies/axiomatics-authz-inbound/schema.json +161 -0
- package/docs/policies/basic-auth-inbound/intro.md +9 -0
- package/docs/policies/basic-auth-inbound/schema.json +99 -0
- package/docs/policies/bot-detection-inbound/intro.md +4 -0
- package/docs/policies/bot-detection-inbound/schema.json +56 -0
- package/docs/policies/brownout-inbound/doc.md +55 -0
- package/docs/policies/brownout-inbound/intro.md +12 -0
- package/docs/policies/brownout-inbound/schema.json +115 -0
- package/docs/policies/caching-inbound/doc.md +209 -0
- package/docs/policies/caching-inbound/intro.md +23 -0
- package/docs/policies/caching-inbound/schema.json +98 -0
- package/docs/policies/change-method-inbound/schema.json +56 -0
- package/docs/policies/clear-headers-inbound/schema.json +59 -0
- package/docs/policies/clear-headers-outbound/schema.json +59 -0
- package/docs/policies/clerk-jwt-auth-inbound/doc.md +85 -0
- package/docs/policies/clerk-jwt-auth-inbound/intro.md +4 -0
- package/docs/policies/clerk-jwt-auth-inbound/schema.json +68 -0
- package/docs/policies/cognito-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/cognito-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/comet-opik-tracing-inbound/schema.json +65 -0
- package/docs/policies/complex-rate-limit-inbound/doc.md +20 -0
- package/docs/policies/complex-rate-limit-inbound/intro.md +23 -0
- package/docs/policies/complex-rate-limit-inbound/schema.json +142 -0
- package/docs/policies/composite-inbound/doc.md +69 -0
- package/docs/policies/composite-inbound/intro.md +15 -0
- package/docs/policies/composite-inbound/schema.json +59 -0
- package/docs/policies/composite-outbound/intro.md +6 -0
- package/docs/policies/composite-outbound/schema.json +59 -0
- package/docs/policies/curity-phantom-token-inbound/doc.md +109 -0
- package/docs/policies/curity-phantom-token-inbound/intro.md +3 -0
- package/docs/policies/curity-phantom-token-inbound/schema.json +68 -0
- package/docs/policies/custom-code-inbound/doc.md +267 -0
- package/docs/policies/custom-code-inbound/intro.md +2 -0
- package/docs/policies/custom-code-inbound/schema.json +48 -0
- package/docs/policies/custom-code-outbound/doc.md +235 -0
- package/docs/policies/custom-code-outbound/intro.md +2 -0
- package/docs/policies/custom-code-outbound/schema.json +43 -0
- package/docs/policies/firebase-jwt-inbound/intro.md +6 -0
- package/docs/policies/firebase-jwt-inbound/schema.json +68 -0
- package/docs/policies/formdata-to-json-inbound/schema.json +60 -0
- package/docs/policies/galileo-tracing-inbound/schema.json +65 -0
- package/docs/policies/geo-filter-inbound/doc.md +33 -0
- package/docs/policies/geo-filter-inbound/schema.json +108 -0
- package/docs/policies/graphql-complexity-limit-inbound/doc.md +48 -0
- package/docs/policies/graphql-complexity-limit-inbound/intro.md +2 -0
- package/docs/policies/graphql-complexity-limit-inbound/schema.json +90 -0
- package/docs/policies/graphql-disable-introspection-inbound/doc.md +66 -0
- package/docs/policies/graphql-disable-introspection-inbound/intro.md +15 -0
- package/docs/policies/graphql-disable-introspection-inbound/schema.json +48 -0
- package/docs/policies/graphql-introspection-filter-outbound/doc.md +148 -0
- package/docs/policies/graphql-introspection-filter-outbound/schema.json +79 -0
- package/docs/policies/hmac-auth-inbound/doc.md +30 -0
- package/docs/policies/hmac-auth-inbound/intro.md +10 -0
- package/docs/policies/hmac-auth-inbound/policy.ts +70 -0
- package/docs/policies/hmac-auth-inbound/schema.json +53 -0
- package/docs/policies/http-deprecation-outbound/doc.md +73 -0
- package/docs/policies/http-deprecation-outbound/schema.json +83 -0
- package/docs/policies/ip-restriction-inbound/intro.md +8 -0
- package/docs/policies/ip-restriction-inbound/policy.ts +40 -0
- package/docs/policies/ip-restriction-inbound/schema.json +58 -0
- package/docs/policies/jwt-scopes-inbound/schema.json +59 -0
- package/docs/policies/ldap-auth-inbound/schema.json +56 -0
- package/docs/policies/mock-api-inbound/schema.json +72 -0
- package/docs/policies/moesif-inbound/doc.md +44 -0
- package/docs/policies/moesif-inbound/intro.md +6 -0
- package/docs/policies/moesif-inbound/schema.json +68 -0
- package/docs/policies/monetization-inbound/doc.md +87 -0
- package/docs/policies/monetization-inbound/intro.md +6 -0
- package/docs/policies/monetization-inbound/schema.json +102 -0
- package/docs/policies/mtls-auth-inbound/intro.md +6 -0
- package/docs/policies/mtls-auth-inbound/schema.json +68 -0
- package/docs/policies/okta-fga-authz-inbound/doc.md +181 -0
- package/docs/policies/okta-fga-authz-inbound/intro.md +20 -0
- package/docs/policies/okta-fga-authz-inbound/schema.json +104 -0
- package/docs/policies/okta-jwt-auth-inbound/intro.md +7 -0
- package/docs/policies/okta-jwt-auth-inbound/schema.json +74 -0
- package/docs/policies/open-id-jwt-auth-inbound/doc.md +58 -0
- package/docs/policies/open-id-jwt-auth-inbound/intro.md +30 -0
- package/docs/policies/open-id-jwt-auth-inbound/schema.json +128 -0
- package/docs/policies/openfga-authz-inbound/doc.md +207 -0
- package/docs/policies/openfga-authz-inbound/intro.md +17 -0
- package/docs/policies/openfga-authz-inbound/schema.json +191 -0
- package/docs/policies/openmeter-inbound/doc.md +163 -0
- package/docs/policies/openmeter-inbound/intro.md +18 -0
- package/docs/policies/openmeter-inbound/schema.json +183 -0
- package/docs/policies/prompt-injection-outbound/doc.md +106 -0
- package/docs/policies/prompt-injection-outbound/intro.md +4 -0
- package/docs/policies/prompt-injection-outbound/schema.json +74 -0
- package/docs/policies/propel-auth-jwt-inbound/doc.md +88 -0
- package/docs/policies/propel-auth-jwt-inbound/intro.md +4 -0
- package/docs/policies/propel-auth-jwt-inbound/schema.json +74 -0
- package/docs/policies/query-param-to-header-inbound/doc.md +70 -0
- package/docs/policies/query-param-to-header-inbound/intro.md +5 -0
- package/docs/policies/query-param-to-header-inbound/schema.json +74 -0
- package/docs/policies/quota-inbound/doc.md +235 -0
- package/docs/policies/quota-inbound/intro.md +7 -0
- package/docs/policies/quota-inbound/schema.json +133 -0
- package/docs/policies/rate-limit-inbound/doc.md +78 -0
- package/docs/policies/rate-limit-inbound/intro.md +30 -0
- package/docs/policies/rate-limit-inbound/schema.json +134 -0
- package/docs/policies/rbac-policy-inbound/intro.md +3 -0
- package/docs/policies/rbac-policy-inbound/policy.ts +42 -0
- package/docs/policies/rbac-policy-inbound/schema.json +52 -0
- package/docs/policies/readme-metrics-inbound/doc.md +1 -0
- package/docs/policies/readme-metrics-inbound/intro.md +3 -0
- package/docs/policies/readme-metrics-inbound/schema.json +84 -0
- package/docs/policies/remove-headers-inbound/schema.json +59 -0
- package/docs/policies/remove-headers-outbound/schema.json +59 -0
- package/docs/policies/remove-query-params-inbound/schema.json +59 -0
- package/docs/policies/replace-string-outbound/schema.json +69 -0
- package/docs/policies/request-size-limit-inbound/schema.json +60 -0
- package/docs/policies/request-validation-inbound/doc.md +72 -0
- package/docs/policies/request-validation-inbound/intro.md +24 -0
- package/docs/policies/request-validation-inbound/schema.json +98 -0
- package/docs/policies/require-origin-inbound/intro.md +12 -0
- package/docs/policies/require-origin-inbound/schema.json +65 -0
- package/docs/policies/secret-masking-outbound/doc.md +41 -0
- package/docs/policies/secret-masking-outbound/intro.md +13 -0
- package/docs/policies/secret-masking-outbound/schema.json +65 -0
- package/docs/policies/semantic-cache-inbound/doc.md +63 -0
- package/docs/policies/semantic-cache-inbound/intro.md +4 -0
- package/docs/policies/semantic-cache-inbound/schema.json +179 -0
- package/docs/policies/set-body-inbound/intro.md +7 -0
- package/docs/policies/set-body-inbound/schema.json +56 -0
- package/docs/policies/set-headers-inbound/doc.md +41 -0
- package/docs/policies/set-headers-inbound/intro.md +2 -0
- package/docs/policies/set-headers-inbound/schema.json +83 -0
- package/docs/policies/set-headers-outbound/schema.json +83 -0
- package/docs/policies/set-query-params-inbound/schema.json +83 -0
- package/docs/policies/set-status-outbound/schema.json +62 -0
- package/docs/policies/sleep-inbound/schema.json +56 -0
- package/docs/policies/stripe-webhook-verification-inbound/intro.md +2 -0
- package/docs/policies/stripe-webhook-verification-inbound/schema.json +60 -0
- package/docs/policies/supabase-jwt-auth-inbound/doc.md +29 -0
- package/docs/policies/supabase-jwt-auth-inbound/intro.md +12 -0
- package/docs/policies/supabase-jwt-auth-inbound/schema.json +86 -0
- package/docs/policies/transform-body-inbound/intro.md +8 -0
- package/docs/policies/transform-body-inbound/policy.ts +16 -0
- package/docs/policies/transform-body-inbound/schema.json +27 -0
- package/docs/policies/transform-body-outbound/intro.md +8 -0
- package/docs/policies/transform-body-outbound/policy.ts +19 -0
- package/docs/policies/transform-body-outbound/schema.json +27 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/doc.md +82 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/intro.md +20 -0
- package/docs/policies/upstream-azure-ad-service-auth-inbound/schema.json +84 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/intro.md +10 -0
- package/docs/policies/upstream-firebase-admin-auth-inbound/schema.json +68 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/intro.md +2 -0
- package/docs/policies/upstream-firebase-user-auth-inbound/schema.json +113 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/doc.md +139 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/intro.md +21 -0
- package/docs/policies/upstream-gcp-federated-auth-inbound/schema.json +96 -0
- package/docs/policies/upstream-gcp-jwt-inbound/intro.md +10 -0
- package/docs/policies/upstream-gcp-jwt-inbound/schema.json +62 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/doc.md +132 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/intro.md +25 -0
- package/docs/policies/upstream-gcp-service-auth-inbound/schema.json +95 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/doc.md +213 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/intro.md +16 -0
- package/docs/policies/upstream-zuplo-jwt-auth-inbound/schema.json +101 -0
- package/docs/policies/validate-json-schema-inbound/doc.md +129 -0
- package/docs/policies/validate-json-schema-inbound/intro.md +7 -0
- package/docs/policies/validate-json-schema-inbound/schema.json +56 -0
- package/docs/policies/web-bot-auth-inbound/doc.md +104 -0
- package/docs/policies/web-bot-auth-inbound/intro.md +16 -0
- package/docs/policies/web-bot-auth-inbound/schema.json +76 -0
- package/docs/policies/xml-to-json-outbound/doc.md +71 -0
- package/docs/policies/xml-to-json-outbound/intro.md +4 -0
- package/docs/policies/xml-to-json-outbound/schema.json +117 -0
- package/docs/programmable-api/audit-log.mdx +74 -0
- package/docs/programmable-api/background-dispatcher.mdx +124 -0
- package/docs/programmable-api/background-loader.mdx +104 -0
- package/docs/programmable-api/cache.mdx +186 -0
- package/docs/programmable-api/compatibility-dates.mdx +201 -0
- package/docs/programmable-api/console-logging.mdx +48 -0
- package/docs/programmable-api/context-data.mdx +127 -0
- package/docs/programmable-api/custom-cors-policy.mdx +64 -0
- package/docs/programmable-api/environment.mdx +328 -0
- package/docs/programmable-api/hooks.mdx +569 -0
- package/docs/programmable-api/http-problems.mdx +385 -0
- package/docs/programmable-api/jwt-service-plugin.mdx +420 -0
- package/docs/programmable-api/logger.mdx +223 -0
- package/docs/programmable-api/memory-zone-read-through-cache.mdx +96 -0
- package/docs/programmable-api/node-modules.mdx +67 -0
- package/docs/programmable-api/not-found-handler.mdx +47 -0
- package/docs/programmable-api/oauth-protected-resource-plugin.mdx +46 -0
- package/docs/programmable-api/overview.mdx +213 -0
- package/docs/programmable-api/problem-response-formatter.mdx +183 -0
- package/docs/programmable-api/request-user.mdx +289 -0
- package/docs/programmable-api/reusing-code.mdx +26 -0
- package/docs/programmable-api/route-raw.mdx +55 -0
- package/docs/programmable-api/runtime-behaviors.mdx +25 -0
- package/docs/programmable-api/runtime-errors.mdx +246 -0
- package/docs/programmable-api/runtime-extensions.mdx +340 -0
- package/docs/programmable-api/safely-clone-a-request-or-response.mdx +57 -0
- package/docs/programmable-api/streaming-zone-cache.mdx +155 -0
- package/docs/programmable-api/web-crypto-apis.mdx +219 -0
- package/docs/programmable-api/web-standard-apis.mdx +109 -0
- package/docs/programmable-api/zone-cache.mdx +131 -0
- package/docs/programmable-api/zp-body-removed.mdx +32 -0
- package/docs/programmable-api/zuplo-context.mdx +414 -0
- package/docs/programmable-api/zuplo-id-token.mdx +90 -0
- package/docs/programmable-api/zuplo-json.mdx +91 -0
- package/docs/programmable-api/zuplo-request.mdx +200 -0
- package/docs/sample-apis.mdx +78 -0
- package/docs/self-hosted/overview.md +60 -0
- package/package.json +6 -5
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Performance Testing Your API Gateway
|
|
3
|
+
sidebar_label: Performance Testing
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- vale Vale.Spelling["Blazemeter","JMeter","wrk"] = NO -->
|
|
7
|
+
|
|
8
|
+
Performance testing is critical for understanding the real-world performance of
|
|
9
|
+
your API when using an API gateway like Zuplo. This guide helps you create fair
|
|
10
|
+
and accurate performance tests that properly measure latency and throughput.
|
|
11
|
+
|
|
12
|
+
## Creating Fair Comparison Tests
|
|
13
|
+
|
|
14
|
+
When evaluating API gateway performance, it's essential to ensure your tests
|
|
15
|
+
accurately reflect real-world conditions and provide a fair comparison between
|
|
16
|
+
direct backend calls and calls through your gateway.
|
|
17
|
+
|
|
18
|
+
### Test Location Matters
|
|
19
|
+
|
|
20
|
+
One of the most common mistakes in performance testing is running tests from
|
|
21
|
+
within the same cloud provider network as your backend. This creates
|
|
22
|
+
artificially low latency results that don't reflect real-world usage.
|
|
23
|
+
|
|
24
|
+
:::warning
|
|
25
|
+
|
|
26
|
+
Never run performance tests from the same cloud provider as your backend. If
|
|
27
|
+
your backend runs on AWS, don't test from AWS. The same applies to GCP, Azure,
|
|
28
|
+
or any other provider. If you are using a third-party tool such as K8 or
|
|
29
|
+
Blazemeter, be sure to check where their test nodes are located.
|
|
30
|
+
|
|
31
|
+
:::
|
|
32
|
+
|
|
33
|
+
**Why this matters:** When traffic stays within a cloud provider's network,
|
|
34
|
+
latency is dramatically reduced and more consistent, especially within the same
|
|
35
|
+
geographical region. Intra-cloud network latency benefits from:
|
|
36
|
+
|
|
37
|
+
- Dedicated high-speed interconnects between data centers
|
|
38
|
+
- Optimized routing within the provider's backbone
|
|
39
|
+
- Minimal network hops
|
|
40
|
+
- Consistent, predictable performance with low jitter
|
|
41
|
+
|
|
42
|
+
You can see real-world latency differences using tools like:
|
|
43
|
+
|
|
44
|
+
- [AWS CloudPing](https://www.cloudping.co/) - Shows inter-region latency for
|
|
45
|
+
AWS
|
|
46
|
+
- [Google Cloud Network Intelligence Center](https://cloud.google.com/network-intelligence-center/docs/performance-dashboard/how-to/view-google-cloud-latency) -
|
|
47
|
+
Provides detailed GCP network performance metrics
|
|
48
|
+
|
|
49
|
+
The difference is stark: intra-cloud latency within the same region (for
|
|
50
|
+
example, within North America) can be 50-70% lower than traffic traversing the
|
|
51
|
+
public internet or between different cloud providers. Additionally, internet
|
|
52
|
+
traffic experiences significantly higher jitter (variance), making response
|
|
53
|
+
times less predictable.
|
|
54
|
+
|
|
55
|
+
This artificial performance boost from testing within the same cloud provider
|
|
56
|
+
can make it appear that an API gateway adds substantially more latency than it
|
|
57
|
+
actually does in real-world scenarios where traffic crosses network boundaries.
|
|
58
|
+
|
|
59
|
+
### Ensure Test Equality
|
|
60
|
+
|
|
61
|
+
Fair comparisons require testing under identical conditions. Here are the key
|
|
62
|
+
factors to consider:
|
|
63
|
+
|
|
64
|
+
#### Authentication Methods
|
|
65
|
+
|
|
66
|
+
Different authentication methods have different performance characteristics. If
|
|
67
|
+
you're testing:
|
|
68
|
+
|
|
69
|
+
- **Backend with IAM/JWT:** Processing time varies but is typically minimal for
|
|
70
|
+
JWT validation
|
|
71
|
+
- **Zuplo with API Key authentication:** Adds approximately 5-10ms for key
|
|
72
|
+
validation
|
|
73
|
+
|
|
74
|
+
To ensure fair testing, use the same authentication method for both tests, or
|
|
75
|
+
account for the difference in your analysis.
|
|
76
|
+
|
|
77
|
+
#### Request Parameters and Payloads
|
|
78
|
+
|
|
79
|
+
Always use identical:
|
|
80
|
+
|
|
81
|
+
- Request headers
|
|
82
|
+
- Query parameters
|
|
83
|
+
- Request body size and complexity
|
|
84
|
+
- Response size expectations
|
|
85
|
+
|
|
86
|
+
#### Scaling Patterns
|
|
87
|
+
|
|
88
|
+
Test both your backend and gateway-fronted API with the same:
|
|
89
|
+
|
|
90
|
+
- Ramp-up patterns
|
|
91
|
+
- Concurrent connection counts
|
|
92
|
+
- Request rates
|
|
93
|
+
- Test duration
|
|
94
|
+
|
|
95
|
+
### Account for Additional Layers
|
|
96
|
+
|
|
97
|
+
Your architecture may include additional layers that affect performance:
|
|
98
|
+
|
|
99
|
+
- **CDN (CloudFlare, Fastly, etc.):** Adds 5-15ms for cache misses
|
|
100
|
+
- **WAF (Web Application Firewall):** Adds 10-20ms depending on rule complexity
|
|
101
|
+
- **DDoS Protection:** Usually minimal impact (1-5ms) unless under attack
|
|
102
|
+
- **Load Balancers:** Adds 1-5ms
|
|
103
|
+
|
|
104
|
+
Include these layers in both test scenarios or explicitly account for their
|
|
105
|
+
impact in your analysis.
|
|
106
|
+
|
|
107
|
+
## Understanding Gateway Latency
|
|
108
|
+
|
|
109
|
+
API gateways necessarily add some latency to process requests. For Zuplo:
|
|
110
|
+
|
|
111
|
+
- **Base latency:** Approximately 20-30ms with no policies
|
|
112
|
+
- **Per policy:** Most policies add 1-5ms each
|
|
113
|
+
- **Complex policies:** Authentication, rate limiting, or custom code can add
|
|
114
|
+
5-15ms
|
|
115
|
+
|
|
116
|
+
This latency is the trade-off for the benefits an API gateway provides:
|
|
117
|
+
|
|
118
|
+
- Centralized authentication and authorization
|
|
119
|
+
- Rate limiting and quota management
|
|
120
|
+
- Request/response transformation
|
|
121
|
+
- Analytics and monitoring
|
|
122
|
+
- Developer portal and documentation
|
|
123
|
+
|
|
124
|
+
## Policy Impact on Performance
|
|
125
|
+
|
|
126
|
+
Different policies have varying performance impacts:
|
|
127
|
+
|
|
128
|
+
### Low Impact (0-3ms)
|
|
129
|
+
|
|
130
|
+
- Header manipulation
|
|
131
|
+
- Simple request validation
|
|
132
|
+
- Basic routing rules
|
|
133
|
+
- Response caching (for cache hits)
|
|
134
|
+
|
|
135
|
+
### Medium Impact (3-10ms)
|
|
136
|
+
|
|
137
|
+
- API key authentication (Varies depending on cache hits/replication)
|
|
138
|
+
- Rate limiting checks (0ms with asynchronous mode)
|
|
139
|
+
- Request/response logging
|
|
140
|
+
- Simple transformations
|
|
141
|
+
|
|
142
|
+
### Higher Impact (10-20ms)
|
|
143
|
+
|
|
144
|
+
- Large payload transformations
|
|
145
|
+
- Custom code that makes external calls
|
|
146
|
+
|
|
147
|
+
:::tip
|
|
148
|
+
|
|
149
|
+
For optimal performance, order your policies from least to most expensive, and
|
|
150
|
+
use early-exit conditions where possible. For example, validate API keys before
|
|
151
|
+
performing complex transformations.
|
|
152
|
+
|
|
153
|
+
:::
|
|
154
|
+
|
|
155
|
+
## Performance Testing Best Practices
|
|
156
|
+
|
|
157
|
+
### 1. Choose the Right Testing Tool
|
|
158
|
+
|
|
159
|
+
Use professional load testing tools that can:
|
|
160
|
+
|
|
161
|
+
- Generate consistent load patterns
|
|
162
|
+
- Measure percentile latencies (p50, p95, p99)
|
|
163
|
+
- Handle connection pooling properly
|
|
164
|
+
- Report detailed metrics
|
|
165
|
+
|
|
166
|
+
Recommended tools:
|
|
167
|
+
|
|
168
|
+
- [k6](https://k6.io/) - Modern load testing tool with excellent reporting
|
|
169
|
+
- [Apache JMeter](https://jmeter.apache.org/) - Comprehensive but complex
|
|
170
|
+
- [Gatling](https://gatling.io/) - High-performance testing framework
|
|
171
|
+
- [wrk](https://github.com/wg/wrk) - Simple but powerful for basic tests
|
|
172
|
+
|
|
173
|
+
### 2. Test from Multiple Locations
|
|
174
|
+
|
|
175
|
+
Run tests from various geographic locations to understand global performance:
|
|
176
|
+
|
|
177
|
+
- Use cloud providers different from your backend
|
|
178
|
+
- Test from regions where your users are located
|
|
179
|
+
- Consider using distributed load testing services
|
|
180
|
+
|
|
181
|
+
### 3. Measure the Right Metrics
|
|
182
|
+
|
|
183
|
+
Focus on metrics that matter:
|
|
184
|
+
|
|
185
|
+
- **Latency percentiles:** p50, p95, p99 (not just averages)
|
|
186
|
+
- **Throughput:** Requests per second at various concurrency levels
|
|
187
|
+
- **Error rates:** Both 4xx and 5xx responses
|
|
188
|
+
- **Time to first byte (TTFB)**
|
|
189
|
+
- **Total request time**
|
|
190
|
+
|
|
191
|
+
### 4. Test Realistic Scenarios
|
|
192
|
+
|
|
193
|
+
Design tests that reflect actual usage:
|
|
194
|
+
|
|
195
|
+
- Mix of different endpoints
|
|
196
|
+
- Realistic payload sizes
|
|
197
|
+
- Actual authentication flows
|
|
198
|
+
- Expected traffic patterns (steady, burst, ramp-up)
|
|
199
|
+
|
|
200
|
+
## Interpreting Results
|
|
201
|
+
|
|
202
|
+
When analyzing your performance test results:
|
|
203
|
+
|
|
204
|
+
1. **Compare percentiles, not averages:** p95 and p99 latencies better represent
|
|
205
|
+
user experience
|
|
206
|
+
2. **Account for geographic distribution:** Users farther from your
|
|
207
|
+
infrastructure will see higher latency
|
|
208
|
+
3. **Look for anomalies:** Sudden spikes might indicate rate limiting or
|
|
209
|
+
capacity issues
|
|
210
|
+
|
|
211
|
+
:::note
|
|
212
|
+
|
|
213
|
+
Remember that Zuplo's edge deployment means your API is served from locations
|
|
214
|
+
globally, which can actually reduce latency for geographically distributed users
|
|
215
|
+
compared to a single-region backend.
|
|
216
|
+
|
|
217
|
+
:::
|
|
218
|
+
|
|
219
|
+
## Optimizing for Intra-Cloud Traffic
|
|
220
|
+
|
|
221
|
+
If your primary use case involves API traffic that stays within a particular
|
|
222
|
+
cloud provider's network, consider Zuplo's
|
|
223
|
+
[Managed Dedicated deployment](/docs/dedicated/overview.mdx) options. With
|
|
224
|
+
Managed Dedicated, Zuplo can be deployed directly to:
|
|
225
|
+
|
|
226
|
+
- Your chosen cloud provider (AWS, GCP, Azure, etc.)
|
|
227
|
+
- Your specific regions
|
|
228
|
+
- Your VPC or private network configurations
|
|
229
|
+
|
|
230
|
+
This deployment model provides:
|
|
231
|
+
|
|
232
|
+
- **Minimal latency:** Your API gateway runs in the same cloud network as your
|
|
233
|
+
backend
|
|
234
|
+
- **Predictable performance:** Consistent sub-10ms latency for intra-region
|
|
235
|
+
traffic
|
|
236
|
+
- **Network isolation:** Traffic never leaves your cloud provider's backbone
|
|
237
|
+
- **Compliance benefits:** Data remains within your controlled infrastructure
|
|
238
|
+
|
|
239
|
+
Managed Dedicated is ideal for organizations with:
|
|
240
|
+
|
|
241
|
+
- High-volume internal API traffic
|
|
242
|
+
- Strict latency requirements for service-to-service communication
|
|
243
|
+
- Regulatory requirements for data locality
|
|
244
|
+
- Existing investments in specific cloud providers
|
|
245
|
+
|
|
246
|
+
:::tip
|
|
247
|
+
|
|
248
|
+
For most use cases, where API traffic comes from multiple providers, networks,
|
|
249
|
+
and geographic locations (mobile apps, web applications, third-party
|
|
250
|
+
integrations), Zuplo's edge-deployed instances typically provide better overall
|
|
251
|
+
performance. Edge deployment ensures your API is served from locations closest
|
|
252
|
+
to your users globally, reducing latency for the majority of real-world traffic
|
|
253
|
+
patterns.
|
|
254
|
+
|
|
255
|
+
:::
|
|
256
|
+
|
|
257
|
+
## Cold Starts (Managed Edge Deployments Only)
|
|
258
|
+
|
|
259
|
+
:::note
|
|
260
|
+
|
|
261
|
+
This section applies only to Zuplo's managed edge (serverless) deployment. If
|
|
262
|
+
you're running Zuplo in a dedicated environment, cold starts don't apply.
|
|
263
|
+
|
|
264
|
+
:::
|
|
265
|
+
|
|
266
|
+
Zuplo's serverless platform automatically scales to handle any load, from zero
|
|
267
|
+
to billions of requests. However, the first requests after a period of
|
|
268
|
+
inactivity may experience "cold starts."
|
|
269
|
+
|
|
270
|
+
### Understanding Cold Starts
|
|
271
|
+
|
|
272
|
+
- **Initial latency:** First request may be 100-200ms slower
|
|
273
|
+
- **Node lifecycle:** Once warm, nodes can serve requests for hours or days
|
|
274
|
+
- **Scaling behavior:** New nodes spin up automatically based on traffic
|
|
275
|
+
|
|
276
|
+
### Testing with Cold Starts
|
|
277
|
+
|
|
278
|
+
To accurately test performance:
|
|
279
|
+
|
|
280
|
+
1. **Run a warm-up phase:** Send 100-1000 requests before measuring
|
|
281
|
+
2. **Measure steady-state:** After warm-up, measure consistent performance
|
|
282
|
+
3. **Test scaling:** Gradually increase load to observe scaling behavior
|
|
283
|
+
4. **Account for real-world patterns:** Most production APIs stay warm during
|
|
284
|
+
business hours
|
|
285
|
+
|
|
286
|
+
:::tip
|
|
287
|
+
|
|
288
|
+
For APIs with predictable traffic patterns, consider implementing a simple
|
|
289
|
+
keep-warm strategy using scheduled synthetic requests during low-traffic
|
|
290
|
+
periods.
|
|
291
|
+
|
|
292
|
+
:::
|
|
293
|
+
|
|
294
|
+
## Summary
|
|
295
|
+
|
|
296
|
+
Creating fair performance tests requires careful attention to test conditions,
|
|
297
|
+
understanding of network topology, and realistic expectations about API gateway
|
|
298
|
+
overhead. By following these guidelines, you'll get accurate measurements that
|
|
299
|
+
help you make informed decisions about your API architecture.
|
|
300
|
+
|
|
301
|
+
Remember: Zuplo typically adds only 20-30ms of latency for basic request
|
|
302
|
+
processing, with additional small increments for some policies. This overhead is
|
|
303
|
+
often offset by the operational benefits and can even result in better global
|
|
304
|
+
performance due to edge deployment.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Akamai API Security (AKA NONAME) plugin
|
|
3
|
+
sidebar_label: Akamai API Security
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This plugin pushes request/response data to Akamai API Security, formerly known
|
|
7
|
+
as "NONAME" API Security. It can also pull data from Akamai API Security to
|
|
8
|
+
actively block traffic based on the blocklist rules provided by Akamai API
|
|
9
|
+
Security; known as "Protection".
|
|
10
|
+
|
|
11
|
+
<EnterpriseFeature name="Custom logging" />
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
To get started, you'll need to configure the Zuplo Integration in Akamai API
|
|
16
|
+
Security. Once this step is completed you'll have a 'key' to allow us to connect
|
|
17
|
+
to Akamai API Security on your behalf.
|
|
18
|
+
|
|
19
|
+
In Zuplo you configure the plugin in the
|
|
20
|
+
[Runtime Extensions](../programmable-api/runtime-extensions.mdx) file
|
|
21
|
+
`zuplo.runtime.ts`, as follows:
|
|
22
|
+
|
|
23
|
+
```ts title="modules/zuplo.runtime.ts"
|
|
24
|
+
import {
|
|
25
|
+
environment,
|
|
26
|
+
AkamaiApiSecurityPlugin,
|
|
27
|
+
RuntimeExtensions,
|
|
28
|
+
ZuploContext,
|
|
29
|
+
ZuploRequest,
|
|
30
|
+
} from "@zuplo/runtime";
|
|
31
|
+
|
|
32
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
33
|
+
runtime.addPlugin(
|
|
34
|
+
new AkamaiApiSecurityPlugin({
|
|
35
|
+
hostname: "your-akamai-api-security-hostname.com",
|
|
36
|
+
// index, provided by Akamai API Security
|
|
37
|
+
index: 1,
|
|
38
|
+
// Key provided by Akamai API Security
|
|
39
|
+
key: environment.AKAMAI_API_SECURITY_KEY,
|
|
40
|
+
// Enable the active prevention/protection feature
|
|
41
|
+
enableProtection: true,
|
|
42
|
+
}),
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
It's recommended to store your key in an
|
|
48
|
+
[Environment Variable](./environment-variables.mdx) shown in the example above
|
|
49
|
+
`AKAMAI_API_SECURITY_KEY`. If you want the active protection feature enabled,
|
|
50
|
+
set `enableProtection` to `true`.
|
|
51
|
+
|
|
52
|
+
The plugin also supports an optional `shouldLog` parameter which is a function
|
|
53
|
+
that returns true or false and, if false, stops the request/response from
|
|
54
|
+
logging to Akamai API Security.
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
runtime.addPlugin(
|
|
58
|
+
new AkamaiApiSecurityPlugin({
|
|
59
|
+
hostname: "your-akamai-api-security-hostname.com",
|
|
60
|
+
// index, provided by Akamai API Security
|
|
61
|
+
index: 1,
|
|
62
|
+
// Key provided by Akamai API Security
|
|
63
|
+
key: environment.AKAMAI_API_SECURITY_KEY,
|
|
64
|
+
// Enable the active prevention/protection feature
|
|
65
|
+
enableProtection: true,
|
|
66
|
+
// optional filter function to exclude requests
|
|
67
|
+
shouldLog: async (request: ZuploRequest, context: ZuploContext) => {
|
|
68
|
+
if (request.headers.get("content-type") !== "application/json") {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return true;
|
|
73
|
+
},
|
|
74
|
+
}),
|
|
75
|
+
);
|
|
76
|
+
```
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Azure Blob Plugin
|
|
3
|
+
sidebar_label: Azure Blob
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This plugin pushes request/response logs to Azure Blob Storage. This can be used
|
|
7
|
+
to save request data generated by your API Gateway to use for monitoring,
|
|
8
|
+
analytics, auditing, or debugging purposes.
|
|
9
|
+
|
|
10
|
+
<EnterpriseFeature name="Custom logging" />
|
|
11
|
+
|
|
12
|
+
## Setup
|
|
13
|
+
|
|
14
|
+
You can define the fields created in the CSV by creating a custom type in
|
|
15
|
+
TypeScript and a function to extract the field data from the `Response`,
|
|
16
|
+
`ZuploRequest`, and `ZuploContext`.
|
|
17
|
+
|
|
18
|
+
The plugin is configured in the
|
|
19
|
+
[Runtime Extensions](../programmable-api/runtime-extensions.mdx) file
|
|
20
|
+
`zuplo.runtime.ts`:
|
|
21
|
+
|
|
22
|
+
```ts title="modules/zuplo.runtime.ts"
|
|
23
|
+
// The interface that describes the rows
|
|
24
|
+
// in the output
|
|
25
|
+
interface AzureBlobLogEntry {
|
|
26
|
+
timestamp: string;
|
|
27
|
+
method: string;
|
|
28
|
+
url: string;
|
|
29
|
+
status: number;
|
|
30
|
+
statusText: string;
|
|
31
|
+
sub: string | null;
|
|
32
|
+
contentLength: string | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Add the plugin - use a SAS URL
|
|
36
|
+
runtime.addPlugin(
|
|
37
|
+
new AzureBlobPlugin<AzureBlobLogEntry>({
|
|
38
|
+
sasUrl:
|
|
39
|
+
"https://YOUR_ACCOUNT.blob.core.windows.net/YOUR_CONTAINER?sv=2022-11-02&ss=b&srt=co&sp=wactfx&se=2045-11-17T13:50:53Z&st=2024-11-17T05:50:53Z&spr=https&sig=YOUR_SIG",
|
|
40
|
+
batchPeriodSeconds: 1,
|
|
41
|
+
generateLogEntry: (
|
|
42
|
+
response: Response,
|
|
43
|
+
request: ZuploRequest,
|
|
44
|
+
context: ZuploContext,
|
|
45
|
+
) => ({
|
|
46
|
+
// You can customize the log entry here by adding new fields
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
url: request.url,
|
|
49
|
+
method: request.method,
|
|
50
|
+
status: response.status,
|
|
51
|
+
statusText: response.statusText,
|
|
52
|
+
sub: request.user?.sub ?? null,
|
|
53
|
+
contentLength: request.headers.get("content-length"),
|
|
54
|
+
}),
|
|
55
|
+
}),
|
|
56
|
+
);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The plugin writes Block Blobs using SAS signatures. Ensure that your SAS URL has
|
|
60
|
+
the correct structure and contains the container name, and the SAS has the
|
|
61
|
+
appropriate permissions.
|
|
62
|
+
|
|
63
|
+
## Writing the response or request
|
|
64
|
+
|
|
65
|
+
Writing the full request or response body can be expensive but is supported.
|
|
66
|
+
Alternatively, you may want to parse the body for a particular property to log,
|
|
67
|
+
in this case it's important that the request or response is cloned so that the
|
|
68
|
+
stream is available for the response.
|
|
69
|
+
|
|
70
|
+
Also, note that the `generateLogEntry` function will be called **after** the
|
|
71
|
+
request stream has been read. So if you need to read the request, you will need
|
|
72
|
+
to store the cloned response before it reaches the request handler and store it,
|
|
73
|
+
ideally using [ContextData](../programmable-api/context-data.mdx).
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Azure Event Hubs Request Logger Plugin
|
|
3
|
+
sidebar_label: Azure Event Hubs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This plugin pushes request/response logs to Azure Event Hubs. This can be used
|
|
7
|
+
to stream the request data generated by your API Gateway to use for monitoring,
|
|
8
|
+
analytics, auditing, or debugging purposes.
|
|
9
|
+
|
|
10
|
+
<EnterpriseFeature name="Custom logging" />
|
|
11
|
+
|
|
12
|
+
## Setup
|
|
13
|
+
|
|
14
|
+
You can define the fields created in the JSON object by creating a custom type
|
|
15
|
+
in TypeScript and a function to extract the field data from the `Response`,
|
|
16
|
+
`ZuploRequest`, and `ZuploContext`.
|
|
17
|
+
|
|
18
|
+
The plugin is configured in the
|
|
19
|
+
[Runtime Extensions](../programmable-api/runtime-extensions.mdx) file
|
|
20
|
+
`zuplo.runtime.ts`: git sta
|
|
21
|
+
|
|
22
|
+
```ts title="modules/zuplo.runtime.ts"
|
|
23
|
+
// The interface that describes the rows
|
|
24
|
+
// in the output
|
|
25
|
+
interface LogEntry {
|
|
26
|
+
timestamp: string;
|
|
27
|
+
method: string;
|
|
28
|
+
url: string;
|
|
29
|
+
status: number;
|
|
30
|
+
statusText: string;
|
|
31
|
+
sub: string | null;
|
|
32
|
+
contentLength: string | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Add the plugin
|
|
36
|
+
runtime.addPlugin(
|
|
37
|
+
new AzureEventHubsRequestLoggerPlugin<LogEntry>({
|
|
38
|
+
connectionString: environment.AZURE_EVENT_HUBS_CONNECTION_STRING,
|
|
39
|
+
// for example "Endpoint=sb://your-namespace.servicebus.windows.net/;SharedAccessKeyName=key-name;SharedAccessKey=YOUR_SHARED_ACCESS_KEY"
|
|
40
|
+
batchPeriodSeconds: 1,
|
|
41
|
+
entityPath: "your-event-hub-name",
|
|
42
|
+
generateLogEntry: (response: Response, request: ZuploRequest) => ({
|
|
43
|
+
// You can customize the log entry here by adding new fields
|
|
44
|
+
timestamp: new Date().toISOString(),
|
|
45
|
+
url: request.url,
|
|
46
|
+
method: request.method,
|
|
47
|
+
status: response.status,
|
|
48
|
+
statusText: response.statusText,
|
|
49
|
+
sub: request.user?.sub ?? null,
|
|
50
|
+
contentLength: request.headers.get("content-length"),
|
|
51
|
+
}),
|
|
52
|
+
}),
|
|
53
|
+
);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The configuration requires a `connectionString` which you can get from the Azure
|
|
57
|
+
portal "Shared access policies" section in Event Hubs. If the connection string
|
|
58
|
+
contains an EntityPath property the separate `entityPath` option to define the
|
|
59
|
+
event hub's name isn't required.
|
|
60
|
+
|
|
61
|
+
Entries will be batched and sent as an array, they will be sent every
|
|
62
|
+
`batchPeriodSeconds`. If not specified it will be sent very frequently (~every
|
|
63
|
+
10ms) to avoid data loss. Note that `batchPeriodSeconds` can be specified as a
|
|
64
|
+
fraction, for example `0.1` for every 100ms.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Hydrolix / Akamai Traffic Peak Plugin
|
|
3
|
+
sidebar_label: Hydrolix / Traffic Peak
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This plugin pushes request/response logs to Hydrolix AKA Akamai Traffic Peak.
|
|
7
|
+
|
|
8
|
+
<EnterpriseFeature name="Custom logging" />
|
|
9
|
+
|
|
10
|
+
## Setup
|
|
11
|
+
|
|
12
|
+
You can define the fields created in the JSON object by creating a custom type
|
|
13
|
+
in TypeScript and a function to extract the field data from the `Response`,
|
|
14
|
+
`ZuploRequest`, and `ZuploContext`.
|
|
15
|
+
|
|
16
|
+
The plugin is configured in the
|
|
17
|
+
[Runtime Extensions](../programmable-api/runtime-extensions.mdx) file
|
|
18
|
+
`zuplo.runtime.ts`:
|
|
19
|
+
|
|
20
|
+
This logger includes a default type and function that logs the following fields:
|
|
21
|
+
|
|
22
|
+
- **deploymentName** <CodeType>string</CodeType> - The name of the deployment.
|
|
23
|
+
- **timestamp** <CodeType>string</CodeType> - The time the log was created.
|
|
24
|
+
- **requestId** <CodeType>string</CodeType> - The UUID of the request (the value
|
|
25
|
+
of the `zp-rid` header).
|
|
26
|
+
- **routePath** <CodeType>string</CodeType> - The path of the route.
|
|
27
|
+
- **operationId** <CodeType>string | undefined</CodeType> - The operation ID.
|
|
28
|
+
- **url** <CodeType>string | undefined</CodeType> - The URL of the request.
|
|
29
|
+
- **statusCode** <CodeType>number | undefined</CodeType> - The status code of
|
|
30
|
+
the response.
|
|
31
|
+
- **durationMs** <CodeType>number | undefined</CodeType> - The duration of the
|
|
32
|
+
request in milliseconds.
|
|
33
|
+
- **method** <CodeType>string</CodeType> - The HTTP method of the request.
|
|
34
|
+
- **userSub** <CodeType>string | undefined</CodeType> - The user sub.
|
|
35
|
+
- **instanceId** <CodeType>string | undefined</CodeType> - The instance ID.
|
|
36
|
+
- **colo** <CodeType>string | undefined</CodeType> - The data center of the
|
|
37
|
+
request.
|
|
38
|
+
- **city** <CodeType>string | undefined</CodeType> - The city the request
|
|
39
|
+
origin.
|
|
40
|
+
- **country** <CodeType>string | undefined</CodeType> - The country the request
|
|
41
|
+
origin.
|
|
42
|
+
- **continent** <CodeType>string | undefined</CodeType> - The continent the
|
|
43
|
+
request origin.
|
|
44
|
+
- **latitude** <CodeType>string | undefined</CodeType> - The latitude of the
|
|
45
|
+
request origin.
|
|
46
|
+
- **longitude** <CodeType>string | undefined</CodeType> - The longitude of the
|
|
47
|
+
request origin.
|
|
48
|
+
- **postalCode** <CodeType>string | undefined</CodeType> - The postal code of
|
|
49
|
+
the request origin.
|
|
50
|
+
- **metroCode** <CodeType>string | undefined</CodeType> - The metro code of the
|
|
51
|
+
request origin.
|
|
52
|
+
- **region** <CodeType>string | undefined</CodeType> - The region of the request
|
|
53
|
+
origin.
|
|
54
|
+
- **regionCode** <CodeType>string | undefined</CodeType> - The region code of
|
|
55
|
+
the request origin.
|
|
56
|
+
- **timezone** <CodeType>string | undefined</CodeType> - The timezone of the
|
|
57
|
+
request origin.
|
|
58
|
+
- **asn** <CodeType>string | undefined</CodeType> - The ASN of the request
|
|
59
|
+
origin.
|
|
60
|
+
- **asOrganization** <CodeType>string | undefined</CodeType> - The AS
|
|
61
|
+
organization of the request origin.
|
|
62
|
+
- **clientIP** <CodeType>string | undefined</CodeType> - The client IP of the
|
|
63
|
+
requester.
|
|
64
|
+
- **zuploUserAgent** <CodeType>string | undefined</CodeType> - The Zuplo user
|
|
65
|
+
agent.
|
|
66
|
+
|
|
67
|
+
To use this default setup add the following code to your `zuplo.runtime.ts`
|
|
68
|
+
file:
|
|
69
|
+
|
|
70
|
+
```ts title="modules/zuplo.runtime.ts"
|
|
71
|
+
import {
|
|
72
|
+
defaultGenerateHydrolixEntry,
|
|
73
|
+
environment,
|
|
74
|
+
HydrolixDefaultEntry,
|
|
75
|
+
HydrolixRequestLoggerPlugin,
|
|
76
|
+
RuntimeExtensions,
|
|
77
|
+
} from "@zuplo/runtime";
|
|
78
|
+
|
|
79
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
80
|
+
runtime.addPlugin(
|
|
81
|
+
new HydrolixRequestLoggerPlugin<HydrolixDefaultEntry>({
|
|
82
|
+
hostname: "your-hydrolix-hostname.com",
|
|
83
|
+
username: "your-hydrolix-username",
|
|
84
|
+
password: environment.HYDROLIX_PASSWORD,
|
|
85
|
+
token: environment.HYDROLIX_TOKEN,
|
|
86
|
+
table: "your-table.name",
|
|
87
|
+
transform: "your-transform-name",
|
|
88
|
+
generateLogEntry: defaultGenerateHydrolixEntry,
|
|
89
|
+
}),
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Note, the `token` (HYDROLIX_TOKEN above) is a
|
|
95
|
+
[Streaming Auth Token](https://docs.hydrolix.io/docs/stream-authentication).
|
|
96
|
+
|
|
97
|
+
If you want to customize the data written to Hydrolix, you can define the fields
|
|
98
|
+
and entry generation function yourself as follows:
|
|
99
|
+
|
|
100
|
+
```ts title="modules/zuplo.runtime.ts"
|
|
101
|
+
import {
|
|
102
|
+
ZuploRequest,
|
|
103
|
+
HydrolixRequestLoggerPlugin,
|
|
104
|
+
environment,
|
|
105
|
+
} from "@zuplo/runtime";
|
|
106
|
+
|
|
107
|
+
// The interface that describes the rows
|
|
108
|
+
// in the output
|
|
109
|
+
interface LogEntry {
|
|
110
|
+
timestamp: string;
|
|
111
|
+
method: string;
|
|
112
|
+
url: string;
|
|
113
|
+
status: number;
|
|
114
|
+
statusText: string;
|
|
115
|
+
sub: string | null;
|
|
116
|
+
contentLength: string | null;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function runtimeInit(runtime: RuntimeExtensions) {
|
|
120
|
+
runtime.addPlugin(
|
|
121
|
+
new HydrolixRequestLoggerPlugin<LogEntry>({
|
|
122
|
+
hostname: "your-hydrolix-hostname.com",
|
|
123
|
+
username: "your-hydrolix-username",
|
|
124
|
+
password: environment.HYDROLIX_PASSWORD,
|
|
125
|
+
token: environment.HYDROLIX_TOKEN,
|
|
126
|
+
table: "your-table.name",
|
|
127
|
+
transform: "your-transform-name",
|
|
128
|
+
batchPeriodSeconds: 0.1,
|
|
129
|
+
generateLogEntry: (response: Response, request: ZuploRequest) => ({
|
|
130
|
+
// You can customize the log entry here by adding new fields
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
url: request.url,
|
|
133
|
+
method: request.method,
|
|
134
|
+
status: response.status,
|
|
135
|
+
statusText: response.statusText,
|
|
136
|
+
sub: request.user?.sub ?? null,
|
|
137
|
+
contentLength: request.headers.get("content-length"),
|
|
138
|
+
}),
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Entries will be batched and sent as an array, they will be sent every
|
|
145
|
+
`batchPeriodSeconds`. If not specified the will be dispatched very frequently
|
|
146
|
+
(~every 10ms) to avoid data loss. Note that `batchPeriodSeconds` can be
|
|
147
|
+
specified as a fraction, for example `0.1` for every 100ms.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Policy Fundamentals
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Policies are modules that can intercept an incoming request or outgoing
|
|
6
|
+
response. You can have multiple policies and apply them to multiple routes.
|
|
7
|
+
There are built-in policies but of course, being a developer-focused platform
|
|
8
|
+
you can easily create custom policies.
|
|
9
|
+
|
|
10
|
+
## How policies work
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
14
|
+
An `inbound` policy can intercept a request and modify the request before it
|
|
15
|
+
reaches the request handler (or the next policy). It can also short-circuit the
|
|
16
|
+
whole request lifecycle and immediately respond to the client.
|
|
17
|
+
|
|
18
|
+
An `outbound` policy intercepts the response from your request handler, allowing
|
|
19
|
+
you to transform your response, or return a new one entirely.
|
|
20
|
+
|
|
21
|
+
## Built-In Policies
|
|
22
|
+
|
|
23
|
+
Zuplo includes many built-in policies that make it easy to handle things like
|
|
24
|
+
authentication, validation, and request modification.
|
|
25
|
+
|
|
26
|
+
Explore the navigation to see all of the built-in policies.
|
|
27
|
+
|
|
28
|
+
## Custom Policies
|
|
29
|
+
|
|
30
|
+
The ability to write custom policies that run in-process of your Gateway is at
|
|
31
|
+
the core of what makes Zuplo the Programmable API Gateway. You can write
|
|
32
|
+
policies to handle virtually any task. To learn more about
|
|
33
|
+
[writing custom policies see the documentation](../policies/custom-code-inbound.mdx).
|