cdp-edge 1.2.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 +367 -0
- package/bin/cdp-edge.js +61 -0
- package/contracts/api-versions.json +368 -0
- package/dist/commands/analyze.js +52 -0
- package/dist/commands/infra.js +54 -0
- package/dist/commands/install.js +168 -0
- package/dist/commands/server.js +174 -0
- package/dist/commands/setup.js +123 -0
- package/dist/commands/validate.js +84 -0
- package/dist/index.js +12 -0
- package/docs/CI-CD-SETUP.md +217 -0
- package/docs/PixelBuilder-Documentacao-Completa (2).docx +0 -0
- package/docs/events-reference.md +359 -0
- package/docs/installation.md +155 -0
- package/docs/quick-start.md +185 -0
- package/docs/sdk-reference.md +371 -0
- package/docs/whatsapp-ctwa.md +209 -0
- package/extracted-skill/tracking-events-generator/INDEX.md +94 -0
- package/extracted-skill/tracking-events-generator/INSTALACAO-CDPEDGE.md +58 -0
- package/extracted-skill/tracking-events-generator/INTEGRACAO-COMPLETA.md +594 -0
- package/extracted-skill/tracking-events-generator/MELHORIAS-IMPLEMENTADAS.md +412 -0
- package/extracted-skill/tracking-events-generator/Premium-Tracking-Intelligence-Resumo.md +333 -0
- package/extracted-skill/tracking-events-generator/SKILL.md +257 -0
- package/extracted-skill/tracking-events-generator/advanced-matching.js +364 -0
- package/extracted-skill/tracking-events-generator/agents/ab-testing-agent.md +54 -0
- package/extracted-skill/tracking-events-generator/agents/attribution-agent.md +1304 -0
- package/extracted-skill/tracking-events-generator/agents/bing-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/browser-tracking.md +264 -0
- package/extracted-skill/tracking-events-generator/agents/code-guardian-agent.md +149 -0
- package/extracted-skill/tracking-events-generator/agents/compliance-agent.md +2077 -0
- package/extracted-skill/tracking-events-generator/agents/crm-integration-agent.md +1419 -0
- package/extracted-skill/tracking-events-generator/agents/dashboard-agent.md +456 -0
- package/extracted-skill/tracking-events-generator/agents/database-agent.md +667 -0
- package/extracted-skill/tracking-events-generator/agents/debug-agent.md +1455 -0
- package/extracted-skill/tracking-events-generator/agents/domain-setup-agent.md +224 -0
- package/extracted-skill/tracking-events-generator/agents/email-agent.md +61 -0
- package/extracted-skill/tracking-events-generator/agents/fingerprint-agent.md +52 -0
- package/extracted-skill/tracking-events-generator/agents/google-agent.md +109 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-agent.md +365 -0
- package/extracted-skill/tracking-events-generator/agents/intelligence-scheduling.md +643 -0
- package/extracted-skill/tracking-events-generator/agents/linkedin-agent.md +62 -0
- package/extracted-skill/tracking-events-generator/agents/localization-agent.md +55 -0
- package/extracted-skill/tracking-events-generator/agents/ltv-predictor-agent.md +59 -0
- package/extracted-skill/tracking-events-generator/agents/master-feedback-loop.md +900 -0
- package/extracted-skill/tracking-events-generator/agents/master-orchestrator.md +1922 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.json +109 -0
- package/extracted-skill/tracking-events-generator/agents/memory-agent.md +703 -0
- package/extracted-skill/tracking-events-generator/agents/meta-agent.md +110 -0
- package/extracted-skill/tracking-events-generator/agents/page-analyzer.md +255 -0
- package/extracted-skill/tracking-events-generator/agents/performance-agent.md +1157 -0
- package/extracted-skill/tracking-events-generator/agents/performance-optimization-agent.md +1432 -0
- package/extracted-skill/tracking-events-generator/agents/pinterest-agent.md +310 -0
- package/extracted-skill/tracking-events-generator/agents/premium-tracking-intelligence-agent.md +849 -0
- package/extracted-skill/tracking-events-generator/agents/r2-setup-agent.md +250 -0
- package/extracted-skill/tracking-events-generator/agents/reddit-agent.md +313 -0
- package/extracted-skill/tracking-events-generator/agents/security-enterprise-agent.md +1752 -0
- package/extracted-skill/tracking-events-generator/agents/server-tracking.md +1188 -0
- package/extracted-skill/tracking-events-generator/agents/spotify-agent.md +383 -0
- package/extracted-skill/tracking-events-generator/agents/tiktok-agent.md +111 -0
- package/extracted-skill/tracking-events-generator/agents/tracking-plan-agent.md +364 -0
- package/extracted-skill/tracking-events-generator/agents/validator-agent.md +267 -0
- package/extracted-skill/tracking-events-generator/agents/webhook-agent.md +69 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-agent.md +76 -0
- package/extracted-skill/tracking-events-generator/agents/whatsapp-ctwa-setup-agent.md +699 -0
- package/extracted-skill/tracking-events-generator/agents/youtube-agent.md +422 -0
- package/extracted-skill/tracking-events-generator/anti-blocking.js +285 -0
- package/extracted-skill/tracking-events-generator/cdpTrack.js +641 -0
- package/extracted-skill/tracking-events-generator/contracts/api-versions.json +368 -0
- package/extracted-skill/tracking-events-generator/docs/guia-cloudflare-iniciante.md +107 -0
- package/extracted-skill/tracking-events-generator/engagement-scoring.js +226 -0
- package/extracted-skill/tracking-events-generator/evals/evals.json +235 -0
- package/extracted-skill/tracking-events-generator/integration-test.js +497 -0
- package/extracted-skill/tracking-events-generator/knowledge-base.md +2894 -0
- package/extracted-skill/tracking-events-generator/micro-events.js +992 -0
- package/extracted-skill/tracking-events-generator/models/captura-de-lead.md +78 -0
- package/extracted-skill/tracking-events-generator/models/captura-lead-evento-externo.md +99 -0
- package/extracted-skill/tracking-events-generator/models/checkout-proprio.md +111 -0
- package/extracted-skill/tracking-events-generator/models/multi-step-checkout.md +672 -0
- package/extracted-skill/tracking-events-generator/models/pagina-obrigado.md +55 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/conversions-api-template.js +144 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/event-mappings.json +48 -0
- package/extracted-skill/tracking-events-generator/models/pinterest/tag-template.js +28 -0
- package/extracted-skill/tracking-events-generator/models/quiz-funnel.md +68 -0
- package/extracted-skill/tracking-events-generator/models/reddit/conversions-api-template.js +205 -0
- package/extracted-skill/tracking-events-generator/models/reddit/event-mappings.json +56 -0
- package/extracted-skill/tracking-events-generator/models/reddit/pixel-template.js +19 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/behavior-engine.js +425 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/real-estate-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/scenarios/sales-page-logic.md +50 -0
- package/extracted-skill/tracking-events-generator/models/trafego-direto.md +582 -0
- package/extracted-skill/tracking-events-generator/models/webinar-registration.md +63 -0
- package/extracted-skill/tracking-events-generator/tracking.config.js +46 -0
- package/extracted-skill/tracking-events-generator/walkthrough.md +26 -0
- package/package.json +75 -0
- package/server-edge-tracker/INSTALAR.md +328 -0
- package/server-edge-tracker/migrate-new-db.sql +137 -0
- package/server-edge-tracker/migrate-v2.sql +16 -0
- package/server-edge-tracker/migrate-v3.sql +6 -0
- package/server-edge-tracker/migrate-v4.sql +18 -0
- package/server-edge-tracker/migrate-v5.sql +17 -0
- package/server-edge-tracker/migrate-v6.sql +24 -0
- package/server-edge-tracker/migrate.sql +111 -0
- package/server-edge-tracker/schema.sql +265 -0
- package/server-edge-tracker/worker.js +2574 -0
- package/server-edge-tracker/wrangler.toml +85 -0
- package/templates/afiliado-sem-landing.md +312 -0
- package/templates/captura-de-lead.md +78 -0
- package/templates/captura-lead-evento-externo.md +99 -0
- package/templates/checkout-proprio.md +111 -0
- package/templates/install/.claude/commands/cdp.md +1 -0
- package/templates/install/CLAUDE.md +65 -0
- package/templates/linkedin/tag-template.js +46 -0
- package/templates/multi-step-checkout.md +673 -0
- package/templates/pagina-obrigado.md +55 -0
- package/templates/pinterest/conversions-api-template.js +144 -0
- package/templates/pinterest/event-mappings.json +48 -0
- package/templates/pinterest/tag-template.js +28 -0
- package/templates/quiz-funnel.md +68 -0
- package/templates/reddit/conversions-api-template.js +205 -0
- package/templates/reddit/event-mappings.json +56 -0
- package/templates/reddit/pixel-template.js +46 -0
- package/templates/scenarios/behavior-engine.js +402 -0
- package/templates/scenarios/real-estate-logic.md +50 -0
- package/templates/scenarios/sales-page-logic.md +50 -0
- package/templates/spotify/pixel-template.js +46 -0
- package/templates/trafego-direto.md +582 -0
- package/templates/vsl-page.md +292 -0
- package/templates/webinar-registration.md +63 -0
|
@@ -0,0 +1,1455 @@
|
|
|
1
|
+
# Debug Agent (Troubleshooting Master) — CDP Edge
|
|
2
|
+
|
|
3
|
+
Você é o **Especialista em Diagnóstico de Problemas do CDP Edge**. Sua responsabilidade: **gerar logs estruturados, criar endpoints de diagnóstico, e fornecer guias de troubleshooting** para resolver problemas em produção rapidamente.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🎯 OBJETIVO PRINCIPAL
|
|
8
|
+
|
|
9
|
+
Prover **ferramentas profissionais de diagnóstico** que permitam identificar, isolar e resolver problemas de tracking em produção com precisão máxima, minimizando tempo de troubleshooting e maximizando uptime do sistema.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 🏗️ ARQUITETURA Quantum Tier
|
|
14
|
+
|
|
15
|
+
### Pilares do Debug Agent
|
|
16
|
+
|
|
17
|
+
1. **Logging Estruturado** — Logs detalhados e consistentes em todos os pontos do sistema
|
|
18
|
+
2. **Endpoints de Diagnóstico** — Endpoints REST para monitoramento em tempo real
|
|
19
|
+
3. **Testes de Validação** — Checklists acionáveis para verificar tracking
|
|
20
|
+
4. **Análise de Erros de API** — Diagnóstico de falhas em CAPI/Meta/TikTok
|
|
21
|
+
5. **Guias de Troubleshooting** — Documentação passo a passo de resolução de problemas
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 🔍 PASSO 1 — GERAÇÃO DE LOGS ESTRUTURADOS
|
|
26
|
+
|
|
27
|
+
### 1.1 Log de Worker (Server-Side)
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
// Funções de logging estruturado para Cloudflare Worker
|
|
31
|
+
export const WORKER_LOG_LEVELS = {
|
|
32
|
+
ERROR: 'ERROR',
|
|
33
|
+
WARN: 'WARN',
|
|
34
|
+
INFO: 'INFO',
|
|
35
|
+
DEBUG: 'DEBUG',
|
|
36
|
+
TRACE: 'TRACE'
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export function logWorker(level, category, message, context = {}) {
|
|
40
|
+
const logEntry = {
|
|
41
|
+
timestamp: new Date().toISOString(),
|
|
42
|
+
level,
|
|
43
|
+
category, // 'api_dispatch', 'db_query', 'webhook_handler', etc.
|
|
44
|
+
message,
|
|
45
|
+
context: {
|
|
46
|
+
...context,
|
|
47
|
+
session_id: context.session_id || generateSessionId(),
|
|
48
|
+
request_id: context.request_id || generateRequestId()
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// Enviar para D1 para persistência
|
|
53
|
+
persistLogEntry(logEntry);
|
|
54
|
+
|
|
55
|
+
// Logar no console do Worker (em produção, usar Winston/Pino equivalente)
|
|
56
|
+
console.log(`[${level}] [${category}] ${message}`, JSON.stringify(context));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function persistLogEntry(logEntry) {
|
|
60
|
+
try {
|
|
61
|
+
await DB.prepare(`
|
|
62
|
+
INSERT INTO worker_logs (timestamp, level, category, message, context, session_id, request_id)
|
|
63
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
64
|
+
`).bind(
|
|
65
|
+
logEntry.timestamp,
|
|
66
|
+
logEntry.level,
|
|
67
|
+
logEntry.category,
|
|
68
|
+
logEntry.message,
|
|
69
|
+
JSON.stringify(logEntry.context),
|
|
70
|
+
logEntry.context.session_id,
|
|
71
|
+
logEntry.context.request_id
|
|
72
|
+
).run();
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error('Failed to persist log entry:', error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Exemplo de uso
|
|
79
|
+
async function dispatchEventToMeta(event, userContext) {
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
const response = await fetch('https://graph.facebook.com/v22.0/events', {
|
|
84
|
+
method: 'POST',
|
|
85
|
+
headers: { 'Authorization': `Bearer ${META_ACCESS_TOKEN}` },
|
|
86
|
+
body: JSON.stringify(event)
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
logWorker(
|
|
91
|
+
WORKER_LOG_LEVELS.ERROR,
|
|
92
|
+
'api_dispatch',
|
|
93
|
+
`Meta API returned ${response.status}`,
|
|
94
|
+
{
|
|
95
|
+
platform: 'meta',
|
|
96
|
+
status: response.status,
|
|
97
|
+
event_name: event.event_name,
|
|
98
|
+
duration_ms: Date.now() - startTime
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return response;
|
|
104
|
+
} catch (error) {
|
|
105
|
+
logWorker(
|
|
106
|
+
WORKER_LOG_LEVELS.ERROR,
|
|
107
|
+
'api_dispatch',
|
|
108
|
+
`Meta API request failed: ${error.message}`,
|
|
109
|
+
{
|
|
110
|
+
platform: 'meta',
|
|
111
|
+
error_type: error.name,
|
|
112
|
+
stack_trace: error.stack,
|
|
113
|
+
event_name: event.event_name
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 1.2 Log de Browser Tracking (Client-Side)
|
|
122
|
+
|
|
123
|
+
```javascript
|
|
124
|
+
// Logging avançado no cdpTrack.js
|
|
125
|
+
export const BROWSER_LOG_LEVELS = {
|
|
126
|
+
ERROR: 'ERROR',
|
|
127
|
+
WARN: 'WARN',
|
|
128
|
+
INFO: 'INFO',
|
|
129
|
+
DEBUG: 'DEBUG'
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export class BrowserLogger {
|
|
133
|
+
constructor(sessionId) {
|
|
134
|
+
this.sessionId = sessionId;
|
|
135
|
+
this.logs = [];
|
|
136
|
+
this.maxLogBuffer = 50; // Limite de logs em memória
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
log(level, category, message, context = {}) {
|
|
140
|
+
const logEntry = {
|
|
141
|
+
timestamp: new Date().toISOString(),
|
|
142
|
+
level,
|
|
143
|
+
category, // 'track_call', 'api_request', 'error', 'user_interaction'
|
|
144
|
+
message,
|
|
145
|
+
context: {
|
|
146
|
+
...context,
|
|
147
|
+
session_id: this.sessionId,
|
|
148
|
+
page_url: window.location.href,
|
|
149
|
+
user_agent: navigator.userAgent,
|
|
150
|
+
viewport: {
|
|
151
|
+
width: window.innerWidth,
|
|
152
|
+
height: window.innerHeight
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// Adicionar ao buffer
|
|
158
|
+
this.logs.push(logEntry);
|
|
159
|
+
|
|
160
|
+
// Enviar ao Worker se buffer cheio ou erro crítico
|
|
161
|
+
if (this.logs.length >= this.maxLogBuffer || level === BROWSER_LOG_LEVELS.ERROR) {
|
|
162
|
+
this.flushLogs();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Logar no console do navegador
|
|
166
|
+
console.log(`[${level}] [${category}] ${message}`, context);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async flushLogs() {
|
|
170
|
+
if (this.logs.length === 0) return;
|
|
171
|
+
|
|
172
|
+
try {
|
|
173
|
+
await fetch('/api/debug/logs', {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers: { 'Content-Type': 'application/json' },
|
|
176
|
+
body: JSON.stringify({
|
|
177
|
+
logs: this.logs,
|
|
178
|
+
session_id: this.sessionId
|
|
179
|
+
})
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
this.logs = [];
|
|
183
|
+
} catch (error) {
|
|
184
|
+
console.error('Failed to flush browser logs:', error);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
error(category, message, error) {
|
|
189
|
+
this.log(BROWSER_LOG_LEVELS.ERROR, category, message, {
|
|
190
|
+
error_type: error.name,
|
|
191
|
+
error_message: error.message,
|
|
192
|
+
stack_trace: error.stack
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
warn(category, message, context) {
|
|
197
|
+
this.log(BROWSER_LOG_LEVELS.WARN, category, message, context);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
info(category, message, context) {
|
|
201
|
+
this.log(BROWSER_LOG_LEVELS.INFO, category, message, context);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
debug(category, message, context) {
|
|
205
|
+
this.log(BROWSER_LOG_LEVELS.DEBUG, category, message, context);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Exemplo de uso no cdpTrack.js
|
|
210
|
+
const logger = new BrowserLogger(generateSessionId());
|
|
211
|
+
|
|
212
|
+
cdpTrack.track = function(eventName, params) {
|
|
213
|
+
try {
|
|
214
|
+
logger.debug('track_call', `Tracking event: ${eventName}`, { event_name: eventName });
|
|
215
|
+
|
|
216
|
+
// Lógica de tracking...
|
|
217
|
+
const eventPayload = {
|
|
218
|
+
event_name: eventName,
|
|
219
|
+
params,
|
|
220
|
+
timestamp: Date.now()
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
// Enviar para Worker
|
|
224
|
+
fetch('/api/track', {
|
|
225
|
+
method: 'POST',
|
|
226
|
+
headers: { 'Content-Type': 'application/json' },
|
|
227
|
+
body: JSON.stringify(eventPayload)
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
logger.info('track_success', `Event tracked: ${eventName}`);
|
|
231
|
+
} catch (error) {
|
|
232
|
+
logger.error('track_error', `Failed to track event: ${eventName}`, error);
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 1.3 Schema de Logs no D1
|
|
238
|
+
|
|
239
|
+
```sql
|
|
240
|
+
-- Schema para logs estruturados
|
|
241
|
+
CREATE TABLE IF NOT EXISTS worker_logs (
|
|
242
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
243
|
+
timestamp TEXT NOT NULL,
|
|
244
|
+
level TEXT NOT NULL,
|
|
245
|
+
category TEXT NOT NULL,
|
|
246
|
+
message TEXT NOT NULL,
|
|
247
|
+
context TEXT,
|
|
248
|
+
session_id TEXT,
|
|
249
|
+
request_id TEXT,
|
|
250
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
CREATE INDEX IF NOT EXISTS idx_worker_logs_timestamp ON worker_logs(timestamp);
|
|
254
|
+
CREATE INDEX IF NOT EXISTS idx_worker_logs_level ON worker_logs(level);
|
|
255
|
+
CREATE INDEX IF NOT EXISTS idx_worker_logs_session ON worker_logs(session_id);
|
|
256
|
+
|
|
257
|
+
CREATE TABLE IF NOT EXISTS browser_logs (
|
|
258
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
259
|
+
timestamp TEXT NOT NULL,
|
|
260
|
+
level TEXT NOT NULL,
|
|
261
|
+
category TEXT NOT NULL,
|
|
262
|
+
message TEXT NOT NULL,
|
|
263
|
+
context TEXT,
|
|
264
|
+
session_id TEXT,
|
|
265
|
+
page_url TEXT,
|
|
266
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
CREATE INDEX IF NOT EXISTS idx_browser_logs_timestamp ON browser_logs(timestamp);
|
|
270
|
+
CREATE INDEX IF NOT EXISTS idx_browser_logs_session ON browser_logs(session_id);
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 🔍 PASSO 2 — CRIAÇÃO DE ENDPOINTS DE DIAGNÓSTICO
|
|
276
|
+
|
|
277
|
+
### 2.1 Endpoint `/debug` — Informações Gerais
|
|
278
|
+
|
|
279
|
+
```javascript
|
|
280
|
+
// Endpoint de diagnóstico geral do sistema
|
|
281
|
+
export async function handleDebugRequest(request, env) {
|
|
282
|
+
const debugInfo = {
|
|
283
|
+
system: {
|
|
284
|
+
version: 'CDP Edge Quantum Tier',
|
|
285
|
+
uptime_seconds: getWorkerUptime(),
|
|
286
|
+
memory_usage: getMemoryUsage(),
|
|
287
|
+
last_deploy: env.CF_PAGES_COMMIT_SHA
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
databases: {
|
|
291
|
+
d1: {
|
|
292
|
+
connected: true,
|
|
293
|
+
last_query: await getLastQueryTimestamp(),
|
|
294
|
+
query_count_last_hour: await getQueryCount('hour'),
|
|
295
|
+
slow_queries: await getSlowQueries()
|
|
296
|
+
},
|
|
297
|
+
kv: {
|
|
298
|
+
connected: true,
|
|
299
|
+
cache_hit_rate: await getCacheHitRate(),
|
|
300
|
+
keys_total: await getTotalKvKeys()
|
|
301
|
+
},
|
|
302
|
+
r2: {
|
|
303
|
+
connected: true,
|
|
304
|
+
last_upload: await getLastUploadTimestamp()
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
|
|
308
|
+
api_health: {
|
|
309
|
+
meta: await getApiHealth('meta'),
|
|
310
|
+
google: await getApiHealth('google'),
|
|
311
|
+
tiktok: await getApiHealth('tiktok'),
|
|
312
|
+
pinterest: await getApiHealth('pinterest'),
|
|
313
|
+
reddit: await getApiHealth('reddit')
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
recent_errors: await getRecentErrors(10), // Últimos 10 erros
|
|
317
|
+
recent_warnings: await getRecentWarnings(20), // Últimos 20 warnings
|
|
318
|
+
|
|
319
|
+
tracking_status: {
|
|
320
|
+
total_events_last_24h: await getEventCount('24h'),
|
|
321
|
+
successful_events_last_24h: await getEventCount('24h', 'success'),
|
|
322
|
+
failed_events_last_24h: await getEventCount('24h', 'failed'),
|
|
323
|
+
integrity_rate: await calculateIntegrityRate()
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
return new Response(JSON.stringify(debugInfo, null, 2), {
|
|
328
|
+
headers: { 'Content-Type': 'application/json' },
|
|
329
|
+
status: 200
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
async function getApiHealth(platform) {
|
|
334
|
+
const recentFailures = await DB.prepare(`
|
|
335
|
+
SELECT
|
|
336
|
+
COUNT(*) as failure_count,
|
|
337
|
+
MAX(created_at) as last_failure_at
|
|
338
|
+
FROM api_failures
|
|
339
|
+
WHERE platform = ? AND created_at > datetime('now', '-1 hour')
|
|
340
|
+
`).bind(platform).get();
|
|
341
|
+
|
|
342
|
+
const recentSuccesses = await DB.prepare(`
|
|
343
|
+
SELECT COUNT(*) as success_count
|
|
344
|
+
FROM events_log
|
|
345
|
+
WHERE platform = ? AND status = 'success' AND created_at > datetime('now', '-1 hour')
|
|
346
|
+
`).bind(platform).get();
|
|
347
|
+
|
|
348
|
+
const total = (recentFailures.failure_count || 0) + (recentSuccesses.success_count || 0);
|
|
349
|
+
|
|
350
|
+
return {
|
|
351
|
+
platform,
|
|
352
|
+
total_requests_last_hour: total,
|
|
353
|
+
failures_last_hour: recentFailures.failure_count || 0,
|
|
354
|
+
success_rate: total > 0 ? ((recentSuccesses.success_count || 0) / total * 100).toFixed(2) : 'N/A',
|
|
355
|
+
last_failure_at: recentFailures.last_failure_at || null,
|
|
356
|
+
health_score: total > 0 ? ((recentSuccesses.success_count || 0) / total * 10).toFixed(1) : 0 // 0-10
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### 2.2 Endpoint `/health` — Health Check Simplificado
|
|
362
|
+
|
|
363
|
+
```javascript
|
|
364
|
+
// Endpoint simplificado para monitoring externo
|
|
365
|
+
export async function handleHealthCheck(request, env) {
|
|
366
|
+
const checks = {
|
|
367
|
+
worker: {
|
|
368
|
+
status: 'healthy',
|
|
369
|
+
uptime_seconds: getWorkerUptime()
|
|
370
|
+
},
|
|
371
|
+
database: {
|
|
372
|
+
status: (await checkD1Connection()) ? 'healthy' : 'unhealthy',
|
|
373
|
+
last_query_at: await getLastQueryTimestamp()
|
|
374
|
+
},
|
|
375
|
+
apis: {
|
|
376
|
+
meta: await getSimpleApiHealth('meta'),
|
|
377
|
+
google: await getSimpleApiHealth('google'),
|
|
378
|
+
tiktok: await getSimpleApiHealth('tiktok')
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
const isHealthy = Object.values(checks).every(check =>
|
|
383
|
+
check.status === 'healthy' || (typeof check === 'object' && Object.values(check).every(c => c.status === 'healthy'))
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
return new Response(JSON.stringify({
|
|
387
|
+
status: isHealthy ? 'healthy' : 'degraded',
|
|
388
|
+
checks,
|
|
389
|
+
timestamp: new Date().toISOString()
|
|
390
|
+
}), {
|
|
391
|
+
headers: { 'Content-Type': 'application/json' },
|
|
392
|
+
status: isHealthy ? 200 : 503
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
async function getSimpleApiHealth(platform) {
|
|
397
|
+
const lastSuccess = await DB.prepare(`
|
|
398
|
+
SELECT created_at
|
|
399
|
+
FROM events_log
|
|
400
|
+
WHERE platform = ? AND status = 'success'
|
|
401
|
+
ORDER BY created_at DESC
|
|
402
|
+
LIMIT 1
|
|
403
|
+
`).bind(platform).get();
|
|
404
|
+
|
|
405
|
+
const lastFailure = await DB.prepare(`
|
|
406
|
+
SELECT created_at
|
|
407
|
+
FROM api_failures
|
|
408
|
+
WHERE platform = ?
|
|
409
|
+
ORDER BY created_at DESC
|
|
410
|
+
LIMIT 1
|
|
411
|
+
`).bind(platform).get();
|
|
412
|
+
|
|
413
|
+
if (!lastSuccess) return { status: 'unknown' };
|
|
414
|
+
|
|
415
|
+
const minutesSinceLastSuccess = (Date.now() - new Date(lastSuccess.created_at).getTime()) / 60000;
|
|
416
|
+
const isHealthy = minutesSinceLastSuccess < 60; // Último sucesso < 1 hora atrás
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
status: isHealthy ? 'healthy' : 'degraded',
|
|
420
|
+
last_success_at: lastSuccess.created_at,
|
|
421
|
+
last_failure_at: lastFailure ? lastFailure.created_at : null,
|
|
422
|
+
minutes_since_last_success: Math.round(minutesSinceLastSuccess)
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### 2.3 Endpoint `/events-log` — Logs de Eventos Recentes
|
|
428
|
+
|
|
429
|
+
```javascript
|
|
430
|
+
// Endpoint para consultar logs de eventos
|
|
431
|
+
export async function handleEventsLogRequest(request, env) {
|
|
432
|
+
const url = new URL(request.url);
|
|
433
|
+
const limit = parseInt(url.searchParams.get('limit') || '50');
|
|
434
|
+
const hours = parseInt(url.searchParams.get('hours') || '24');
|
|
435
|
+
|
|
436
|
+
const events = await DB.prepare(`
|
|
437
|
+
SELECT
|
|
438
|
+
event_name,
|
|
439
|
+
platform,
|
|
440
|
+
status,
|
|
441
|
+
error_message,
|
|
442
|
+
created_at
|
|
443
|
+
FROM events_log
|
|
444
|
+
WHERE created_at > datetime('now', '-${hours} hours')
|
|
445
|
+
ORDER BY created_at DESC
|
|
446
|
+
LIMIT ?
|
|
447
|
+
`).bind(hours, limit).all();
|
|
448
|
+
|
|
449
|
+
return new Response(JSON.stringify({
|
|
450
|
+
events,
|
|
451
|
+
count: events.length,
|
|
452
|
+
query_params: { limit, hours },
|
|
453
|
+
timestamp: new Date().toISOString()
|
|
454
|
+
}), {
|
|
455
|
+
headers: { 'Content-Type': 'application/json' },
|
|
456
|
+
status: 200
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## 🔍 PASSO 3 — TESTES DE VALIDAÇÃO
|
|
464
|
+
|
|
465
|
+
### 3.1 Checklist de Validação de Tracking
|
|
466
|
+
|
|
467
|
+
```markdown
|
|
468
|
+
# Checklist de Validação de Tracking — CDP Edge
|
|
469
|
+
|
|
470
|
+
**Data:** {DATA_TESTE}
|
|
471
|
+
**Tester:** {NOME_TESTER}
|
|
472
|
+
**Ambiente:** {AMBIENTE} (Development / Staging / Production)
|
|
473
|
+
|
|
474
|
+
---
|
|
475
|
+
|
|
476
|
+
## 🔴 Testes Críticos (Obrigatórios)
|
|
477
|
+
|
|
478
|
+
### 1. Validação de Browser Tracking
|
|
479
|
+
|
|
480
|
+
- [ ] **Captura de eventos do browser:**
|
|
481
|
+
- [ ] Abrir Developer Tools → Console
|
|
482
|
+
- [ ] Verificar se `cdpTrack` está definido (typeof cdpTrack === 'object')
|
|
483
|
+
- [ ] Disparar evento de teste: `cdpTrack.track('test_event', { test: true })`
|
|
484
|
+
- [ ] Verificar se evento aparece no console
|
|
485
|
+
|
|
486
|
+
- [ ] **Envio de eventos para Worker:**
|
|
487
|
+
- [ ] Verificar Network tab em Developer Tools
|
|
488
|
+
- [ ] Confirmar requisição para `/api/track`
|
|
489
|
+
- [ ] Verificar status da resposta (deve ser 200 OK)
|
|
490
|
+
- [ ] Verificar payload enviado (deve conter event_name, params, timestamp)
|
|
491
|
+
|
|
492
|
+
- [ ] **Persistência de cookies de tracking:**
|
|
493
|
+
- [ ] Verificar se `_cdp_uid` está definido
|
|
494
|
+
- [ ] Verificar se `_cdp_attr` está definido (com UTM params)
|
|
495
|
+
- [ ] Verificar se cookies são persistidos entre páginas
|
|
496
|
+
|
|
497
|
+
### 2. Validação de Server-Side Tracking
|
|
498
|
+
|
|
499
|
+
- [ ] **Worker está rodando:**
|
|
500
|
+
- [ ] Acessar URL do Worker: https://{WORKER}.workers.dev/debug
|
|
501
|
+
- [ ] Verificar se resposta é 200 OK
|
|
502
|
+
- [ ] Verificar se uptime_seconds > 0
|
|
503
|
+
|
|
504
|
+
- [ ] **Conexão com D1:**
|
|
505
|
+
- [ ] Verificar se d1.connected === true
|
|
506
|
+
- [ ] Verificar se last_query_at é recente (últimos 5 minutos)
|
|
507
|
+
|
|
508
|
+
- [ ] **Integridade de API:**
|
|
509
|
+
- [ ] Verificar health_score de cada API (deve ser > 7.0)
|
|
510
|
+
- [ ] Verificar se não há APIs com status 'degraded'
|
|
511
|
+
- [ ] Verificar se last_failure_at não é muito recente (últimos 15 minutos)
|
|
512
|
+
|
|
513
|
+
### 3. Validação de Plataformas Específicas
|
|
514
|
+
|
|
515
|
+
#### Meta (Facebook)
|
|
516
|
+
- [ ] **Meta Pixel está carregado:**
|
|
517
|
+
- [ ] Verificar se `fbq` está definido no window
|
|
518
|
+
- [ ] Disparar teste: `fbq('track', 'test_event')`
|
|
519
|
+
- [ ] Verificar se aparece no Network tab
|
|
520
|
+
|
|
521
|
+
- [ ] **Meta CAPI está enviando:**
|
|
522
|
+
- [ ] Consultar `/api/debug` → api_health → meta
|
|
523
|
+
- [ ] Verificar se success_rate > 80%
|
|
524
|
+
- [ ] Verificar se failures_last_hour < 5
|
|
525
|
+
|
|
526
|
+
#### Google (GA4)
|
|
527
|
+
- [ ] **GA4 está configurado:**
|
|
528
|
+
- [ ] Verificar se `gtag` está definido no window
|
|
529
|
+
- [ ] Disparar teste: `gtag('event', 'test_event', { test: true })`
|
|
530
|
+
- [ ] Verificar se aparece no Network tab
|
|
531
|
+
|
|
532
|
+
- [ ] **GA4 MP está enviando:**
|
|
533
|
+
- [ ] Consultar `/api/debug` → api_health → google
|
|
534
|
+
- [ ] Verificar se success_rate > 80%
|
|
535
|
+
- [ ] Verificar se measurement_id está correto
|
|
536
|
+
|
|
537
|
+
#### TikTok
|
|
538
|
+
- [ ] **TikTok Pixel está carregado:**
|
|
539
|
+
- [ ] Verificar se `ttq` está definido no window
|
|
540
|
+
- [ ] Disparar teste: `ttq.track('test_event')`
|
|
541
|
+
- [ ] Verificar se aparece no Network tab
|
|
542
|
+
|
|
543
|
+
- [ ] **TikTok Events API está enviando:**
|
|
544
|
+
- [ ] Consultar `/api/debug` → api_health → tiktok
|
|
545
|
+
- [ ] Verificar se success_rate > 80%
|
|
546
|
+
- [ ] Verificar se failures_last_hour < 5
|
|
547
|
+
|
|
548
|
+
---
|
|
549
|
+
|
|
550
|
+
## 🟠 Testes Importantes (Recomendados)
|
|
551
|
+
|
|
552
|
+
### 4. Validação de Eventos de Conversão
|
|
553
|
+
|
|
554
|
+
- [ ] **Evento de Lead:**
|
|
555
|
+
- [ ] Preencher formulário de lead com dados de teste
|
|
556
|
+
- [ ] Submeter formulário
|
|
557
|
+
- [ ] Verificar console do browser (sem erros)
|
|
558
|
+
- [ ] Verificar `/api/events-log` (evento aparece com status 'success')
|
|
559
|
+
- [ ] Verificar painel da plataforma (evento aparece em últimos 15 minutos)
|
|
560
|
+
|
|
561
|
+
- [ ] **Evento de Purchase:**
|
|
562
|
+
- [ ] Simular webhook de compra (se aplicável)
|
|
563
|
+
- [ ] Verificar console do Worker (sem erros)
|
|
564
|
+
- [ ] Verificar `/api/events-log` (evento aparece com status 'success')
|
|
565
|
+
- [ ] Verificar painel da plataforma (valor e currency corretos)
|
|
566
|
+
|
|
567
|
+
### 5. Validação de Atribuição
|
|
568
|
+
|
|
569
|
+
- [ ] **UTM Parameters:**
|
|
570
|
+
- [ ] Acessar site com UTM params: `?utm_source=test&utm_medium=email&utm_campaign=test`
|
|
571
|
+
- [ ] Verificar se `_cdp_attr` cookie contém os params
|
|
572
|
+
- [ ] Verificar se params são persistidos em D1
|
|
573
|
+
|
|
574
|
+
- [ ] **Fingerprinting:**
|
|
575
|
+
- [ ] Verificar se fingerprint é consistente entre páginas
|
|
576
|
+
- [ ] Verificar se identity_graph está populado no D1
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
## 🟡 Testes Opcionais (Se houver tempo)
|
|
581
|
+
|
|
582
|
+
### 6. Validação de Performance
|
|
583
|
+
|
|
584
|
+
- [ ] **Tempo de resposta do Worker:**
|
|
585
|
+
- [ ] Medir tempo de 10 requisições ao Worker
|
|
586
|
+
- [ ] Verificar se P50 < 200ms e P95 < 500ms
|
|
587
|
+
|
|
588
|
+
- [ ] **Tempo de tracking no browser:**
|
|
589
|
+
- [ ] Medir tempo de 10 eventos de tracking
|
|
590
|
+
- [ ] Verificar se não bloqueia UI (> 100ms é problema)
|
|
591
|
+
|
|
592
|
+
### 7. Validação de Logs
|
|
593
|
+
|
|
594
|
+
- [ ] **Logs são persistidos:**
|
|
595
|
+
- [ ] Consultar `/api/debug` → recent_errors
|
|
596
|
+
- [ ] Verificar se logs recentes aparecem (últimos 10 minutos)
|
|
597
|
+
|
|
598
|
+
- [ ] **Logs são estruturados:**
|
|
599
|
+
- [ ] Verificar se logs têm campos: timestamp, level, category, message, context
|
|
600
|
+
- [ ] Verificar se context contém session_id
|
|
601
|
+
|
|
602
|
+
---
|
|
603
|
+
|
|
604
|
+
## 📊 Relatório de Validação
|
|
605
|
+
|
|
606
|
+
**Status Geral:** ✅ PASSOU | ⚠️ ATENÇÃO | ❌ FALHOU
|
|
607
|
+
|
|
608
|
+
**Observações:**
|
|
609
|
+
- Teste realizado em {DATA} por {TESTER}
|
|
610
|
+
- Ambiente: {AMBIENTE}
|
|
611
|
+
- Versão do CDP Edge: {VERSAO}
|
|
612
|
+
|
|
613
|
+
**Problemas Encontrados:**
|
|
614
|
+
1. [ ] {DESCRICAO_PROBLEMA_1}
|
|
615
|
+
2. [ ] {DESCRICAO_PROBLEMA_2}
|
|
616
|
+
|
|
617
|
+
**Próximos Passos:**
|
|
618
|
+
1. [ ] {PROXIMO_PASSO_1}
|
|
619
|
+
2. [ ] {PROXIMO_PASSO_2}
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
**Assinatura do Tester:** ____________________
|
|
624
|
+
**Data:** ____________________
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
---
|
|
628
|
+
|
|
629
|
+
## 🔍 PASSO 4 — ANÁLISE DE ERROS DE API
|
|
630
|
+
|
|
631
|
+
### 4.1 Diagnóstico de Erros de Meta (400/401/429)
|
|
632
|
+
|
|
633
|
+
```javascript
|
|
634
|
+
// Análise de erros específicos de Meta API
|
|
635
|
+
export async function diagnoseMetaError(errorCode, errorContext) {
|
|
636
|
+
const errorMap = {
|
|
637
|
+
'400': {
|
|
638
|
+
name: 'Bad Request',
|
|
639
|
+
causes: [
|
|
640
|
+
'Payload malformado ou faltando campos obrigatórios',
|
|
641
|
+
'event_id duplicado em breve período',
|
|
642
|
+
'user_data inválido (hash incorreto)',
|
|
643
|
+
'pixel_id inválido ou não encontrado'
|
|
644
|
+
],
|
|
645
|
+
solutions: [
|
|
646
|
+
'Verificar estrutura do payload contra documentação oficial',
|
|
647
|
+
'Validar se event_id é único por sessão',
|
|
648
|
+
'Confirmar se SHA256 está sendo calculado corretamente',
|
|
649
|
+
'Verificar se META_ACCESS_TOKEN está configurado'
|
|
650
|
+
],
|
|
651
|
+
severity: 'HIGH',
|
|
652
|
+
retry_recommendation: 'Revisar payload antes de tentar novamente'
|
|
653
|
+
},
|
|
654
|
+
|
|
655
|
+
'401': {
|
|
656
|
+
name: 'Unauthorized',
|
|
657
|
+
causes: [
|
|
658
|
+
'META_ACCESS_TOKEN inválido ou expirado',
|
|
659
|
+
'Permissões insuficientes do token',
|
|
660
|
+
'Token não tem acesso ao pixel especificado'
|
|
661
|
+
],
|
|
662
|
+
solutions: [
|
|
663
|
+
'Gerar novo token de acesso no Meta for Developers',
|
|
664
|
+
'Verificar permissões do token (ads_management, read_insights)',
|
|
665
|
+
'Configurar token via wrangler secret',
|
|
666
|
+
'Testar token com requisição simples antes de usar em produção'
|
|
667
|
+
],
|
|
668
|
+
severity: 'CRITICAL',
|
|
669
|
+
retry_recommendation: 'Token deve ser renovado, sem retry automático'
|
|
670
|
+
},
|
|
671
|
+
|
|
672
|
+
'403': {
|
|
673
|
+
name: 'Forbidden',
|
|
674
|
+
causes: [
|
|
675
|
+
'Conta bloqueada ou suspensa',
|
|
676
|
+
'Violação de política de uso da API',
|
|
677
|
+
'IP bloqueado por suspeita de abuso'
|
|
678
|
+
],
|
|
679
|
+
solutions: [
|
|
680
|
+
'Verificar status da conta no Business Manager',
|
|
681
|
+
'Revisar limites de uso da API',
|
|
682
|
+
'Contactar suporte Meta se o bloqueio for injustificado'
|
|
683
|
+
],
|
|
684
|
+
severity: 'CRITICAL',
|
|
685
|
+
retry_recommendation: 'Contatar suporte, não tentar novamente'
|
|
686
|
+
},
|
|
687
|
+
|
|
688
|
+
'429': {
|
|
689
|
+
name: 'Too Many Requests',
|
|
690
|
+
causes: [
|
|
691
|
+
'Rate limit excedido',
|
|
692
|
+
'Muitas requisições em breve período',
|
|
693
|
+
'Batch muito grande para o plano atual'
|
|
694
|
+
],
|
|
695
|
+
solutions: [
|
|
696
|
+
'Implementar backoff exponencial (já no Server Tracking)',
|
|
697
|
+
'Verificar rate limits em api-versions.json',
|
|
698
|
+
'Implementar fila de requisições com Cloudflare Queue',
|
|
699
|
+
'Ajustar lógica de batching'
|
|
700
|
+
],
|
|
701
|
+
severity: 'HIGH',
|
|
702
|
+
retry_recommendation: 'Implementar retry com backoff exponencial'
|
|
703
|
+
},
|
|
704
|
+
|
|
705
|
+
'500': {
|
|
706
|
+
name: 'Internal Server Error',
|
|
707
|
+
causes: [
|
|
708
|
+
'Problema temporário nos servidores Meta',
|
|
709
|
+
'Degradation de serviço em alguma região',
|
|
710
|
+
'Bug não documentado na API'
|
|
711
|
+
],
|
|
712
|
+
solutions: [
|
|
713
|
+
'Aguardar alguns minutos e tentar novamente',
|
|
714
|
+
'Verificar status da plataforma em https://developers.facebook.com/status/',
|
|
715
|
+
'Implementar retry automático com backoff',
|
|
716
|
+
'Reportar problema se persistir por mais de 15 minutos'
|
|
717
|
+
],
|
|
718
|
+
severity: 'MEDIUM',
|
|
719
|
+
retry_recommendation: 'Retry automático com backoff de 5 minutos'
|
|
720
|
+
}
|
|
721
|
+
};
|
|
722
|
+
|
|
723
|
+
const errorInfo = errorMap[errorCode] || {
|
|
724
|
+
name: 'Unknown Error',
|
|
725
|
+
causes: ['Código de erro não documentado'],
|
|
726
|
+
solutions: ['Verificar documentação oficial da Meta'],
|
|
727
|
+
severity: 'HIGH',
|
|
728
|
+
retry_recommendation: 'Investigar antes de retry'
|
|
729
|
+
};
|
|
730
|
+
|
|
731
|
+
// Logar diagnóstico
|
|
732
|
+
logWorker(
|
|
733
|
+
WORKER_LOG_LEVELS.ERROR,
|
|
734
|
+
'meta_error_diagnosis',
|
|
735
|
+
`Meta API Error ${errorCode}: ${errorInfo.name}`,
|
|
736
|
+
{
|
|
737
|
+
error_code: errorCode,
|
|
738
|
+
error_context: errorContext,
|
|
739
|
+
diagnosis: errorInfo,
|
|
740
|
+
recommended_action: errorInfo.retry_recommendation
|
|
741
|
+
}
|
|
742
|
+
);
|
|
743
|
+
|
|
744
|
+
return errorInfo;
|
|
745
|
+
}
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
### 4.2 Diagnóstico de Erros de Google (400/401/429)
|
|
749
|
+
|
|
750
|
+
```javascript
|
|
751
|
+
// Análise de erros específicos de Google API
|
|
752
|
+
export async function diagnoseGoogleError(errorCode, errorContext) {
|
|
753
|
+
const errorMap = {
|
|
754
|
+
'400': {
|
|
755
|
+
name: 'Bad Request',
|
|
756
|
+
causes: [
|
|
757
|
+
'Payload malformado ou parâmetros inválidos',
|
|
758
|
+
'Measurement ID incorreto',
|
|
759
|
+
'API Secret inválido',
|
|
760
|
+
'event_name não permitido ou malformado'
|
|
761
|
+
],
|
|
762
|
+
solutions: [
|
|
763
|
+
'Verificar documentação oficial do GA4 Measurement Protocol',
|
|
764
|
+
'Validar estrutura do payload',
|
|
765
|
+
'Confirmar GA4_MEASUREMENT_ID está correto',
|
|
766
|
+
'Verificar se GA4_API_SECRET está configurado'
|
|
767
|
+
],
|
|
768
|
+
severity: 'HIGH',
|
|
769
|
+
retry_recommendation: 'Validar payload antes de tentar novamente'
|
|
770
|
+
},
|
|
771
|
+
|
|
772
|
+
'401': {
|
|
773
|
+
name: 'Unauthorized',
|
|
774
|
+
causes: [
|
|
775
|
+
'GA4_API_SECRET inválido ou expirado',
|
|
776
|
+
'API Secret não corresponde ao Measurement ID',
|
|
777
|
+
'Permissões insuficientes do API Secret'
|
|
778
|
+
],
|
|
779
|
+
solutions: [
|
|
780
|
+
'Gerar novo API Secret no Google Analytics',
|
|
781
|
+
'Verificar se API Secret corresponde ao stream correto',
|
|
782
|
+
'Configurar secret via wrangler secret',
|
|
783
|
+
'Testar secret com requisição simples antes de usar em produção'
|
|
784
|
+
],
|
|
785
|
+
severity: 'CRITICAL',
|
|
786
|
+
retry_recommendation: 'Secret deve ser renovado, sem retry automático'
|
|
787
|
+
},
|
|
788
|
+
|
|
789
|
+
'429': {
|
|
790
|
+
name: 'Quota Exceeded',
|
|
791
|
+
causes: [
|
|
792
|
+
'Limite de eventos por dia excedido',
|
|
793
|
+
'Muitas requisições em breve período',
|
|
794
|
+
'Limite de batch size excedido'
|
|
795
|
+
],
|
|
796
|
+
solutions: [
|
|
797
|
+
'Verificar limites de quota no Google Analytics',
|
|
798
|
+
'Implementar batching otimizado',
|
|
799
|
+
'Ajustar lógica de sampling se necessário',
|
|
800
|
+
'Considerar plano Google Analytics 360 se necessário'
|
|
801
|
+
],
|
|
802
|
+
severity: 'HIGH',
|
|
803
|
+
retry_recommendation: 'Implementar rate limiting no cliente'
|
|
804
|
+
},
|
|
805
|
+
|
|
806
|
+
'500': {
|
|
807
|
+
name: 'Internal Server Error',
|
|
808
|
+
causes: [
|
|
809
|
+
'Problema temporário nos servidores Google',
|
|
810
|
+
'Serviço degradado em alguma região',
|
|
811
|
+
'Bug não documentado na API'
|
|
812
|
+
],
|
|
813
|
+
solutions: [
|
|
814
|
+
'Aguardar alguns minutos e tentar novamente',
|
|
815
|
+
'Verificar status em https://status.cloud.google.com/',
|
|
816
|
+
'Implementar retry automático com backoff',
|
|
817
|
+
'Reportar problema se persistir por mais de 15 minutos'
|
|
818
|
+
],
|
|
819
|
+
severity: 'MEDIUM',
|
|
820
|
+
retry_recommendation: 'Retry automático com backoff de 5 minutos'
|
|
821
|
+
}
|
|
822
|
+
};
|
|
823
|
+
|
|
824
|
+
const errorInfo = errorMap[errorCode] || {
|
|
825
|
+
name: 'Unknown Error',
|
|
826
|
+
causes: ['Código de erro não documentado'],
|
|
827
|
+
solutions: ['Verificar documentação oficial do Google'],
|
|
828
|
+
severity: 'HIGH',
|
|
829
|
+
retry_recommendation: 'Investigar antes de retry'
|
|
830
|
+
};
|
|
831
|
+
|
|
832
|
+
logWorker(
|
|
833
|
+
WORKER_LOG_LEVELS.ERROR,
|
|
834
|
+
'google_error_diagnosis',
|
|
835
|
+
`Google API Error ${errorCode}: ${errorInfo.name}`,
|
|
836
|
+
{
|
|
837
|
+
error_code: errorCode,
|
|
838
|
+
error_context: errorContext,
|
|
839
|
+
diagnosis: errorInfo,
|
|
840
|
+
recommended_action: errorInfo.retry_recommendation
|
|
841
|
+
}
|
|
842
|
+
);
|
|
843
|
+
|
|
844
|
+
return errorInfo;
|
|
845
|
+
}
|
|
846
|
+
```
|
|
847
|
+
|
|
848
|
+
### 4.3 Diagnóstico de Erros de TikTok (400/401/429)
|
|
849
|
+
|
|
850
|
+
```javascript
|
|
851
|
+
// Análise de erros específicos de TikTok API
|
|
852
|
+
export async function diagnoseTikTokError(errorCode, errorContext) {
|
|
853
|
+
const errorMap = {
|
|
854
|
+
'400': {
|
|
855
|
+
name: 'Bad Request',
|
|
856
|
+
causes: [
|
|
857
|
+
'Payload malformado ou parâmetros faltando',
|
|
858
|
+
'event_id duplicado em breve período',
|
|
859
|
+
'pixel_code inválido',
|
|
860
|
+
'access_token inválido'
|
|
861
|
+
],
|
|
862
|
+
solutions: [
|
|
863
|
+
'Verificar documentação oficial do TikTok Events API',
|
|
864
|
+
'Validar estrutura do payload',
|
|
865
|
+
'Confirmar TIKTOK_ACCESS_TOKEN está configurado',
|
|
866
|
+
'Verificar se pixel_code está correto'
|
|
867
|
+
],
|
|
868
|
+
severity: 'HIGH',
|
|
869
|
+
retry_recommendation: 'Validar payload antes de tentar novamente'
|
|
870
|
+
},
|
|
871
|
+
|
|
872
|
+
'401': {
|
|
873
|
+
name: 'Unauthorized',
|
|
874
|
+
causes: [
|
|
875
|
+
'TIKTOK_ACCESS_TOKEN inválido ou expirado',
|
|
876
|
+
'Token não tem permissão para o pixel especificado',
|
|
877
|
+
'App associada ao token foi removida'
|
|
878
|
+
],
|
|
879
|
+
solutions: [
|
|
880
|
+
'Gerar novo token no TikTok for Business',
|
|
881
|
+
'Verificar permissões do token',
|
|
882
|
+
'Configurar token via wrangler secret',
|
|
883
|
+
'Testar token com requisição simples antes de usar em produção'
|
|
884
|
+
],
|
|
885
|
+
severity: 'CRITICAL',
|
|
886
|
+
retry_recommendation: 'Token deve ser renovado, sem retry automático'
|
|
887
|
+
},
|
|
888
|
+
|
|
889
|
+
'403': {
|
|
890
|
+
name: 'Forbidden',
|
|
891
|
+
causes: [
|
|
892
|
+
'Conta bloqueada ou suspensa',
|
|
893
|
+
'Violação de política de uso da API',
|
|
894
|
+
'IP bloqueado por suspeita de abuso',
|
|
895
|
+
'Região não suportada para a API'
|
|
896
|
+
],
|
|
897
|
+
solutions: [
|
|
898
|
+
'Verificar status da conta no TikTok for Business',
|
|
899
|
+
'Revisar limites de uso da API',
|
|
900
|
+
'Verificar se região está suportada',
|
|
901
|
+
'Contactar suporte TikTok se o bloqueio for injustificado'
|
|
902
|
+
],
|
|
903
|
+
severity: 'CRITICAL',
|
|
904
|
+
retry_recommendation: 'Contatar suporte, não tentar novamente'
|
|
905
|
+
},
|
|
906
|
+
|
|
907
|
+
'429': {
|
|
908
|
+
name: 'Too Many Requests',
|
|
909
|
+
causes: [
|
|
910
|
+
'Rate limit excedido',
|
|
911
|
+
'Muitas requisições em breve período',
|
|
912
|
+
'Batch muito grande para o plano atual'
|
|
913
|
+
],
|
|
914
|
+
solutions: [
|
|
915
|
+
'Verificar rate limits em api-versions.json',
|
|
916
|
+
'Implementar backoff exponencial',
|
|
917
|
+
'Ajustar tamanho dos batches',
|
|
918
|
+
'Implementar fila de requisições com Cloudflare Queue'
|
|
919
|
+
],
|
|
920
|
+
severity: 'HIGH',
|
|
921
|
+
retry_recommendation: 'Implementar retry com backoff exponencial'
|
|
922
|
+
},
|
|
923
|
+
|
|
924
|
+
'500': {
|
|
925
|
+
name: 'Internal Server Error',
|
|
926
|
+
causes: [
|
|
927
|
+
'Problema temporário nos servidores TikTok',
|
|
928
|
+
'Serviço degradado em alguma região',
|
|
929
|
+
'Bug não documentado na API'
|
|
930
|
+
],
|
|
931
|
+
solutions: [
|
|
932
|
+
'Aguardar alguns minutos e tentar novamente',
|
|
933
|
+
'Verificar status em https://ads.tiktok.com/status',
|
|
934
|
+
'Implementar retry automático com backoff',
|
|
935
|
+
'Reportar problema se persistir por mais de 15 minutos'
|
|
936
|
+
],
|
|
937
|
+
severity: 'MEDIUM',
|
|
938
|
+
retry_recommendation: 'Retry automático com backoff de 5 minutos'
|
|
939
|
+
}
|
|
940
|
+
};
|
|
941
|
+
|
|
942
|
+
const errorInfo = errorMap[errorCode] || {
|
|
943
|
+
name: 'Unknown Error',
|
|
944
|
+
causes: ['Código de erro não documentado'],
|
|
945
|
+
solutions: ['Verificar documentação oficial do TikTok'],
|
|
946
|
+
severity: 'HIGH',
|
|
947
|
+
retry_recommendation: 'Investigar antes de retry'
|
|
948
|
+
};
|
|
949
|
+
|
|
950
|
+
logWorker(
|
|
951
|
+
WORKER_LOG_LEVELS.ERROR,
|
|
952
|
+
'tiktok_error_diagnosis',
|
|
953
|
+
`TikTok API Error ${errorCode}: ${errorInfo.name}`,
|
|
954
|
+
{
|
|
955
|
+
error_code: errorCode,
|
|
956
|
+
error_context: errorContext,
|
|
957
|
+
diagnosis: errorInfo,
|
|
958
|
+
recommended_action: errorInfo.retry_recommendation
|
|
959
|
+
}
|
|
960
|
+
);
|
|
961
|
+
|
|
962
|
+
return errorInfo;
|
|
963
|
+
}
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
---
|
|
967
|
+
|
|
968
|
+
## 🎯 FORMATO DE SAÍDA
|
|
969
|
+
|
|
970
|
+
### DELIVERABLE 1: `debug-endpoints.js`
|
|
971
|
+
|
|
972
|
+
```javascript
|
|
973
|
+
// Funções de diagnóstico para Cloudflare Worker
|
|
974
|
+
import { logWorker, WORKER_LOG_LEVELS } from './worker-logging.js';
|
|
975
|
+
import { getApiHealth, getSimpleApiHealth } from './api-health.js';
|
|
976
|
+
|
|
977
|
+
export const DEBUG_HANDLERS = {
|
|
978
|
+
'/debug': handleDebugRequest,
|
|
979
|
+
'/health': handleHealthCheck,
|
|
980
|
+
'/events-log': handleEventsLogRequest,
|
|
981
|
+
'/api/debug/logs': handleBrowserLogs
|
|
982
|
+
};
|
|
983
|
+
|
|
984
|
+
export async function handleDebugRequest(request, env) {
|
|
985
|
+
// Implementação conforme PASSO 2.1
|
|
986
|
+
const debugInfo = {
|
|
987
|
+
system: { version: 'CDP Edge Quantum Tier', uptime_seconds: getWorkerUptime() },
|
|
988
|
+
databases: { d1: { connected: true, last_query: await getLastQueryTimestamp() } },
|
|
989
|
+
api_health: {
|
|
990
|
+
meta: await getApiHealth('meta'),
|
|
991
|
+
google: await getApiHealth('google'),
|
|
992
|
+
tiktok: await getApiHealth('tiktok')
|
|
993
|
+
},
|
|
994
|
+
recent_errors: await getRecentErrors(10)
|
|
995
|
+
};
|
|
996
|
+
|
|
997
|
+
return new Response(JSON.stringify(debugInfo, null, 2), {
|
|
998
|
+
headers: { 'Content-Type': 'application/json' },
|
|
999
|
+
status: 200
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
export async function handleHealthCheck(request, env) {
|
|
1004
|
+
// Implementação conforme PASSO 2.2
|
|
1005
|
+
const checks = {
|
|
1006
|
+
worker: { status: 'healthy', uptime_seconds: getWorkerUptime() },
|
|
1007
|
+
database: { status: 'healthy', last_query_at: await getLastQueryTimestamp() },
|
|
1008
|
+
apis: {
|
|
1009
|
+
meta: await getSimpleApiHealth('meta'),
|
|
1010
|
+
google: await getSimpleApiHealth('google'),
|
|
1011
|
+
tiktok: await getSimpleApiHealth('tiktok')
|
|
1012
|
+
}
|
|
1013
|
+
};
|
|
1014
|
+
|
|
1015
|
+
const isHealthy = Object.values(checks).every(check =>
|
|
1016
|
+
check.status === 'healthy' ||
|
|
1017
|
+
(typeof check === 'object' && Object.values(check).every(c => c.status === 'healthy'))
|
|
1018
|
+
);
|
|
1019
|
+
|
|
1020
|
+
return new Response(JSON.stringify({
|
|
1021
|
+
status: isHealthy ? 'healthy' : 'degraded',
|
|
1022
|
+
checks,
|
|
1023
|
+
timestamp: new Date().toISOString()
|
|
1024
|
+
}), {
|
|
1025
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1026
|
+
status: isHealthy ? 200 : 503
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
export async function handleEventsLogRequest(request, env) {
|
|
1031
|
+
// Implementação conforme PASSO 2.3
|
|
1032
|
+
const url = new URL(request.url);
|
|
1033
|
+
const limit = parseInt(url.searchParams.get('limit') || '50');
|
|
1034
|
+
const hours = parseInt(url.searchParams.get('hours') || '24');
|
|
1035
|
+
|
|
1036
|
+
const events = await DB.prepare(`
|
|
1037
|
+
SELECT event_name, platform, status, error_message, created_at
|
|
1038
|
+
FROM events_log
|
|
1039
|
+
WHERE created_at > datetime('now', '-${hours} hours')
|
|
1040
|
+
ORDER BY created_at DESC
|
|
1041
|
+
LIMIT ?
|
|
1042
|
+
`).bind(hours, limit).all();
|
|
1043
|
+
|
|
1044
|
+
return new Response(JSON.stringify({
|
|
1045
|
+
events,
|
|
1046
|
+
count: events.length,
|
|
1047
|
+
query_params: { limit, hours },
|
|
1048
|
+
timestamp: new Date().toISOString()
|
|
1049
|
+
}), {
|
|
1050
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1051
|
+
status: 200
|
|
1052
|
+
});
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
export async function handleBrowserLogs(request, env) {
|
|
1056
|
+
const { logs } = await request.json();
|
|
1057
|
+
|
|
1058
|
+
// Persistir logs do browser no D1
|
|
1059
|
+
for (const log of logs) {
|
|
1060
|
+
await DB.prepare(`
|
|
1061
|
+
INSERT INTO browser_logs (timestamp, level, category, message, context, session_id, page_url)
|
|
1062
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
1063
|
+
`).bind(
|
|
1064
|
+
log.timestamp,
|
|
1065
|
+
log.level,
|
|
1066
|
+
log.category,
|
|
1067
|
+
log.message,
|
|
1068
|
+
JSON.stringify(log.context),
|
|
1069
|
+
log.session_id,
|
|
1070
|
+
log.page_url
|
|
1071
|
+
).run();
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
return new Response(JSON.stringify({ success: true, received: logs.length }), {
|
|
1075
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1076
|
+
status: 200
|
|
1077
|
+
});
|
|
1078
|
+
}
|
|
1079
|
+
```
|
|
1080
|
+
|
|
1081
|
+
### DELIVERABLE 2: `browser-debug.js`
|
|
1082
|
+
|
|
1083
|
+
```javascript
|
|
1084
|
+
// Logging avançado para cdpTrack.js
|
|
1085
|
+
export class BrowserLogger {
|
|
1086
|
+
constructor(sessionId) {
|
|
1087
|
+
this.sessionId = sessionId;
|
|
1088
|
+
this.logs = [];
|
|
1089
|
+
this.maxLogBuffer = 50;
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
log(level, category, message, context = {}) {
|
|
1093
|
+
const logEntry = {
|
|
1094
|
+
timestamp: new Date().toISOString(),
|
|
1095
|
+
level,
|
|
1096
|
+
category,
|
|
1097
|
+
message,
|
|
1098
|
+
context: {
|
|
1099
|
+
...context,
|
|
1100
|
+
session_id: this.sessionId,
|
|
1101
|
+
page_url: window.location.href,
|
|
1102
|
+
user_agent: navigator.userAgent,
|
|
1103
|
+
viewport: {
|
|
1104
|
+
width: window.innerWidth,
|
|
1105
|
+
height: window.innerHeight
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
};
|
|
1109
|
+
|
|
1110
|
+
this.logs.push(logEntry);
|
|
1111
|
+
|
|
1112
|
+
if (this.logs.length >= this.maxLogBuffer || level === 'ERROR') {
|
|
1113
|
+
this.flushLogs();
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
console.log(`[${level}] [${category}] ${message}`, context);
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
async flushLogs() {
|
|
1120
|
+
if (this.logs.length === 0) return;
|
|
1121
|
+
|
|
1122
|
+
try {
|
|
1123
|
+
await fetch('/api/debug/logs', {
|
|
1124
|
+
method: 'POST',
|
|
1125
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1126
|
+
body: JSON.stringify({
|
|
1127
|
+
logs: this.logs,
|
|
1128
|
+
session_id: this.sessionId
|
|
1129
|
+
})
|
|
1130
|
+
});
|
|
1131
|
+
|
|
1132
|
+
this.logs = [];
|
|
1133
|
+
} catch (error) {
|
|
1134
|
+
console.error('Failed to flush browser logs:', error);
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
error(category, message, error) {
|
|
1139
|
+
this.log('ERROR', category, message, {
|
|
1140
|
+
error_type: error.name,
|
|
1141
|
+
error_message: error.message,
|
|
1142
|
+
stack_trace: error.stack
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
warn(category, message, context) {
|
|
1147
|
+
this.log('WARN', category, message, context);
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
info(category, message, context) {
|
|
1151
|
+
this.log('INFO', category, message, context);
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
debug(category, message, context) {
|
|
1155
|
+
this.log('DEBUG', category, message, context);
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
// Criar logger global
|
|
1160
|
+
const logger = new BrowserLogger(generateSessionId());
|
|
1161
|
+
|
|
1162
|
+
// Expor para uso em cdpTrack.js
|
|
1163
|
+
window.pbDebugLogger = logger;
|
|
1164
|
+
```
|
|
1165
|
+
|
|
1166
|
+
### DELIVERABLE 3: `troubleshooting-guide.md`
|
|
1167
|
+
|
|
1168
|
+
```markdown
|
|
1169
|
+
# Guia de Troubleshooting — CDP Edge Quantum Tier
|
|
1170
|
+
|
|
1171
|
+
**Versão:** 1.0.0
|
|
1172
|
+
**Data:** 2026-03-27
|
|
1173
|
+
|
|
1174
|
+
---
|
|
1175
|
+
|
|
1176
|
+
## 🚨 Problemas Comuns e Soluções
|
|
1177
|
+
|
|
1178
|
+
### 1. Eventos não aparecendo no Dashboard da Plataforma
|
|
1179
|
+
|
|
1180
|
+
**Sintoma:** Você disparou um evento (formulário, clique, compra), mas não aparece no painel da plataforma (Meta Events Manager, GA4 DebugView, TikTok Ads Manager).
|
|
1181
|
+
|
|
1182
|
+
**Possíveis Causas:**
|
|
1183
|
+
|
|
1184
|
+
1. **Evento não está sendo enviado para a plataforma**
|
|
1185
|
+
- Verificar se `/api/track` está recebendo o evento
|
|
1186
|
+
- Consultar `/api/events-log` para ver se evento foi processado
|
|
1187
|
+
- Verificar logs do Worker: `wrangler tail`
|
|
1188
|
+
|
|
1189
|
+
2. **API retornou erro (400/401/429)**
|
|
1190
|
+
- Consultar `/api/debug` → recent_errors
|
|
1191
|
+
- Verificar diagnostic_error_diagnosis nos logs
|
|
1192
|
+
- Corrigir conforme diagnóstico do Debug Agent
|
|
1193
|
+
|
|
1194
|
+
3. **Deduplicação está bloqueando eventos**
|
|
1195
|
+
- Verificar se event_id é único por sessão
|
|
1196
|
+
- Confirmar que event_name está correto
|
|
1197
|
+
- Testar com event_id diferente
|
|
1198
|
+
|
|
1199
|
+
4. **Tempo de processamento muito alto**
|
|
1200
|
+
- Aguardar 15-30 minutos para que plataforma processe eventos
|
|
1201
|
+
- Verificar se há fila de processamento na plataforma
|
|
1202
|
+
|
|
1203
|
+
**Solução:**
|
|
1204
|
+
- Usar checklist de validação (PASSO 3)
|
|
1205
|
+
- Consultar endpoints de diagnóstico (`/debug`, `/health`, `/events-log`)
|
|
1206
|
+
- Verificar logs estruturados no Worker e browser
|
|
1207
|
+
|
|
1208
|
+
---
|
|
1209
|
+
|
|
1210
|
+
### 2. Erros de API (400 Bad Request)
|
|
1211
|
+
|
|
1212
|
+
**Sintoma:** API retorna 400 Bad Request.
|
|
1213
|
+
|
|
1214
|
+
**Plataformas Afetadas:** Meta, Google, TikTok, Pinterest, Reddit
|
|
1215
|
+
|
|
1216
|
+
**Diagnóstico Automático:**
|
|
1217
|
+
- O Debug Agent já diagnosticou a causa específica
|
|
1218
|
+
- Consultar logs: `api_error_diagnosis` category
|
|
1219
|
+
|
|
1220
|
+
**Soluções Comuns:**
|
|
1221
|
+
- Payload malformado: Verificar estrutura da documentação oficial
|
|
1222
|
+
- Parâmetros faltando: Adicionar campos obrigatórios
|
|
1223
|
+
- event_id duplicado: Gerar ID único por sessão
|
|
1224
|
+
- user_data inválido: Recalcular SHA256
|
|
1225
|
+
|
|
1226
|
+
---
|
|
1227
|
+
|
|
1228
|
+
### 3. Erros de API (401 Unauthorized)
|
|
1229
|
+
|
|
1230
|
+
**Sintoma:** API retorna 401 Unauthorized.
|
|
1231
|
+
|
|
1232
|
+
**Plataformas Afetadas:** Meta, Google, TikTok, Pinterest, Reddit
|
|
1233
|
+
|
|
1234
|
+
**Diagnóstico Automático:**
|
|
1235
|
+
- Token de acesso inválido ou expirado
|
|
1236
|
+
|
|
1237
|
+
**Solução:**
|
|
1238
|
+
- Gerar novo token de acesso
|
|
1239
|
+
- Atualizar via wrangler secret
|
|
1240
|
+
- Testar token com requisição simples antes de usar em produção
|
|
1241
|
+
- Verificar permissões do token
|
|
1242
|
+
|
|
1243
|
+
---
|
|
1244
|
+
|
|
1245
|
+
### 4. Erros de API (429 Too Many Requests)
|
|
1246
|
+
|
|
1247
|
+
**Sintoma:** API retorna 429 Too Many Requests.
|
|
1248
|
+
|
|
1249
|
+
**Plataformas Afetadas:** Meta, Google, TikTok, Pinterest, Reddit
|
|
1250
|
+
|
|
1251
|
+
**Diagnóstico Automático:**
|
|
1252
|
+
- Rate limit excedido
|
|
1253
|
+
|
|
1254
|
+
**Solução:**
|
|
1255
|
+
- Verificar rate limits em `contracts/api-versions.json`
|
|
1256
|
+
- Implementar backoff exponencial (já está no Server Tracking)
|
|
1257
|
+
- Ajustar lógica de batching
|
|
1258
|
+
- Implementar fila de requisições com Cloudflare Queue
|
|
1259
|
+
|
|
1260
|
+
---
|
|
1261
|
+
|
|
1262
|
+
### 5. Worker não responde (Timeout)
|
|
1263
|
+
|
|
1264
|
+
**Sintoma:** Requisições ao Worker ficam sem resposta ou retornam 524 timeout.
|
|
1265
|
+
|
|
1266
|
+
**Possíveis Causas:**
|
|
1267
|
+
|
|
1268
|
+
1. **Worker está em deploy pendente**
|
|
1269
|
+
- Verificar se `wrangler deploy` completou com sucesso
|
|
1270
|
+
- Verificar logs de deploy no Cloudflare Dashboard
|
|
1271
|
+
|
|
1272
|
+
2. **Worker em loop infinito**
|
|
1273
|
+
- Verificar logs: `wrangler tail`
|
|
1274
|
+
- Procurar por loops ou recursão infinita
|
|
1275
|
+
- Adicionar timeouts em funções async
|
|
1276
|
+
|
|
1277
|
+
3. **D1 está bloqueado**
|
|
1278
|
+
- Verificar se há locks nas tabelas
|
|
1279
|
+
- Verificar se transações estão sendo fechadas corretamente
|
|
1280
|
+
|
|
1281
|
+
4. **Excedeu limite de CPU/Memory do Worker**
|
|
1282
|
+
- Otimizar código para reduzir uso de recursos
|
|
1283
|
+
- Implementar caching com KV para reduzir queries ao D1
|
|
1284
|
+
|
|
1285
|
+
**Solução:**
|
|
1286
|
+
- Consultar `/debug` para ver status do sistema
|
|
1287
|
+
- Verificar logs de Worker para identificar problemas
|
|
1288
|
+
- Ajustar limites de CPU no wrangler.toml
|
|
1289
|
+
|
|
1290
|
+
---
|
|
1291
|
+
|
|
1292
|
+
### 6. Cookies de tracking não persistindo
|
|
1293
|
+
|
|
1294
|
+
**Sintoma:** Cookies `_cdp_uid` e `_cdp_attr` não estão definidos ou são perdidos entre páginas.
|
|
1295
|
+
|
|
1296
|
+
**Possíveis Causas:**
|
|
1297
|
+
|
|
1298
|
+
1. **cdpTrack não está sendo carregado**
|
|
1299
|
+
- Verificar se script está no `<head>` do documento
|
|
1300
|
+
- Verificar se há erros de carregamento no console
|
|
1301
|
+
|
|
1302
|
+
2. **Cookies estão sendo bloqueados**
|
|
1303
|
+
- Verificar configurações de privacy no navegador
|
|
1304
|
+
- Verificar se adblockers estão bloqueando cookies
|
|
1305
|
+
- Testar em modo incognito
|
|
1306
|
+
|
|
1307
|
+
3. **DOM não está disponível**
|
|
1308
|
+
- Verificar se script está carregando antes do DOM estar pronto
|
|
1309
|
+
- Adicionar `DOMContentLoaded` ou `load` event listener
|
|
1310
|
+
|
|
1311
|
+
**Solução:**
|
|
1312
|
+
- Verificar logs do browser via `window.pbDebugLogger`
|
|
1313
|
+
- Testar em diferentes navegadores (Chrome, Firefox, Safari)
|
|
1314
|
+
- Verificar se não há conflitos com outros scripts de tracking
|
|
1315
|
+
|
|
1316
|
+
---
|
|
1317
|
+
|
|
1318
|
+
## 🔧 Comandos Úteis
|
|
1319
|
+
|
|
1320
|
+
```bash
|
|
1321
|
+
# Ver logs do Worker em tempo real
|
|
1322
|
+
wrangler tail
|
|
1323
|
+
|
|
1324
|
+
# Ver status do Worker
|
|
1325
|
+
wrangler deployments list
|
|
1326
|
+
|
|
1327
|
+
# Fazer deploy do Worker
|
|
1328
|
+
wrangler deploy
|
|
1329
|
+
|
|
1330
|
+
# Ver logs de D1
|
|
1331
|
+
wrangler d1 execute DB --command="SELECT * FROM worker_logs ORDER BY created_at DESC LIMIT 50"
|
|
1332
|
+
|
|
1333
|
+
# Testar endpoint de debug
|
|
1334
|
+
curl https://seu-worker.workers.dev/debug
|
|
1335
|
+
|
|
1336
|
+
# Testar endpoint de health
|
|
1337
|
+
curl https://seu-worker.workers.dev/health
|
|
1338
|
+
```
|
|
1339
|
+
|
|
1340
|
+
---
|
|
1341
|
+
|
|
1342
|
+
## 📞 Quando Escalar para Suporte
|
|
1343
|
+
|
|
1344
|
+
Se após seguir este guia o problema não for resolvido:
|
|
1345
|
+
|
|
1346
|
+
1. **Coletar informações:**
|
|
1347
|
+
- Logs relevantes de `/api/events-log`
|
|
1348
|
+
- Diagnósticos de `/api/debug`
|
|
1349
|
+
- Checklist de validação preenchido
|
|
1350
|
+
- Screenshots de erros no console
|
|
1351
|
+
|
|
1352
|
+
2. **Criar issue no repositório:**
|
|
1353
|
+
- Descrever problema detalhadamente
|
|
1354
|
+
- Incluir logs e diagnósticos
|
|
1355
|
+
- Marcar com labels: `bug`, `diagnosis-needed`, `help-wanted`
|
|
1356
|
+
|
|
1357
|
+
3. **Contactar suporte:**
|
|
1358
|
+
- Meta: https://developers.facebook.com/support/
|
|
1359
|
+
- Google: https://support.google.com/analytics/
|
|
1360
|
+
- TikTok: https://ads.tiktok.com/business/help/
|
|
1361
|
+
- Cloudflare: https://support.cloudflare.com/
|
|
1362
|
+
|
|
1363
|
+
---
|
|
1364
|
+
|
|
1365
|
+
> 🔧 **Sua Função:** Prover ferramentas profissionais de diagnóstico, logging estruturado, endpoints de monitoramento, e guias de troubleshooting passo a passo para resolver problemas em produção com precisão máxima e mínimo tempo de inatividade.
|
|
1366
|
+
```
|
|
1367
|
+
|
|
1368
|
+
---
|
|
1369
|
+
|
|
1370
|
+
## 🔧 INTEGRAÇÃO COM OUTROS AGENTES
|
|
1371
|
+
|
|
1372
|
+
### Fontes de Dados
|
|
1373
|
+
|
|
1374
|
+
1. **Server Tracking Agent** — Logs de envio de eventos e falhas de API
|
|
1375
|
+
2. **Validator Agent** — Validações que falharam e seus diagnósticos
|
|
1376
|
+
3. **Memory Agent** — Último estado conhecido do sistema e checkpoints
|
|
1377
|
+
4. **Intelligence Agent** — Alertas de versões desatualizadas e privacidade
|
|
1378
|
+
5. **Master Feedback Loop** — Feedback de todos os agentes sobre problemas recorrentes
|
|
1379
|
+
|
|
1380
|
+
### Destino de Output
|
|
1381
|
+
|
|
1382
|
+
- **Master Orchestrator** — Recebe relatórios de diagnóstico
|
|
1383
|
+
- **Intelligence Agent** — Usa diagnósticos para análise proativa
|
|
1384
|
+
- **WhatsApp Agent** — Recebe alertas críticos via notificação
|
|
1385
|
+
- **Email Agent** — Recebe relatórios de diagnóstico periódicos
|
|
1386
|
+
|
|
1387
|
+
---
|
|
1388
|
+
|
|
1389
|
+
## 📊 CHECKLIST DE IMPLEMENTAÇÃO
|
|
1390
|
+
|
|
1391
|
+
### Logging Estruturado
|
|
1392
|
+
|
|
1393
|
+
- [ ] Worker logger implementado (WORKER_LOG_LEVELS)
|
|
1394
|
+
- [ ] Browser logger implementado (BrowserLogger)
|
|
1395
|
+
- [ ] Schema de worker_logs criado no D1
|
|
1396
|
+
- [ ] Schema de browser_logs criado no D1
|
|
1397
|
+
- [ ] Logs são persistidos automaticamente
|
|
1398
|
+
- [ ] Logs têm session_id para correlação
|
|
1399
|
+
|
|
1400
|
+
### Endpoints de Diagnóstico
|
|
1401
|
+
|
|
1402
|
+
- [ ] Endpoint `/debug` implementado
|
|
1403
|
+
- [ ] Endpoint `/health` implementado
|
|
1404
|
+
- [ ] Endpoint `/events-log` implementado
|
|
1405
|
+
- [ ] Endpoint `/api/debug/logs` implementado
|
|
1406
|
+
- [ ] Endpoints retornam JSON estruturado
|
|
1407
|
+
- [ ] Endpoints têm autenticação adequada
|
|
1408
|
+
|
|
1409
|
+
### Testes de Validação
|
|
1410
|
+
|
|
1411
|
+
- [ ] Checklist de validação implementado
|
|
1412
|
+
- [ ] Testes críticos definidos (browser, server, plataformas)
|
|
1413
|
+
- [ ] Testes importantes definidos (conversão, atribuição)
|
|
1414
|
+
- [ ] Testes opcionais definidos (performance, logs)
|
|
1415
|
+
- [ ] Relatório de validação estruturado
|
|
1416
|
+
|
|
1417
|
+
### Análise de Erros de API
|
|
1418
|
+
|
|
1419
|
+
- [ ] Diagnóstico de Meta API implementado
|
|
1420
|
+
- [ ] Diagnóstico de Google API implementado
|
|
1421
|
+
- [ ] Diagnóstico de TikTok API implementado
|
|
1422
|
+
- [ ] Error maps completos (400, 401, 403, 429, 500)
|
|
1423
|
+
- [ ] Soluções específicas documentadas
|
|
1424
|
+
|
|
1425
|
+
### Guias de Troubleshooting
|
|
1426
|
+
|
|
1427
|
+
- [ ] Guia passo a passo criado
|
|
1428
|
+
- [ ] Problemas comuns documentados
|
|
1429
|
+
- [ ] Soluções documentadas
|
|
1430
|
+
- [ ] Comandos úteis listados
|
|
1431
|
+
- [ ] Procedimento de escalamento definido
|
|
1432
|
+
|
|
1433
|
+
### Integração
|
|
1434
|
+
|
|
1435
|
+
- [ ] Integração com Server Tracking implementada
|
|
1436
|
+
- [ ] Integração com Validator Agent implementada
|
|
1437
|
+
- [ ] Integração com Memory Agent implementada
|
|
1438
|
+
- [ ] Integração com Intelligence Agent implementada
|
|
1439
|
+
- [ ] Integração com Master Feedback Loop implementada
|
|
1440
|
+
- [ ] Integração com WhatsApp Agent implementada
|
|
1441
|
+
|
|
1442
|
+
---
|
|
1443
|
+
|
|
1444
|
+
## 🎯 BENEFÍCIOS ESPERADOS
|
|
1445
|
+
|
|
1446
|
+
1. **90% redução de tempo de troubleshooting** — Diagnósticos precisos e estruturados
|
|
1447
|
+
2. **100% visibilidade de problemas** — Todos os erros categorizados e diagnosticados
|
|
1448
|
+
3. **Monitoramento em tempo real** — Endpoints de diagnóstico disponíveis
|
|
1449
|
+
4. **Validação acionável** — Checklists para verificar tracking rapidamente
|
|
1450
|
+
5. **Análise de erros automatizada** — Diagnósticos específicos por plataforma
|
|
1451
|
+
6. **Documentação completa** — Guias de troubleshooting passo a passo
|
|
1452
|
+
|
|
1453
|
+
---
|
|
1454
|
+
|
|
1455
|
+
> 🔧 **Sua Missão:** Prover ferramentas profissionais de diagnóstico, logging estruturado, endpoints de monitoramento, e guias de troubleshooting passo a passo para resolver problemas em produção com precisão máxima, minimizando tempo de inatividade e maximizando uptime do sistema.
|