@intentsolutionsio/vercel-pack 1.0.0 → 1.0.3
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/LICENSE +1 -1
- package/README.md +67 -44
- package/package.json +4 -4
- package/skills/vercel-advanced-troubleshooting/SKILL.md +185 -195
- package/skills/vercel-advanced-troubleshooting/references/errors.md +11 -0
- package/skills/vercel-advanced-troubleshooting/references/evidence-collection-framework.md +34 -0
- package/skills/vercel-advanced-troubleshooting/references/examples.md +11 -0
- package/skills/vercel-advanced-troubleshooting/references/systematic-isolation.md +56 -0
- package/skills/vercel-advanced-troubleshooting/references/timing-analysis.md +35 -0
- package/skills/vercel-architecture-variants/SKILL.md +227 -216
- package/skills/vercel-architecture-variants/references/errors.md +11 -0
- package/skills/vercel-architecture-variants/references/examples.md +12 -0
- package/skills/vercel-architecture-variants/references/variant-a-monolith-(simple).md +44 -0
- package/skills/vercel-architecture-variants/references/variant-b-service-layer-(moderate).md +72 -0
- package/skills/vercel-architecture-variants/references/variant-c-microservice-(complex).md +81 -0
- package/skills/vercel-ci-integration/SKILL.md +183 -73
- package/skills/vercel-ci-integration/references/errors.md +10 -0
- package/skills/vercel-ci-integration/references/examples.md +36 -0
- package/skills/vercel-ci-integration/references/implementation.md +54 -0
- package/skills/vercel-common-errors/SKILL.md +164 -60
- package/skills/vercel-common-errors/references/errors.md +53 -0
- package/skills/vercel-common-errors/references/examples.md +23 -0
- package/skills/vercel-cost-tuning/SKILL.md +158 -145
- package/skills/vercel-cost-tuning/references/cost-estimation.md +34 -0
- package/skills/vercel-cost-tuning/references/cost-reduction-strategies.md +40 -0
- package/skills/vercel-cost-tuning/references/errors.md +11 -0
- package/skills/vercel-cost-tuning/references/examples.md +15 -0
- package/skills/vercel-data-handling/SKILL.md +202 -155
- package/skills/vercel-data-handling/references/errors.md +11 -0
- package/skills/vercel-data-handling/references/examples.md +27 -0
- package/skills/vercel-data-handling/references/implementation.md +223 -0
- package/skills/vercel-debug-bundle/SKILL.md +163 -67
- package/skills/vercel-debug-bundle/references/errors.md +12 -0
- package/skills/vercel-debug-bundle/references/examples.md +24 -0
- package/skills/vercel-debug-bundle/references/implementation.md +54 -0
- package/skills/vercel-deploy-integration/SKILL.md +163 -156
- package/skills/vercel-deploy-integration/references/errors.md +11 -0
- package/skills/vercel-deploy-integration/references/examples.md +21 -0
- package/skills/vercel-deploy-integration/references/google-cloud-run.md +36 -0
- package/skills/vercel-deploy-integration/references/vercel-deployment.md +35 -0
- package/skills/vercel-deploy-preview/SKILL.md +164 -39
- package/skills/vercel-edge-functions/SKILL.md +185 -37
- package/skills/vercel-enterprise-rbac/SKILL.md +185 -170
- package/skills/vercel-enterprise-rbac/references/errors.md +11 -0
- package/skills/vercel-enterprise-rbac/references/examples.md +12 -0
- package/skills/vercel-enterprise-rbac/references/role-implementation.md +33 -0
- package/skills/vercel-enterprise-rbac/references/sso-integration.md +35 -0
- package/skills/vercel-hello-world/SKILL.md +141 -55
- package/skills/vercel-incident-runbook/SKILL.md +186 -138
- package/skills/vercel-incident-runbook/references/errors.md +11 -0
- package/skills/vercel-incident-runbook/references/examples.md +10 -0
- package/skills/vercel-incident-runbook/references/immediate-actions-by-error-type.md +41 -0
- package/skills/vercel-install-auth/SKILL.md +130 -53
- package/skills/vercel-known-pitfalls/SKILL.md +235 -233
- package/skills/vercel-known-pitfalls/references/errors.md +11 -0
- package/skills/vercel-known-pitfalls/references/examples.md +12 -0
- package/skills/vercel-load-scale/SKILL.md +197 -204
- package/skills/vercel-load-scale/references/capacity-planning.md +47 -0
- package/skills/vercel-load-scale/references/errors.md +11 -0
- package/skills/vercel-load-scale/references/examples.md +26 -0
- package/skills/vercel-load-scale/references/load-testing-with-k6.md +59 -0
- package/skills/vercel-load-scale/references/scaling-patterns.md +65 -0
- package/skills/vercel-local-dev-loop/SKILL.md +159 -71
- package/skills/vercel-local-dev-loop/references/errors.md +11 -0
- package/skills/vercel-local-dev-loop/references/examples.md +21 -0
- package/skills/vercel-local-dev-loop/references/implementation.md +60 -0
- package/skills/vercel-migration-deep-dive/SKILL.md +202 -187
- package/skills/vercel-migration-deep-dive/references/errors.md +11 -0
- package/skills/vercel-migration-deep-dive/references/examples.md +12 -0
- package/skills/vercel-migration-deep-dive/references/implementation-plan.md +80 -0
- package/skills/vercel-migration-deep-dive/references/pre-migration-assessment.md +39 -0
- package/skills/vercel-multi-env-setup/SKILL.md +167 -164
- package/skills/vercel-multi-env-setup/references/configuration-structure.md +59 -0
- package/skills/vercel-multi-env-setup/references/errors.md +11 -0
- package/skills/vercel-multi-env-setup/references/examples.md +11 -0
- package/skills/vercel-observability/SKILL.md +205 -195
- package/skills/vercel-observability/references/alert-configuration.md +40 -0
- package/skills/vercel-observability/references/errors.md +11 -0
- package/skills/vercel-observability/references/examples.md +13 -0
- package/skills/vercel-observability/references/metrics-collection.md +65 -0
- package/skills/vercel-performance-tuning/SKILL.md +212 -156
- package/skills/vercel-performance-tuning/references/caching-strategy.md +49 -0
- package/skills/vercel-performance-tuning/references/errors.md +11 -0
- package/skills/vercel-performance-tuning/references/examples.md +13 -0
- package/skills/vercel-policy-guardrails/SKILL.md +276 -193
- package/skills/vercel-policy-guardrails/references/errors.md +11 -0
- package/skills/vercel-policy-guardrails/references/eslint-rules.md +46 -0
- package/skills/vercel-policy-guardrails/references/examples.md +10 -0
- package/skills/vercel-prod-checklist/SKILL.md +219 -94
- package/skills/vercel-prod-checklist/references/errors.md +11 -0
- package/skills/vercel-prod-checklist/references/examples.md +25 -0
- package/skills/vercel-prod-checklist/references/implementation.md +60 -0
- package/skills/vercel-rate-limits/SKILL.md +187 -100
- package/skills/vercel-rate-limits/references/errors.md +11 -0
- package/skills/vercel-rate-limits/references/examples.md +46 -0
- package/skills/vercel-rate-limits/references/implementation.md +66 -0
- package/skills/vercel-reference-architecture/SKILL.md +226 -180
- package/skills/vercel-reference-architecture/references/errors.md +11 -0
- package/skills/vercel-reference-architecture/references/examples.md +13 -0
- package/skills/vercel-reference-architecture/references/key-components.md +65 -0
- package/skills/vercel-reference-architecture/references/project-structure.md +40 -0
- package/skills/vercel-reliability-patterns/SKILL.md +272 -211
- package/skills/vercel-reliability-patterns/references/circuit-breaker.md +36 -0
- package/skills/vercel-reliability-patterns/references/dead-letter-queue.md +48 -0
- package/skills/vercel-reliability-patterns/references/errors.md +11 -0
- package/skills/vercel-reliability-patterns/references/examples.md +11 -0
- package/skills/vercel-reliability-patterns/references/idempotency-keys.md +36 -0
- package/skills/vercel-sdk-patterns/SKILL.md +264 -92
- package/skills/vercel-sdk-patterns/references/errors.md +11 -0
- package/skills/vercel-sdk-patterns/references/examples.md +45 -0
- package/skills/vercel-sdk-patterns/references/implementation.md +67 -0
- package/skills/vercel-security-basics/SKILL.md +186 -96
- package/skills/vercel-security-basics/references/errors.md +10 -0
- package/skills/vercel-security-basics/references/examples.md +70 -0
- package/skills/vercel-security-basics/references/implementation.md +39 -0
- package/skills/vercel-upgrade-migration/SKILL.md +167 -67
- package/skills/vercel-upgrade-migration/references/errors.md +10 -0
- package/skills/vercel-upgrade-migration/references/examples.md +51 -0
- package/skills/vercel-upgrade-migration/references/implementation.md +29 -0
- package/skills/vercel-webhooks-events/SKILL.md +208 -132
- package/skills/vercel-webhooks-events/references/errors.md +11 -0
- package/skills/vercel-webhooks-events/references/event-handler-pattern.md +37 -0
- package/skills/vercel-webhooks-events/references/examples.md +16 -0
- package/skills/vercel-webhooks-events/references/signature-verification.md +33 -0
|
@@ -1,250 +1,260 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: vercel-observability
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
description: 'Set up Vercel observability with runtime logs, analytics, log drains,
|
|
4
|
+
and OpenTelemetry tracing.
|
|
5
|
+
|
|
6
|
+
Use when implementing monitoring for Vercel deployments, setting up log drains,
|
|
7
|
+
|
|
8
|
+
or configuring alerting for function errors and performance.
|
|
9
|
+
|
|
7
10
|
Trigger with phrases like "vercel monitoring", "vercel metrics",
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
|
|
12
|
+
"vercel observability", "vercel logs", "vercel alerts", "vercel tracing".
|
|
13
|
+
|
|
14
|
+
'
|
|
15
|
+
allowed-tools: Read, Write, Edit, Bash(vercel:*), Bash(curl:*)
|
|
10
16
|
version: 1.0.0
|
|
11
17
|
license: MIT
|
|
12
18
|
author: Jeremy Longshore <jeremy@intentsolutions.io>
|
|
19
|
+
tags:
|
|
20
|
+
- saas
|
|
21
|
+
- vercel
|
|
22
|
+
- monitoring
|
|
23
|
+
- observability
|
|
24
|
+
- logging
|
|
25
|
+
compatibility: Designed for Claude Code, also compatible with Codex and OpenClaw
|
|
13
26
|
---
|
|
14
|
-
|
|
15
27
|
# Vercel Observability
|
|
16
28
|
|
|
17
29
|
## Overview
|
|
18
|
-
|
|
30
|
+
|
|
31
|
+
Configure comprehensive observability for Vercel deployments using built-in analytics, runtime logs, log drains to external providers, OpenTelemetry integration, and custom instrumentation. Covers the full observability stack from function-level metrics to end-user experience monitoring.
|
|
19
32
|
|
|
20
33
|
## Prerequisites
|
|
21
|
-
- Prometheus or compatible metrics backend
|
|
22
|
-
- OpenTelemetry SDK installed
|
|
23
|
-
- Grafana or similar dashboarding tool
|
|
24
|
-
- AlertManager configured
|
|
25
34
|
|
|
26
|
-
|
|
35
|
+
- Vercel Pro or Enterprise plan (for log drains and extended retention)
|
|
36
|
+
- External logging provider (Datadog, Axiom, Sentry) — optional
|
|
37
|
+
- OpenTelemetry SDK — optional
|
|
27
38
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
| `vercel_errors_total` | Counter | Error count by type |
|
|
34
|
-
| `vercel_rate_limit_remaining` | Gauge | Rate limit headroom |
|
|
39
|
+
## Instructions
|
|
40
|
+
|
|
41
|
+
### Step 1: Enable Vercel Analytics
|
|
42
|
+
|
|
43
|
+
In the Vercel dashboard:
|
|
35
44
|
|
|
36
|
-
|
|
45
|
+
1. Go to **Analytics** tab
|
|
46
|
+
2. Enable **Web Analytics** (Core Web Vitals, page views)
|
|
47
|
+
3. Enable **Speed Insights** (real user performance data)
|
|
37
48
|
|
|
38
49
|
```typescript
|
|
39
|
-
|
|
50
|
+
// For Next.js — add the analytics component
|
|
51
|
+
// src/app/layout.tsx
|
|
52
|
+
import { Analytics } from '@vercel/analytics/react';
|
|
53
|
+
import { SpeedInsights } from '@vercel/speed-insights/next';
|
|
54
|
+
|
|
55
|
+
export default function RootLayout({ children }) {
|
|
56
|
+
return (
|
|
57
|
+
<html>
|
|
58
|
+
<body>
|
|
59
|
+
{children}
|
|
60
|
+
<Analytics />
|
|
61
|
+
<SpeedInsights />
|
|
62
|
+
</body>
|
|
63
|
+
</html>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
```
|
|
40
67
|
|
|
41
|
-
|
|
68
|
+
Install: `npm install @vercel/analytics @vercel/speed-insights`
|
|
42
69
|
|
|
43
|
-
|
|
44
|
-
name: 'vercel_requests_total',
|
|
45
|
-
help: 'Total Vercel API requests',
|
|
46
|
-
labelNames: ['method', 'status'],
|
|
47
|
-
registers: [registry],
|
|
48
|
-
});
|
|
70
|
+
### Step 2: Runtime Logs
|
|
49
71
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
labelNames: ['method'],
|
|
54
|
-
buckets: [0.05, 0.1, 0.25, 0.5, 1, 2.5, 5],
|
|
55
|
-
registers: [registry],
|
|
56
|
-
});
|
|
72
|
+
```bash
|
|
73
|
+
# View runtime logs via CLI
|
|
74
|
+
vercel logs https://my-app.vercel.app --follow
|
|
57
75
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
76
|
+
# Filter by level
|
|
77
|
+
vercel logs https://my-app.vercel.app --level=error
|
|
78
|
+
|
|
79
|
+
# View logs via API
|
|
80
|
+
curl -s -H "Authorization: Bearer $VERCEL_TOKEN" \
|
|
81
|
+
"https://api.vercel.com/v2/deployments/dpl_xxx/events?limit=50&direction=backward" \
|
|
82
|
+
| jq '.[] | {timestamp: .created, level: .level, message: .text}'
|
|
64
83
|
```
|
|
65
84
|
|
|
66
|
-
|
|
85
|
+
Runtime logs include:
|
|
86
|
+
|
|
87
|
+
- Function invocation start/end with duration
|
|
88
|
+
- `console.log/warn/error` output from functions
|
|
89
|
+
- Edge Middleware execution logs
|
|
90
|
+
- HTTP request/response metadata
|
|
91
|
+
|
|
92
|
+
### Step 3: Structured Logging in Functions
|
|
67
93
|
|
|
68
94
|
```typescript
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
95
|
+
// lib/logger.ts — structured JSON logging
|
|
96
|
+
interface LogEntry {
|
|
97
|
+
level: 'info' | 'warn' | 'error';
|
|
98
|
+
message: string;
|
|
99
|
+
requestId?: string;
|
|
100
|
+
duration?: number;
|
|
101
|
+
[key: string]: unknown;
|
|
102
|
+
}
|
|
74
103
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
104
|
+
export function log(entry: LogEntry): void {
|
|
105
|
+
// Vercel captures console output as runtime logs
|
|
106
|
+
const output = JSON.stringify({
|
|
107
|
+
...entry,
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
region: process.env.VERCEL_REGION,
|
|
110
|
+
env: process.env.VERCEL_ENV,
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
switch (entry.level) {
|
|
114
|
+
case 'error': console.error(output); break;
|
|
115
|
+
case 'warn': console.warn(output); break;
|
|
116
|
+
default: console.log(output);
|
|
85
117
|
}
|
|
86
118
|
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Distributed Tracing
|
|
90
119
|
|
|
91
|
-
|
|
120
|
+
// Usage in API route:
|
|
121
|
+
export async function GET(request: Request) {
|
|
122
|
+
const requestId = crypto.randomUUID();
|
|
123
|
+
const start = Date.now();
|
|
92
124
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
): Promise<T> {
|
|
102
|
-
return tracer.startActiveSpan(`vercel.${operationName}`, async (span) => {
|
|
103
|
-
try {
|
|
104
|
-
const result = await operation();
|
|
105
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
106
|
-
return result;
|
|
107
|
-
} catch (error: any) {
|
|
108
|
-
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
109
|
-
span.recordException(error);
|
|
110
|
-
throw error;
|
|
111
|
-
} finally {
|
|
112
|
-
span.end();
|
|
113
|
-
}
|
|
114
|
-
});
|
|
125
|
+
try {
|
|
126
|
+
const data = await fetchData();
|
|
127
|
+
log({ level: 'info', message: 'Fetched data', requestId, duration: Date.now() - start });
|
|
128
|
+
return Response.json(data);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
log({ level: 'error', message: 'Data fetch failed', requestId, error: String(error) });
|
|
131
|
+
return Response.json({ error: 'Internal error', requestId }, { status: 500 });
|
|
132
|
+
}
|
|
115
133
|
}
|
|
116
134
|
```
|
|
117
135
|
|
|
118
|
-
|
|
136
|
+
### Step 4: Log Drains (External Providers)
|
|
137
|
+
|
|
138
|
+
Configure log drains to send all Vercel logs to your logging provider:
|
|
139
|
+
|
|
140
|
+
In dashboard: **Settings > Log Drains > Add**
|
|
141
|
+
|
|
142
|
+
Supported providers:
|
|
143
|
+
|
|
144
|
+
| Provider | Type | Setup |
|
|
145
|
+
|----------|------|-------|
|
|
146
|
+
| Datadog | HTTP | API key + site URL |
|
|
147
|
+
| Axiom | HTTP | API token + dataset |
|
|
148
|
+
| Sentry | HTTP | DSN |
|
|
149
|
+
| Custom | HTTP/NDJSON | Any HTTPS endpoint |
|
|
150
|
+
| Grafana Loki | HTTP | Push URL + auth |
|
|
151
|
+
|
|
152
|
+
Log drain delivers:
|
|
153
|
+
|
|
154
|
+
- **Runtime logs**: function invocations, console output
|
|
155
|
+
- **Build logs**: build step output, warnings, errors
|
|
156
|
+
- **Static logs**: CDN access logs (edge)
|
|
157
|
+
- **Firewall logs**: WAF events
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# Create a log drain via API
|
|
161
|
+
curl -X POST "https://api.vercel.com/v2/integrations/log-drains" \
|
|
162
|
+
-H "Authorization: Bearer $VERCEL_TOKEN" \
|
|
163
|
+
-H "Content-Type: application/json" \
|
|
164
|
+
-d '{
|
|
165
|
+
"name": "my-datadog-drain",
|
|
166
|
+
"type": "json",
|
|
167
|
+
"url": "https://http-intake.logs.datadoghq.com/api/v2/logs",
|
|
168
|
+
"headers": {"DD-API-KEY": "your-datadog-api-key"},
|
|
169
|
+
"sources": ["lambda", "edge", "build", "static"]
|
|
170
|
+
}'
|
|
171
|
+
```
|
|
119
172
|
|
|
120
|
-
###
|
|
173
|
+
### Step 5: OpenTelemetry Integration
|
|
121
174
|
|
|
122
175
|
```typescript
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
logger.info({
|
|
136
|
-
service: 'vercel',
|
|
137
|
-
operation,
|
|
138
|
-
duration_ms: duration,
|
|
139
|
-
...data,
|
|
176
|
+
// instrumentation.ts (Next.js 13.4+)
|
|
177
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
178
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
179
|
+
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
|
|
180
|
+
|
|
181
|
+
export function register() {
|
|
182
|
+
const sdk = new NodeSDK({
|
|
183
|
+
traceExporter: new OTLPTraceExporter({
|
|
184
|
+
url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
|
|
185
|
+
}),
|
|
186
|
+
instrumentations: [getNodeAutoInstrumentations()],
|
|
187
|
+
serviceName: 'my-vercel-app',
|
|
140
188
|
});
|
|
189
|
+
sdk.start();
|
|
141
190
|
}
|
|
142
191
|
```
|
|
143
192
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- name: vercel_alerts
|
|
152
|
-
rules:
|
|
153
|
-
- alert: VercelHighErrorRate
|
|
154
|
-
expr: |
|
|
155
|
-
rate(vercel_errors_total[5m]) /
|
|
156
|
-
rate(vercel_requests_total[5m]) > 0.05
|
|
157
|
-
for: 5m
|
|
158
|
-
labels:
|
|
159
|
-
severity: warning
|
|
160
|
-
annotations:
|
|
161
|
-
summary: "Vercel error rate > 5%"
|
|
162
|
-
|
|
163
|
-
- alert: VercelHighLatency
|
|
164
|
-
expr: |
|
|
165
|
-
histogram_quantile(0.95,
|
|
166
|
-
rate(vercel_request_duration_seconds_bucket[5m])
|
|
167
|
-
) > 2
|
|
168
|
-
for: 5m
|
|
169
|
-
labels:
|
|
170
|
-
severity: warning
|
|
171
|
-
annotations:
|
|
172
|
-
summary: "Vercel P95 latency > 2s"
|
|
173
|
-
|
|
174
|
-
- alert: VercelDown
|
|
175
|
-
expr: up{job="vercel"} == 0
|
|
176
|
-
for: 1m
|
|
177
|
-
labels:
|
|
178
|
-
severity: critical
|
|
179
|
-
annotations:
|
|
180
|
-
summary: "Vercel integration is down"
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
## Dashboard
|
|
184
|
-
|
|
185
|
-
### Grafana Panel Queries
|
|
186
|
-
|
|
187
|
-
```json
|
|
188
|
-
{
|
|
189
|
-
"panels": [
|
|
190
|
-
{
|
|
191
|
-
"title": "Vercel Request Rate",
|
|
192
|
-
"targets": [{
|
|
193
|
-
"expr": "rate(vercel_requests_total[5m])"
|
|
194
|
-
}]
|
|
195
|
-
},
|
|
196
|
-
{
|
|
197
|
-
"title": "Vercel Latency P50/P95/P99",
|
|
198
|
-
"targets": [{
|
|
199
|
-
"expr": "histogram_quantile(0.5, rate(vercel_request_duration_seconds_bucket[5m]))"
|
|
200
|
-
}]
|
|
201
|
-
}
|
|
202
|
-
]
|
|
203
|
-
}
|
|
193
|
+
```javascript
|
|
194
|
+
// next.config.js
|
|
195
|
+
module.exports = {
|
|
196
|
+
experimental: {
|
|
197
|
+
instrumentationHook: true,
|
|
198
|
+
},
|
|
199
|
+
};
|
|
204
200
|
```
|
|
205
201
|
|
|
206
|
-
|
|
202
|
+
### Step 6: Error Tracking with Sentry
|
|
207
203
|
|
|
208
|
-
|
|
209
|
-
|
|
204
|
+
```bash
|
|
205
|
+
npx @sentry/wizard@latest -i nextjs
|
|
206
|
+
```
|
|
210
207
|
|
|
211
|
-
|
|
212
|
-
|
|
208
|
+
```typescript
|
|
209
|
+
// sentry.client.config.ts
|
|
210
|
+
import * as Sentry from '@sentry/nextjs';
|
|
211
|
+
|
|
212
|
+
Sentry.init({
|
|
213
|
+
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
|
|
214
|
+
environment: process.env.VERCEL_ENV,
|
|
215
|
+
release: process.env.VERCEL_GIT_COMMIT_SHA,
|
|
216
|
+
tracesSampleRate: process.env.VERCEL_ENV === 'production' ? 0.1 : 1.0,
|
|
217
|
+
});
|
|
218
|
+
```
|
|
213
219
|
|
|
214
|
-
|
|
215
|
-
Set up JSON logging with consistent field names.
|
|
220
|
+
## Monitoring Dashboard Checklist
|
|
216
221
|
|
|
217
|
-
|
|
218
|
-
|
|
222
|
+
| Metric | Source | Alert Threshold |
|
|
223
|
+
|--------|--------|----------------|
|
|
224
|
+
| Error rate | Runtime logs | > 1% of requests |
|
|
225
|
+
| P95 function latency | Vercel Analytics | > 2s |
|
|
226
|
+
| Cold start frequency | Runtime logs | > 20% of invocations |
|
|
227
|
+
| Build success rate | Build logs | Any failure |
|
|
228
|
+
| Core Web Vitals (LCP) | Speed Insights | > 2.5s |
|
|
229
|
+
| Edge cache hit rate | Static logs | < 80% |
|
|
219
230
|
|
|
220
231
|
## Output
|
|
221
|
-
- Metrics collection enabled
|
|
222
|
-
- Distributed tracing configured
|
|
223
|
-
- Structured logging implemented
|
|
224
|
-
- Alert rules deployed
|
|
225
232
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
| Alert storms | Wrong thresholds | Tune alert rules |
|
|
232
|
-
| High cardinality | Too many labels | Reduce label values |
|
|
233
|
+
- Vercel Analytics and Speed Insights enabled
|
|
234
|
+
- Structured JSON logging in all functions
|
|
235
|
+
- Log drains configured to external provider
|
|
236
|
+
- Error tracking with Sentry or equivalent
|
|
237
|
+
- OpenTelemetry tracing for distributed systems
|
|
233
238
|
|
|
234
|
-
##
|
|
239
|
+
## Error Handling
|
|
235
240
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
241
|
+
| Error | Cause | Solution |
|
|
242
|
+
|-------|-------|----------|
|
|
243
|
+
| Logs missing | Log retention expired (1hr free, 30d with Plus) | Enable log drains for persistence |
|
|
244
|
+
| Analytics not tracking | Missing `<Analytics />` component | Add to root layout |
|
|
245
|
+
| Log drain not receiving | Wrong URL or auth headers | Test the endpoint directly with curl |
|
|
246
|
+
| Sentry not capturing errors | DSN not set in production env | Add `NEXT_PUBLIC_SENTRY_DSN` to Production scope |
|
|
247
|
+
| OTEL traces missing | instrumentation.ts not loaded | Enable `instrumentationHook` in next.config.js |
|
|
243
248
|
|
|
244
249
|
## Resources
|
|
245
|
-
|
|
246
|
-
- [
|
|
247
|
-
- [
|
|
250
|
+
|
|
251
|
+
- [Vercel Observability](https://vercel.com/docs/observability)
|
|
252
|
+
- [Runtime Logs](https://vercel.com/docs/logs/runtime)
|
|
253
|
+
- [Vercel Analytics](https://vercel.com/docs/analytics)
|
|
254
|
+
- [Speed Insights](https://vercel.com/docs/speed-insights)
|
|
255
|
+
- [Log Drains](https://vercel.com/docs/observability/log-drains)
|
|
256
|
+
- [OpenTelemetry + Next.js](https://nextjs.org/docs/app/building-your-application/optimizing/open-telemetry)
|
|
248
257
|
|
|
249
258
|
## Next Steps
|
|
250
|
-
|
|
259
|
+
|
|
260
|
+
For incident response, see `vercel-incident-runbook`.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Alert Configuration
|
|
2
|
+
|
|
3
|
+
## Alert Configuration
|
|
4
|
+
|
|
5
|
+
### Prometheus AlertManager Rules
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
# vercel_alerts.yaml
|
|
9
|
+
groups:
|
|
10
|
+
- name: vercel_alerts
|
|
11
|
+
rules:
|
|
12
|
+
- alert: VercelHighErrorRate
|
|
13
|
+
expr: |
|
|
14
|
+
rate(vercel_errors_total[5m]) /
|
|
15
|
+
rate(vercel_requests_total[5m]) > 0.05
|
|
16
|
+
for: 5m
|
|
17
|
+
labels:
|
|
18
|
+
severity: warning
|
|
19
|
+
annotations:
|
|
20
|
+
summary: "Vercel error rate > 5%"
|
|
21
|
+
|
|
22
|
+
- alert: VercelHighLatency
|
|
23
|
+
expr: |
|
|
24
|
+
histogram_quantile(0.95,
|
|
25
|
+
rate(vercel_request_duration_seconds_bucket[5m])
|
|
26
|
+
) > 2
|
|
27
|
+
for: 5m
|
|
28
|
+
labels:
|
|
29
|
+
severity: warning
|
|
30
|
+
annotations:
|
|
31
|
+
summary: "Vercel P95 latency > 2s"
|
|
32
|
+
|
|
33
|
+
- alert: VercelDown
|
|
34
|
+
expr: up{job="vercel"} == 0
|
|
35
|
+
for: 1m
|
|
36
|
+
labels:
|
|
37
|
+
severity: critical
|
|
38
|
+
annotations:
|
|
39
|
+
summary: "Vercel integration is down"
|
|
40
|
+
```
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Error Handling Reference
|
|
2
|
+
|
|
3
|
+
| Issue | Cause | Solution |
|
|
4
|
+
|-------|-------|----------|
|
|
5
|
+
| Missing metrics | No instrumentation | Wrap client calls |
|
|
6
|
+
| Trace gaps | Missing propagation | Check context headers |
|
|
7
|
+
| Alert storms | Wrong thresholds | Tune alert rules |
|
|
8
|
+
| High cardinality | Too many labels | Reduce label values |
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
*[Tons of Skills](https://tonsofskills.com) by [Intent Solutions](https://intentsolutions.io) | [jeremylongshore.com](https://jeremylongshore.com)*
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## Examples
|
|
2
|
+
|
|
3
|
+
### Quick Metrics Endpoint
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
app.get('/metrics', async (req, res) => {
|
|
7
|
+
res.set('Content-Type', registry.contentType);
|
|
8
|
+
res.send(await registry.metrics());
|
|
9
|
+
});
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
*[Tons of Skills](https://tonsofskills.com) by [Intent Solutions](https://intentsolutions.io) | [jeremylongshore.com](https://jeremylongshore.com)*
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Metrics Collection
|
|
2
|
+
|
|
3
|
+
## Metrics Collection
|
|
4
|
+
|
|
5
|
+
### Key Metrics
|
|
6
|
+
|
|
7
|
+
| Metric | Type | Description |
|
|
8
|
+
|--------|------|-------------|
|
|
9
|
+
| `vercel_requests_total` | Counter | Total API requests |
|
|
10
|
+
| `vercel_request_duration_seconds` | Histogram | Request latency |
|
|
11
|
+
| `vercel_errors_total` | Counter | Error count by type |
|
|
12
|
+
| `vercel_rate_limit_remaining` | Gauge | Rate limit headroom |
|
|
13
|
+
|
|
14
|
+
### Prometheus Metrics
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { Registry, Counter, Histogram, Gauge } from 'prom-client';
|
|
18
|
+
|
|
19
|
+
const registry = new Registry();
|
|
20
|
+
|
|
21
|
+
const requestCounter = new Counter({
|
|
22
|
+
name: 'vercel_requests_total',
|
|
23
|
+
help: 'Total Vercel API requests',
|
|
24
|
+
labelNames: ['method', 'status'],
|
|
25
|
+
registers: [registry],
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const requestDuration = new Histogram({
|
|
29
|
+
name: 'vercel_request_duration_seconds',
|
|
30
|
+
help: 'Vercel request duration',
|
|
31
|
+
labelNames: ['method'],
|
|
32
|
+
buckets: [0.05, 0.1, 0.25, 0.5, 1, 2.5, 5],
|
|
33
|
+
registers: [registry],
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const errorCounter = new Counter({
|
|
37
|
+
name: 'vercel_errors_total',
|
|
38
|
+
help: 'Vercel errors by type',
|
|
39
|
+
labelNames: ['error_type'],
|
|
40
|
+
registers: [registry],
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Instrumented Client
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
async function instrumentedRequest<T>(
|
|
48
|
+
method: string,
|
|
49
|
+
operation: () => Promise<T>
|
|
50
|
+
): Promise<T> {
|
|
51
|
+
const timer = requestDuration.startTimer({ method });
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const result = await operation();
|
|
55
|
+
requestCounter.inc({ method, status: 'success' });
|
|
56
|
+
return result;
|
|
57
|
+
} catch (error: any) {
|
|
58
|
+
requestCounter.inc({ method, status: 'error' });
|
|
59
|
+
errorCounter.inc({ error_type: error.code || 'unknown' });
|
|
60
|
+
throw error;
|
|
61
|
+
} finally {
|
|
62
|
+
timer();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|