zuplo 6.70.70 → 6.71.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/docs/ai-gateway/getting-started.mdx +2 -1
- package/docs/ai-gateway/integrations/ai-sdk.mdx +17 -0
- package/docs/ai-gateway/introduction.mdx +5 -5
- package/docs/ai-gateway/providers.mdx +2 -0
- package/docs/analytics/access-and-entitlements.md +71 -0
- package/docs/analytics/overview.md +67 -0
- package/docs/analytics/reference/metrics-glossary.md +105 -0
- package/docs/analytics/reference/url-parameters.md +66 -0
- package/docs/analytics/shared-controls.md +122 -0
- package/docs/analytics/tabs/agents.md +88 -0
- package/docs/analytics/tabs/consumers.md +73 -0
- package/docs/analytics/tabs/graphql.md +78 -0
- package/docs/analytics/tabs/mcp.md +80 -0
- package/docs/analytics/tabs/origins.md +83 -0
- package/docs/analytics/tabs/requests.md +97 -0
- package/docs/articles/accounts/enterprise-sso.mdx +8 -6
- package/docs/articles/api-key-administration.mdx +4 -0
- package/docs/articles/bypass-policy-for-testing.mdx +4 -0
- package/docs/articles/ci-cd-github/basic-deployment.mdx +10 -1
- package/docs/articles/ci-cd-github/deploy-and-test.mdx +14 -1
- package/docs/articles/ci-cd-github/local-testing.mdx +3 -1
- package/docs/articles/ci-cd-github/pr-preview-environments.mdx +36 -4
- package/docs/articles/custom-ci-cd-github.mdx +11 -2
- package/docs/articles/environment-variables.mdx +5 -1
- package/docs/articles/environments.mdx +2 -2
- package/docs/articles/graphql.mdx +23 -39
- package/docs/articles/mcp-quickstart-local.mdx +2 -1
- package/docs/articles/mcp-quickstart.mdx +6 -1
- package/docs/articles/monetization/api-access.mdx +184 -0
- package/docs/articles/monetization/meters.mdx +4 -4
- package/docs/articles/monetization/monetization-policy.md +4 -1
- package/docs/articles/monetization/private-plans.md +3 -4
- package/docs/articles/monetization/stripe-integration.md +9 -0
- package/docs/articles/monetization/subscription-lifecycle.md +12 -11
- package/docs/articles/monorepo-deployment.mdx +20 -2
- package/docs/articles/multiple-auth-policies.mdx +2 -2
- package/docs/articles/openapi.mdx +6 -1
- package/docs/articles/rename-or-move-project.mdx +4 -0
- package/docs/articles/securing-your-backend.mdx +11 -3
- package/docs/articles/source-control-setup-github.mdx +4 -0
- package/docs/articles/troubleshooting-slow-responses.mdx +2 -2
- package/docs/articles/troubleshooting.md +3 -3
- package/docs/cli/deploy.mdx +32 -0
- package/docs/cli/deploy.partial.mdx +32 -0
- package/docs/concepts/api-keys.md +2 -2
- package/docs/dedicated/akamai/architecture.mdx +9 -9
- package/docs/dev-portal/zudoku/components/browser-window.mdx +94 -0
- package/docs/dev-portal/zudoku/components/callout.mdx +11 -18
- package/docs/dev-portal/zudoku/components/landing-page.mdx +283 -0
- package/docs/dev-portal/zudoku/configuration/search.md +36 -0
- package/docs/dev-portal/zudoku/configuration/site.md +38 -0
- package/docs/dev-portal/zudoku/customization/colors-theme.mdx +51 -40
- package/docs/errors/rate-limit-exceeded.mdx +30 -3
- package/docs/handlers/system-handlers.mdx +2 -1
- package/docs/mcp-gateway/how-to/connect-upstream-api-key.mdx +2 -2
- package/docs/mcp-gateway/observability/analytics.mdx +17 -13
- package/docs/mcp-gateway/quickstart.mdx +4 -3
- package/docs/mcp-gateway/troubleshooting.mdx +4 -4
- package/docs/policies/_index.md +3 -0
- package/docs/policies/data-loss-prevention-inbound/doc.md +115 -0
- package/docs/policies/data-loss-prevention-inbound/intro.md +15 -0
- package/docs/policies/data-loss-prevention-inbound/schema.json +220 -0
- package/docs/policies/data-loss-prevention-outbound/doc.md +115 -0
- package/docs/policies/data-loss-prevention-outbound/intro.md +18 -0
- package/docs/policies/data-loss-prevention-outbound/schema.json +220 -0
- package/docs/policies/graphql-analytics-outbound/doc.md +93 -0
- package/docs/policies/graphql-analytics-outbound/intro.md +12 -0
- package/docs/policies/graphql-analytics-outbound/schema.json +93 -0
- package/docs/programmable-api/background-dispatcher.mdx +6 -8
- package/docs/programmable-api/zone-cache.mdx +1 -1
- package/docs/programmable-api/zuplo-context.mdx +3 -2
- package/docs/rate-limiting/combining-policies.mdx +293 -0
- package/docs/rate-limiting/dynamic-rate-limiting.mdx +240 -0
- package/docs/rate-limiting/getting-started.mdx +339 -0
- package/docs/rate-limiting/how-it-works.md +225 -0
- package/docs/rate-limiting/monitoring-and-troubleshooting.mdx +243 -0
- package/docs/{articles → rate-limiting}/per-user-rate-limits-using-db.mdx +39 -27
- package/package.json +4 -4
- package/docs/concepts/rate-limiting.md +0 -246
|
@@ -10,7 +10,7 @@ initial configuration to making your first LLM request through Zuplo.
|
|
|
10
10
|
|
|
11
11
|
- A Zuplo account (sign up free at [zuplo.com](https://zuplo.com))
|
|
12
12
|
- API keys for at least one LLM provider (OpenAI, Anthropic, Google, Mistral,
|
|
13
|
-
etc.)
|
|
13
|
+
xAI, etc.)
|
|
14
14
|
- An application that needs to call LLM APIs
|
|
15
15
|
|
|
16
16
|
## Step 1: Create an AI Gateway Project
|
|
@@ -51,6 +51,7 @@ between providers (OpenAI, Anthropic, etc.) without changing application code.
|
|
|
51
51
|
- Anthropic (for Claude models)
|
|
52
52
|
- Google (for Gemini models)
|
|
53
53
|
- Mistral (for Mistral models)
|
|
54
|
+
- xAI (for Grok models)
|
|
54
55
|
|
|
55
56
|
See [AI Providers](./providers.mdx) for the full list of supported providers and
|
|
56
57
|
capabilities, including OpenAI-compatible custom providers.
|
|
@@ -107,3 +107,20 @@ const { text } = await generateText({
|
|
|
107
107
|
prompt: "Write a one-sentence bedtime story about a unicorn.",
|
|
108
108
|
});
|
|
109
109
|
```
|
|
110
|
+
|
|
111
|
+
### xAI
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import { createXai } from "@ai-sdk/xai";
|
|
115
|
+
import { generateText } from "ai";
|
|
116
|
+
|
|
117
|
+
const xai = createXai({
|
|
118
|
+
apiKey: process.env.ZUPLO_AI_GATEWAY_API_KEY,
|
|
119
|
+
baseURL: "https://my-ai-gateway.zuplo.app/v1",
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const { text } = await generateText({
|
|
123
|
+
model: xai("grok-4"),
|
|
124
|
+
prompt: "Write a one-sentence bedtime story about a unicorn.",
|
|
125
|
+
});
|
|
126
|
+
```
|
|
@@ -5,14 +5,14 @@ sidebar_label: Introduction
|
|
|
5
5
|
|
|
6
6
|
Zuplo's AI Gateway acts as an intelligent proxy layer that sits between your
|
|
7
7
|
engineering team's applications and LLM providers like OpenAI, Anthropic,
|
|
8
|
-
Google, and
|
|
9
|
-
these providers, all requests flow through the Zuplo AI Gateway, which
|
|
10
|
-
responses while applying policies, controls, and monitoring.
|
|
8
|
+
Google, Mistral, and xAI. Instead of your applications communicating directly
|
|
9
|
+
with these providers, all requests flow through the Zuplo AI Gateway, which
|
|
10
|
+
streams responses while applying policies, controls, and monitoring.
|
|
11
11
|
|
|
12
12
|
## Key Benefits
|
|
13
13
|
|
|
14
14
|
**Provider Independence**: Switch between LLM providers (OpenAI, Anthropic,
|
|
15
|
-
Google, Mistral, and more) dynamically without modifying application code.
|
|
15
|
+
Google, Mistral, xAI, and more) dynamically without modifying application code.
|
|
16
16
|
Configure your provider choice through the gateway rather than hard coding it
|
|
17
17
|
into your applications.
|
|
18
18
|
|
|
@@ -50,7 +50,7 @@ credentials.
|
|
|
50
50
|
### Multi-Provider Support
|
|
51
51
|
|
|
52
52
|
Configure multiple LLM providers within a single gateway project. Supported
|
|
53
|
-
providers include OpenAI, Anthropic, Google, Mistral, and OpenAI-compatible
|
|
53
|
+
providers include OpenAI, Anthropic, Google, Mistral, xAI, and OpenAI-compatible
|
|
54
54
|
custom providers. See [AI Providers](./providers.mdx) for the full list of
|
|
55
55
|
providers and supported capabilities. Select which models are available to your
|
|
56
56
|
teams when configuring each provider.
|
|
@@ -14,6 +14,7 @@ Zuplo currently supports the following AI providers:
|
|
|
14
14
|
- Anthropic
|
|
15
15
|
- Google
|
|
16
16
|
- Mistral
|
|
17
|
+
- xAI (Grok)
|
|
17
18
|
- OpenAI-compatible [Custom Providers](./custom-providers.mdx) (such as Qwen,
|
|
18
19
|
Kimi, etc)
|
|
19
20
|
|
|
@@ -25,6 +26,7 @@ The following capabilities are supported across providers:
|
|
|
25
26
|
| Anthropic | ✅ | ✅ | ✅ | ❌ |
|
|
26
27
|
| Google | ✅ | ✅ | ✅ | ❌ |
|
|
27
28
|
| Mistral | ✅ | ✅ | ✅ | ❌ |
|
|
29
|
+
| xAI | ✅ | ✅ | ✅ | ❌ |
|
|
28
30
|
| OpenAI-compatible (Custom) | ✅ | ✅ | ✅ | ❌ |
|
|
29
31
|
|
|
30
32
|
If you need support for additional providers or capabilities, please contact us
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Access and Entitlements"
|
|
3
|
+
sidebar_label: "Access & Entitlements"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## When to use this
|
|
7
|
+
|
|
8
|
+
- Confirm whether your account can see advanced analytics.
|
|
9
|
+
- Find out how many days of history you have access to.
|
|
10
|
+
- Understand the trial banner or the demo mode link.
|
|
11
|
+
|
|
12
|
+
## Plan requirements
|
|
13
|
+
|
|
14
|
+
Advanced analytics must be enabled on your account. Without it, the Analytics
|
|
15
|
+
page shows an upsell view with a **Contact Sales** call-to-action and no charts.
|
|
16
|
+
|
|
17
|
+
## Free trial
|
|
18
|
+
|
|
19
|
+
New accounts with advanced analytics enabled get an automatic free trial. The
|
|
20
|
+
trial:
|
|
21
|
+
|
|
22
|
+
- Runs for the same number of days as your account's retention window.
|
|
23
|
+
- Shows a banner across the top of the Analytics page: "You're on a {N}-day
|
|
24
|
+
preview of Advanced Analytics, {N} days left."
|
|
25
|
+
- Includes two call-to-actions: **View demo →** (loads the dashboard with sample
|
|
26
|
+
data) and **Contact sales**.
|
|
27
|
+
|
|
28
|
+
Accounts on the legacy analytics version are not eligible for the trial. They
|
|
29
|
+
continue to use the previous experience.
|
|
30
|
+
|
|
31
|
+
:::note
|
|
32
|
+
|
|
33
|
+
The trial banner notes that the charts may look sparse if your account hasn't
|
|
34
|
+
yet generated much traffic. Use **View demo →** to see what a fully populated
|
|
35
|
+
dashboard looks like.
|
|
36
|
+
|
|
37
|
+
:::
|
|
38
|
+
|
|
39
|
+
## Data retention
|
|
40
|
+
|
|
41
|
+
Each account has an analytics history window measured in days. The window
|
|
42
|
+
controls:
|
|
43
|
+
|
|
44
|
+
- How far back you can scroll using the time-range picker.
|
|
45
|
+
- Which presets in the picker are available. Presets longer than your window are
|
|
46
|
+
locked with an **Upgrade for [preset]** tooltip.
|
|
47
|
+
- The maximum start and end values when you pick a custom range.
|
|
48
|
+
|
|
49
|
+
If you need a longer window, contact your Zuplo account team.
|
|
50
|
+
|
|
51
|
+
## Demo mode
|
|
52
|
+
|
|
53
|
+
Append `?demo=true` to the Analytics URL, or click **View demo →** in the trial
|
|
54
|
+
banner, to switch into demo mode. In demo mode:
|
|
55
|
+
|
|
56
|
+
- Charts and tables are populated with synthetic sample data.
|
|
57
|
+
- A persistent banner reads: "You're viewing the Advanced Analytics demo with
|
|
58
|
+
sample data. Your real analytics aren't shown here."
|
|
59
|
+
|
|
60
|
+
Remove the `demo` parameter from the URL to return to your real data.
|
|
61
|
+
|
|
62
|
+
## Scope: account vs project
|
|
63
|
+
|
|
64
|
+
- **Account scope** aggregates across every project in the account. The Requests
|
|
65
|
+
section adds **Project Name** and **Deployment Name** as breakdowns; click a
|
|
66
|
+
project name to drill into project scope.
|
|
67
|
+
- **Project scope** filters to a single project and adds an **Environment**
|
|
68
|
+
selector (Working Copy, Production, Preview, Other) in the top bar.
|
|
69
|
+
|
|
70
|
+
See [Shared controls](./shared-controls.md) for how scope affects filters and
|
|
71
|
+
breakdowns.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Analytics"
|
|
3
|
+
sidebar_label: "Overview"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Zuplo Analytics is the dashboard inside the Zuplo portal that shows how traffic
|
|
7
|
+
moves through your gateway: request volume, latency, errors, who's calling you,
|
|
8
|
+
and (when relevant) AI gateway and MCP gateway activity. It's the page you open
|
|
9
|
+
when something looks off in production, when you're auditing spend, or when
|
|
10
|
+
you're answering "is anyone actually using this endpoint?"
|
|
11
|
+
|
|
12
|
+
## When to use this
|
|
13
|
+
|
|
14
|
+
- Investigate a latency spike or error surge across all projects in your
|
|
15
|
+
account, or inside a single project.
|
|
16
|
+
- Identify which API consumers, AI agents, or upstream origins drive the most
|
|
17
|
+
traffic or errors.
|
|
18
|
+
- Track AI gateway token usage and cost, or MCP gateway and server activity.
|
|
19
|
+
|
|
20
|
+
## How to access
|
|
21
|
+
|
|
22
|
+
Analytics lives in the **Observability** tab of the Zuplo Portal, alongside
|
|
23
|
+
**Logs** and **Traces**. The page works at two scopes:
|
|
24
|
+
|
|
25
|
+
- **Account scope**: aggregates across every project in your account. Open
|
|
26
|
+
[**Observability → Analytics**](https://portal.zuplo.com/+/account/observability/analytics)
|
|
27
|
+
at the account level.
|
|
28
|
+
- **Project scope**: open a project, click **Observability**, then select
|
|
29
|
+
**Analytics**. This view filters to one project and adds an **Environment**
|
|
30
|
+
selector.
|
|
31
|
+
|
|
32
|
+
## What's in this section
|
|
33
|
+
|
|
34
|
+
- [Access and entitlements](./access-and-entitlements.md): plans, free trial,
|
|
35
|
+
demo mode, retention.
|
|
36
|
+
- [Shared controls](./shared-controls.md): time range, filters, environment
|
|
37
|
+
selector, banners, URL state.
|
|
38
|
+
- Sections:
|
|
39
|
+
- [Requests](./tabs/requests.md): overall traffic, latency, errors.
|
|
40
|
+
- [Origins](./tabs/origins.md): backend performance.
|
|
41
|
+
- [Consumers](./tabs/consumers.md): per-consumer breakdowns.
|
|
42
|
+
- [Agents](./tabs/agents.md): classified AI agent traffic.
|
|
43
|
+
- [MCP](./tabs/mcp.md): virtual server routing, capability and tool
|
|
44
|
+
invocations, JSON-RPC methods, upstream health.
|
|
45
|
+
- [GraphQL](./tabs/graphql.md): operation volume, errors, resolver latency,
|
|
46
|
+
and query complexity.
|
|
47
|
+
- Reference:
|
|
48
|
+
- [Metrics glossary](./reference/metrics-glossary.md): every KPI and
|
|
49
|
+
percentile defined once.
|
|
50
|
+
- [URL parameters](./reference/url-parameters.md): permalink reference.
|
|
51
|
+
|
|
52
|
+
## Section visibility
|
|
53
|
+
|
|
54
|
+
Analytics is split into sections, listed in a sidebar on the left of the page.
|
|
55
|
+
You'll see a subset of sections depending on your plan and project setup:
|
|
56
|
+
|
|
57
|
+
| Section | When it appears |
|
|
58
|
+
| --------- | ---------------------------------------------------------- |
|
|
59
|
+
| Requests | All accounts with advanced analytics enabled. |
|
|
60
|
+
| Origins | The project uses managed-edge origins. |
|
|
61
|
+
| Consumers | All accounts with advanced analytics enabled. |
|
|
62
|
+
| Agents | All accounts with advanced analytics enabled. |
|
|
63
|
+
| MCP | The project type is **standard** and the project uses MCP. |
|
|
64
|
+
| GraphQL | The project proxies a GraphQL API. |
|
|
65
|
+
|
|
66
|
+
If you don't see Analytics at all, your account likely doesn't have advanced
|
|
67
|
+
analytics enabled. See [Access and entitlements](./access-and-entitlements.md).
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Metrics Glossary"
|
|
3
|
+
sidebar_label: "Metrics Glossary"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
This page defines every term used in the Analytics dashboards once. KPI tables
|
|
7
|
+
on section pages link here for depth.
|
|
8
|
+
|
|
9
|
+
## HTTP status classes
|
|
10
|
+
|
|
11
|
+
| Class | Meaning |
|
|
12
|
+
| ----- | ----------------------------------------------------------------------------------------------- |
|
|
13
|
+
| 2xx | Success. |
|
|
14
|
+
| 3xx | Redirection. |
|
|
15
|
+
| 4xx | Client error. The caller sent something the gateway or backend rejected. |
|
|
16
|
+
| 5xx | Server error. The gateway, an upstream origin, or an MCP backend failed to fulfill the request. |
|
|
17
|
+
|
|
18
|
+
## Error rates
|
|
19
|
+
|
|
20
|
+
**Client error rate.** 4xx count divided by total requests in the window,
|
|
21
|
+
expressed as a percentage.
|
|
22
|
+
|
|
23
|
+
**Server error rate.** 5xx count divided by total requests in the window.
|
|
24
|
+
|
|
25
|
+
**Request-weighted average.** When aggregating a rate across many entities
|
|
26
|
+
(consumers, agents, origins), each entity's rate is weighted by its request
|
|
27
|
+
count. A consumer with 100,000 requests at a 1% error rate contributes more than
|
|
28
|
+
a consumer with 100 requests at a 50% error rate. Use the request-weighted
|
|
29
|
+
figure to answer "what does the average request experience look like?"; use a
|
|
30
|
+
simple unweighted average to answer "what does the average consumer experience
|
|
31
|
+
look like?"
|
|
32
|
+
|
|
33
|
+
## Latency
|
|
34
|
+
|
|
35
|
+
**Avg latency.** Arithmetic mean response time. Sensitive to outliers.
|
|
36
|
+
|
|
37
|
+
**P50 (median) latency.** Half of requests completed within this time.
|
|
38
|
+
|
|
39
|
+
**P95 latency.** 95% of requests completed within this time. The other 5% took
|
|
40
|
+
longer. P95 is the standard tail-latency metric.
|
|
41
|
+
|
|
42
|
+
**P99 latency.** 99% of requests completed within this time. Useful for spotting
|
|
43
|
+
outlier behavior that P95 may smooth over.
|
|
44
|
+
|
|
45
|
+
**Latency distribution histogram.** Bands at P10, P50, P90, P95, P99. Clicking a
|
|
46
|
+
band in the Requests section filters to requests in that duration range.
|
|
47
|
+
|
|
48
|
+
## Active edge instances
|
|
49
|
+
|
|
50
|
+
Distinct gateway worker instances actively serving traffic in each interval. A
|
|
51
|
+
rough indicator of how widely your traffic is distributed.
|
|
52
|
+
|
|
53
|
+
## Failure origin
|
|
54
|
+
|
|
55
|
+
Classifies an error by where it originated:
|
|
56
|
+
|
|
57
|
+
| Origin | Meaning |
|
|
58
|
+
| -------- | ---------------------------------------------------------- |
|
|
59
|
+
| gateway | The Zuplo gateway returned the error. |
|
|
60
|
+
| upstream | A backend origin or MCP server returned the error. |
|
|
61
|
+
| client | The client sent something invalid that caused the failure. |
|
|
62
|
+
|
|
63
|
+
## Outcome class
|
|
64
|
+
|
|
65
|
+
MCP events use these outcome classes:
|
|
66
|
+
|
|
67
|
+
| Class | Meaning |
|
|
68
|
+
| ----------------- | -------------------------------------------------------------------- |
|
|
69
|
+
| success | Event completed normally. |
|
|
70
|
+
| application_error | Event failed due to an application-layer issue (e.g. invalid input). |
|
|
71
|
+
| gateway_error | The gateway itself returned an error. |
|
|
72
|
+
| upstream_error | An upstream MCP server returned an error. |
|
|
73
|
+
|
|
74
|
+
## GraphQL operation types
|
|
75
|
+
|
|
76
|
+
| Type | Meaning |
|
|
77
|
+
| ------------ | -------------------------------------------- |
|
|
78
|
+
| Query | A read operation. |
|
|
79
|
+
| Mutation | A write operation. |
|
|
80
|
+
| Subscription | A long-lived operation that streams updates. |
|
|
81
|
+
|
|
82
|
+
## GraphQL error classes
|
|
83
|
+
|
|
84
|
+
The GraphQL section groups errors by where they arise:
|
|
85
|
+
|
|
86
|
+
| Class | Meaning |
|
|
87
|
+
| ---------- | ---------------------------------------------------------------- |
|
|
88
|
+
| Resolver | A resolver threw while executing the operation. |
|
|
89
|
+
| Validation | The operation failed schema validation before execution. |
|
|
90
|
+
| Auth | An authentication or authorization check rejected the operation. |
|
|
91
|
+
|
|
92
|
+
## Resolver latency (GraphQL)
|
|
93
|
+
|
|
94
|
+
How long the operation spends executing resolvers, as opposed to **total
|
|
95
|
+
latency**, which also covers parsing, validation, and gateway policy time. A
|
|
96
|
+
total P95 well above the resolver P95 means the operation spends its time
|
|
97
|
+
outside your resolvers.
|
|
98
|
+
|
|
99
|
+
## Query complexity (GraphQL)
|
|
100
|
+
|
|
101
|
+
A score for how expensive a GraphQL operation is to execute. The score grows
|
|
102
|
+
with the fields and nesting the operation requests. The Operations table reports
|
|
103
|
+
the average and maximum complexity per operation. See
|
|
104
|
+
[Secure your GraphQL API](../../articles/graphql-security.mdx) for complexity
|
|
105
|
+
limits.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "URL Parameters"
|
|
3
|
+
sidebar_label: "URL Parameters"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Every Analytics control persists to the URL. Copy the address bar to share any
|
|
7
|
+
view.
|
|
8
|
+
|
|
9
|
+
## When to use this
|
|
10
|
+
|
|
11
|
+
- Build a permalink to a specific time window, filter set, or demo view.
|
|
12
|
+
- Embed an Analytics link in a runbook, postmortem, or dashboard.
|
|
13
|
+
- Understand what each query parameter does.
|
|
14
|
+
|
|
15
|
+
## Parameters
|
|
16
|
+
|
|
17
|
+
| Parameter | Example | Effect |
|
|
18
|
+
| -------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------- |
|
|
19
|
+
| `time` | `?time=7d` | Apply a preset. Values: `1h`, `6h`, `24h`, `3d`, `7d`, `14d`, `28d`, `60d`, `90d`. |
|
|
20
|
+
| `start`, `end` | `?start=2026-05-01T00:00:00Z&end=2026-05-15T00:00:00Z` | Custom range as ISO-8601 datetimes. Overrides `time` when both are present. |
|
|
21
|
+
| `filter` | `?filter=httpStatus:class:5xx` | Add a filter as `<field>:<matchmode>:<value>`. Repeat the parameter for multiple filters. |
|
|
22
|
+
| `demo` | `?demo=true` | Demo mode (sample data instead of your real analytics). |
|
|
23
|
+
| `preview` | `?preview=1` | Legacy preview mode. |
|
|
24
|
+
|
|
25
|
+
## Match modes for `filter`
|
|
26
|
+
|
|
27
|
+
| Mode | Meaning | Example |
|
|
28
|
+
| ---------- | --------------------- | ---------------------------------- |
|
|
29
|
+
| equals | Exact match. | `filter=httpMethod:equals:POST` |
|
|
30
|
+
| contains | Substring match. | `filter=route:contains:/v1/users` |
|
|
31
|
+
| in | Comma-separated list. | `filter=httpStatus:in:500,502,503` |
|
|
32
|
+
| not | Negation of equals. | `filter=country:not:US` |
|
|
33
|
+
| class | HTTP status class. | `filter=httpStatus:class:5xx` |
|
|
34
|
+
| startsWith | String prefix. | `filter=route:startsWith:/v1/` |
|
|
35
|
+
| endsWith | String suffix. | `filter=route:endsWith:.json` |
|
|
36
|
+
|
|
37
|
+
## Permalink examples
|
|
38
|
+
|
|
39
|
+
Last 7 days of 5xx errors on a specific route:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
?time=7d&filter=httpStatus:class:5xx&filter=route:startsWith:/v1/users
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Custom range with two filters:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
?start=2026-05-01T00:00:00Z&end=2026-05-08T00:00:00Z&filter=country:equals:US&filter=httpMethod:equals:POST
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Open the demo:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
?demo=true
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Sharing
|
|
58
|
+
|
|
59
|
+
The recipient sees the same view, provided they have access to the project or
|
|
60
|
+
account.
|
|
61
|
+
|
|
62
|
+
## See also
|
|
63
|
+
|
|
64
|
+
- [Shared controls](../shared-controls.md): what each control does in the UI.
|
|
65
|
+
- [Metrics glossary](./metrics-glossary.md): definitions for the fields you can
|
|
66
|
+
filter on.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Shared Controls"
|
|
3
|
+
sidebar_label: "Shared Controls"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Every Analytics section uses the same set of controls at the top of the page: a
|
|
7
|
+
time range picker, a filter bar, and (at project scope) an environment selector.
|
|
8
|
+
State persists to the URL so you can share or bookmark any view.
|
|
9
|
+
|
|
10
|
+
## When to use this
|
|
11
|
+
|
|
12
|
+
- Narrow a section to a time window, environment, or set of filter values.
|
|
13
|
+
- Build a shareable link to a specific view.
|
|
14
|
+
- Understand what each banner across the top of the page means.
|
|
15
|
+
|
|
16
|
+
## Time range
|
|
17
|
+
|
|
18
|
+
The time range picker controls every chart, table, and KPI in the active
|
|
19
|
+
section.
|
|
20
|
+
|
|
21
|
+
**Presets.** Last 1h, 6h, 24h, 3d, 7d, 14d, 28d, 60d, 90d.
|
|
22
|
+
|
|
23
|
+
**Custom range.** Use the datetime-local inputs for **Start** and **End**. Both
|
|
24
|
+
fields are clamped to your account's retention window.
|
|
25
|
+
|
|
26
|
+
**Locked presets.** Presets longer than your retention window show an **Upgrade
|
|
27
|
+
for [preset]** tooltip. See
|
|
28
|
+
[Access and entitlements](./access-and-entitlements.md).
|
|
29
|
+
|
|
30
|
+
## Filters
|
|
31
|
+
|
|
32
|
+
Filters render as removable pills in a sticky bar at the top of the page. Add a
|
|
33
|
+
filter from any breakdown table by clicking a value, or build one manually.
|
|
34
|
+
|
|
35
|
+
**Match modes.** Each filter uses one of:
|
|
36
|
+
|
|
37
|
+
| Mode | Meaning |
|
|
38
|
+
| ---------- | ----------------------------------- |
|
|
39
|
+
| equals | Exact match. |
|
|
40
|
+
| contains | Substring match. |
|
|
41
|
+
| in | Value is in a comma-separated list. |
|
|
42
|
+
| not | Negation of equals. |
|
|
43
|
+
| class | HTTP status class (e.g. `5xx`). |
|
|
44
|
+
| startsWith | String prefix. |
|
|
45
|
+
| endsWith | String suffix. |
|
|
46
|
+
|
|
47
|
+
**Clearing.** Remove a single pill with its **×**, or click **Clear all
|
|
48
|
+
filters** to reset.
|
|
49
|
+
|
|
50
|
+
**Disabled fields.** Some fields are grayed out in sections where they don't
|
|
51
|
+
apply. For example, `originHost` is unavailable on Requests, Consumers, and
|
|
52
|
+
Agents; `userSub` is unavailable on Origins.
|
|
53
|
+
|
|
54
|
+
## Environment selector
|
|
55
|
+
|
|
56
|
+
The environment selector appears only at project scope. It's a dropdown grouped
|
|
57
|
+
as:
|
|
58
|
+
|
|
59
|
+
- **Working Copy**
|
|
60
|
+
- **Production**
|
|
61
|
+
- **Preview**
|
|
62
|
+
- **Other**
|
|
63
|
+
|
|
64
|
+
Each environment shows a request count next to its name. The active selection
|
|
65
|
+
appears as a blue pill in the top bar.
|
|
66
|
+
|
|
67
|
+
## Account vs project scope
|
|
68
|
+
|
|
69
|
+
See
|
|
70
|
+
[Access and entitlements](./access-and-entitlements.md#scope-account-vs-project)
|
|
71
|
+
for how scope affects available breakdowns and the environment selector.
|
|
72
|
+
|
|
73
|
+
## URL state and permalinks
|
|
74
|
+
|
|
75
|
+
Every control persists to the URL. To share a view, copy the address bar.
|
|
76
|
+
There's no separate share button.
|
|
77
|
+
|
|
78
|
+
| Parameter | Example | Effect |
|
|
79
|
+
| -------------- | ------------------------------------------------------ | ------------------------------------------------------- |
|
|
80
|
+
| `time` | `?time=7d` | Apply a preset. |
|
|
81
|
+
| `start`, `end` | `?start=2026-05-01T00:00:00Z&end=2026-05-15T00:00:00Z` | Custom range. Overrides `time`. |
|
|
82
|
+
| `filter` | `?filter=httpStatus:class:5xx` | Add a filter. Repeat the parameter for multiple values. |
|
|
83
|
+
| `demo` | `?demo=true` | Demo mode (sample data). |
|
|
84
|
+
| `preview` | `?preview=1` | Legacy preview mode. |
|
|
85
|
+
|
|
86
|
+
See [URL parameters](./reference/url-parameters.md) for the full reference.
|
|
87
|
+
|
|
88
|
+
## Refresh
|
|
89
|
+
|
|
90
|
+
A spinning loader appears in the sticky bar while data refetches, and a
|
|
91
|
+
semi-transparent **Updating…** overlay covers the content area. There's no
|
|
92
|
+
manual refresh button and no auto-refresh interval. Change a control to trigger
|
|
93
|
+
a refetch.
|
|
94
|
+
|
|
95
|
+
## Banners
|
|
96
|
+
|
|
97
|
+
Banners appear at the top of the page in this priority order:
|
|
98
|
+
|
|
99
|
+
1. **Preview banner**: when `preview=1` is set. Indicates legacy preview mode.
|
|
100
|
+
2. **Demo banner**: when `demo=true` is set. Reminds you sample data is shown
|
|
101
|
+
instead of your real analytics.
|
|
102
|
+
3. **Trial banner**: for new accounts with advanced analytics. Shows days
|
|
103
|
+
remaining and offers **View demo →** and **Contact Sales**.
|
|
104
|
+
|
|
105
|
+
## Loading and empty states
|
|
106
|
+
|
|
107
|
+
Each section uses a shape-aware skeleton while the first request is in flight.
|
|
108
|
+
The product analytics sections (MCP, GraphQL) suppress that skeleton briefly to
|
|
109
|
+
avoid flashing when data is already cached. Empty states there include a short
|
|
110
|
+
description and a "Read the … docs" link to the relevant product section.
|
|
111
|
+
|
|
112
|
+
## Status colors
|
|
113
|
+
|
|
114
|
+
The same color palette is used across every chart that breaks down by HTTP
|
|
115
|
+
status class:
|
|
116
|
+
|
|
117
|
+
| Class | Color |
|
|
118
|
+
| ----- | ----- |
|
|
119
|
+
| 2xx | Green |
|
|
120
|
+
| 3xx | Blue |
|
|
121
|
+
| 4xx | Amber |
|
|
122
|
+
| 5xx | Red |
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Agents"
|
|
3
|
+
sidebar_label: "Agents"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The **Agents** section isolates AI agent traffic: requests classified as coming
|
|
7
|
+
from ChatGPT, Claude.ai, Cursor, GPTBot, and similar clients. It's a focused
|
|
8
|
+
view; browsers, webhooks, and generic SDK callers are excluded.
|
|
9
|
+
|
|
10
|
+
## When to use this
|
|
11
|
+
|
|
12
|
+
- See which AI agents are calling your API and how much volume they generate.
|
|
13
|
+
- Catch agent-specific error patterns. For example, one agent that fails CORS or
|
|
14
|
+
returns 4xx more often than the others.
|
|
15
|
+
- Compare latency experience across agents.
|
|
16
|
+
|
|
17
|
+
## Summary KPIs
|
|
18
|
+
|
|
19
|
+
| Name | What it measures |
|
|
20
|
+
| ----------------- | ---------------------------------------------------------------------------- |
|
|
21
|
+
| **Requests** | Total agent-classified requests. Excludes browsers, webhooks, generic SDKs. |
|
|
22
|
+
| **Client Errors** | Request-weighted 4xx rate across agents. |
|
|
23
|
+
| **Server Errors** | Request-weighted 5xx rate. Secondary: count of agents with at least one 5xx. |
|
|
24
|
+
| **Agents** | Distinct classified agents seen in the window. |
|
|
25
|
+
| **Total Errors** | Combined 4xx + 5xx count. Secondary: agents affected. |
|
|
26
|
+
|
|
27
|
+
## Charts
|
|
28
|
+
|
|
29
|
+
**Request Volume.** Stacked bars by status class. Granularity is always hourly
|
|
30
|
+
in this section.
|
|
31
|
+
|
|
32
|
+
**Agent Error Rates.** 4xx and 5xx over time. _What to look for:_ divergence
|
|
33
|
+
between agents is the headline signal. If Cursor shows a 12% 4xx rate while
|
|
34
|
+
ChatGPT sits at 2%, the issue is almost certainly specific to how Cursor calls
|
|
35
|
+
your endpoint.
|
|
36
|
+
|
|
37
|
+
**Agent Latency Over Time.** P50, P95, P99 lines.
|
|
38
|
+
|
|
39
|
+
## Agent table
|
|
40
|
+
|
|
41
|
+
| Column | Notes |
|
|
42
|
+
| --------------- | -------------------------------- |
|
|
43
|
+
| Agent | Classified agent name. |
|
|
44
|
+
| Requests | Count with an inline volume bar. |
|
|
45
|
+
| Client Errors % | 4xx percentage. |
|
|
46
|
+
| Server Errors % | 5xx percentage. |
|
|
47
|
+
| Avg / P95 / P99 | Latency percentiles. |
|
|
48
|
+
| 4xx sparkline | Inline trend over the window. |
|
|
49
|
+
| 5xx sparkline | Inline trend over the window. |
|
|
50
|
+
|
|
51
|
+
Searchable and sortable on any column. Click a row to filter the section to that
|
|
52
|
+
agent. **Show more** loads the next 50.
|
|
53
|
+
|
|
54
|
+
## Classified agents
|
|
55
|
+
|
|
56
|
+
The classifier currently recognizes: ChatGPT, Claude.ai, Cursor, Claude Code,
|
|
57
|
+
GPTBot, Perplexity, Cline, Continue, OpenAI SDK, Anthropic SDK, Google AI,
|
|
58
|
+
Common Crawl. The list expands over time.
|
|
59
|
+
|
|
60
|
+
The Agents section excludes unclassified traffic.
|
|
61
|
+
|
|
62
|
+
:::warning
|
|
63
|
+
|
|
64
|
+
Agent charts use a dedicated hourly rollup. Filtering other sections by agent
|
|
65
|
+
isn't supported. Use the Agents section to drill into an individual agent.
|
|
66
|
+
|
|
67
|
+
:::
|
|
68
|
+
|
|
69
|
+
## Filters
|
|
70
|
+
|
|
71
|
+
The filter bar applies. `originHost` is not applicable here. See
|
|
72
|
+
[Shared controls](../shared-controls.md#filters).
|
|
73
|
+
|
|
74
|
+
## Troubleshooting
|
|
75
|
+
|
|
76
|
+
**The Agents section is empty.** Either no classified agents called your gateway
|
|
77
|
+
in the window, or your retention window doesn't yet include any agent traffic.
|
|
78
|
+
Try the demo with **View demo →** in the trial banner to see what a populated
|
|
79
|
+
view looks like. See [Access and entitlements](../access-and-entitlements.md).
|
|
80
|
+
|
|
81
|
+
**I see a known agent in my logs but not here.** The classifier is conservative;
|
|
82
|
+
it labels traffic that clearly matches a known agent fingerprint. Generic SDK
|
|
83
|
+
traffic that doesn't identify itself is excluded. If you believe an agent should
|
|
84
|
+
be classified, send the User-Agent string to your Zuplo contact.
|
|
85
|
+
|
|
86
|
+
**An agent shows zero requests but appears in the table.** Filters on the rest
|
|
87
|
+
of the section may be excluding its traffic for the current window. Clear
|
|
88
|
+
filters to verify.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Consumers"
|
|
3
|
+
sidebar_label: "Consumers"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The **Consumers** section breaks traffic down by API consumer: anyone calling
|
|
7
|
+
your gateway, whether authenticated or anonymous. Use it to see who your
|
|
8
|
+
noisiest callers are, who's hitting errors, and which consumers experience the
|
|
9
|
+
slowest latency.
|
|
10
|
+
|
|
11
|
+
## When to use this
|
|
12
|
+
|
|
13
|
+
- Find the top API consumers by request volume.
|
|
14
|
+
- Identify which consumer is responsible for a 4xx or 5xx surge.
|
|
15
|
+
- Compare latency experience across consumers (for example, paid vs free tier).
|
|
16
|
+
|
|
17
|
+
## Summary KPIs
|
|
18
|
+
|
|
19
|
+
| Name | What it measures |
|
|
20
|
+
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|
21
|
+
| **Requests** | Total requests across all consumers in the window. |
|
|
22
|
+
| **Client Errors** | Request-weighted 4xx rate across consumers (high-traffic consumers count more). See [Metrics glossary](../reference/metrics-glossary.md). |
|
|
23
|
+
| **Server Errors** | Request-weighted 5xx rate. Secondary: count of consumers with at least one 5xx. |
|
|
24
|
+
| **Consumers** | Distinct consumers (authenticated plus anonymous). |
|
|
25
|
+
| **Total Errors** | Combined 4xx + 5xx count. Secondary: consumers affected. |
|
|
26
|
+
|
|
27
|
+
## Charts
|
|
28
|
+
|
|
29
|
+
**Request Volume.** Stacked bars by status class. The chart title updates to
|
|
30
|
+
reflect the active consumer filter so you can tell at a glance whether you're
|
|
31
|
+
looking at one consumer or all of them.
|
|
32
|
+
|
|
33
|
+
**Consumer Error Rates.** 4xx and 5xx over time. _What to look for:_ a sustained
|
|
34
|
+
4xx rate from one consumer usually points to a broken integration on their side.
|
|
35
|
+
|
|
36
|
+
**Consumer Latency Over Time.** P50, P95, P99 lines.
|
|
37
|
+
|
|
38
|
+
## Consumer table
|
|
39
|
+
|
|
40
|
+
| Column | Notes |
|
|
41
|
+
| --------------- | ------------------------------------------------------------------- |
|
|
42
|
+
| User | Consumer identity. Anonymous requests show **Anonymous · No auth**. |
|
|
43
|
+
| Requests | Count with an inline volume bar. |
|
|
44
|
+
| Client Errors % | 4xx percentage. |
|
|
45
|
+
| Server Errors % | 5xx percentage. |
|
|
46
|
+
| Avg / P95 / P99 | Latency percentiles. |
|
|
47
|
+
| 4xx sparkline | Inline trend over the window. |
|
|
48
|
+
| 5xx sparkline | Inline trend over the window. |
|
|
49
|
+
|
|
50
|
+
The table is searchable and sortable on any column (default: requests
|
|
51
|
+
descending). Clicking a row filters the entire section to that consumer. **Show
|
|
52
|
+
more** loads the next 50.
|
|
53
|
+
|
|
54
|
+
## Filters
|
|
55
|
+
|
|
56
|
+
The filter bar applies. `originHost` doesn't apply in this section. See
|
|
57
|
+
[Shared controls](../shared-controls.md#filters).
|
|
58
|
+
|
|
59
|
+
## Troubleshooting
|
|
60
|
+
|
|
61
|
+
**Everything is showing as Anonymous.** If your gateway isn't authenticating
|
|
62
|
+
requests, or your auth policy isn't attaching a consumer identity, every request
|
|
63
|
+
falls into the **Anonymous · No auth** bucket. Check your API key or JWT policy
|
|
64
|
+
configuration.
|
|
65
|
+
|
|
66
|
+
**I clicked a row but the charts didn't change.** A row click adds a consumer
|
|
67
|
+
filter pill. If you don't see the pill in the sticky bar, your click landed on a
|
|
68
|
+
non-row element. Try clicking the user cell directly.
|
|
69
|
+
|
|
70
|
+
**The 5xx rate here is higher than on Requests.** The Consumers KPI is
|
|
71
|
+
request-weighted across consumers, while the Requests KPI is a flat rate over
|
|
72
|
+
all requests. They diverge when high-error consumers are a small share of total
|
|
73
|
+
volume. See [Metrics glossary](../reference/metrics-glossary.md).
|