fg-tracker-mcp 0.7.0 → 0.8.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.
@@ -0,0 +1,501 @@
1
+ /**
2
+ * Roteiro (`document`) e plano (estilo k6) da Simulação de ambiente — CONTRATO.md §28.2 e §28.3.
3
+ * Esquemas zod com descrições em pt-BR para o agente, validação com caminhos precisos, avisos
4
+ * semânticos (variáveis não definidas, senhas literais, efeitos externos) e presets de plano.
5
+ */
6
+ import { z } from 'zod';
7
+ /* ---------------- duração ---------------- */
8
+ const DURATION_UNITS = { ms: 1, s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000 };
9
+ const DURATION_RE = /^(?:\d+(?:\.\d+)?(?:ms|s|m|h|d))+$/;
10
+ /** Converte "30s", "10m", "1h30m", "500ms" (ou número em segundos) para milissegundos; `null` se inválida. */
11
+ export function parseDuration(value) {
12
+ if (typeof value === 'number')
13
+ return Number.isFinite(value) && value >= 0 ? Math.round(value * 1000) : null;
14
+ const s = value.trim();
15
+ if (/^\d+(?:\.\d+)?$/.test(s))
16
+ return Math.round(Number(s) * 1000);
17
+ if (!DURATION_RE.test(s))
18
+ return null;
19
+ let total = 0;
20
+ for (const m of s.matchAll(/(\d+(?:\.\d+)?)(ms|s|m|h|d)/g))
21
+ total += Number(m[1]) * (DURATION_UNITS[m[2]] ?? 0);
22
+ return Math.round(total);
23
+ }
24
+ /** Formata milissegundos no estilo k6: 90000 → "1m30s", 7200000 → "2h", 500 → "500ms". */
25
+ export function formatDuration(ms) {
26
+ const total = Math.max(0, Math.round(ms));
27
+ if (total < 1000)
28
+ return `${total}ms`;
29
+ let s = Math.round(total / 1000);
30
+ const h = Math.floor(s / 3600);
31
+ s -= h * 3600;
32
+ const m = Math.floor(s / 60);
33
+ s -= m * 60;
34
+ return `${h ? `${h}h` : ''}${m ? `${m}m` : ''}${s ? `${s}s` : ''}` || '0s';
35
+ }
36
+ const durationSchema = z
37
+ .string()
38
+ .regex(DURATION_RE, 'duração inválida: use o formato k6, ex.: "30s", "10m", "1h30m"')
39
+ .describe('Duração no formato k6: "30s", "10m", "1h30m"');
40
+ /* ---------------- roteiro (§28.2) ---------------- */
41
+ export const HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];
42
+ const headersSchema = z
43
+ .record(z.string(), z.string())
44
+ .describe('Headers HTTP (valores aceitam templates {{var}}, ex.: { "authorization": "Bearer {{token}}" })');
45
+ const thinkTimeSchema = z
46
+ .union([
47
+ z.number().int().min(0),
48
+ z
49
+ .tuple([z.number().int().min(0), z.number().int().min(0)])
50
+ .refine(([a, b]) => a <= b, 'thinkTimeMs [min, max] exige min ≤ max'),
51
+ ])
52
+ .describe('Pausa após o passo em ms: número fixo ou intervalo aleatório [min, max] (simula o usuário lendo a tela)');
53
+ export const extractSchema = z
54
+ .strictObject({
55
+ var: z
56
+ .string()
57
+ .regex(/^[A-Za-z_][\w]*$/, 'nome de variável inválido (use letras, números e _; ex.: token, orderId)')
58
+ .describe('Nome da variável criada, usada depois como {{var}}'),
59
+ from: z
60
+ .enum(['json', 'header', 'regex', 'status'])
61
+ .describe('Origem: json (caminho com pontos e [i], ex.: "items[0].id"), header (nome do header, ex.: "set-cookie"), regex (path = regex com grupo 1 aplicada ao corpo), status (código HTTP)'),
62
+ path: z.string().min(1).optional().describe('Caminho JSON, nome do header ou regex com grupo 1 (dispensável para from=status)'),
63
+ })
64
+ .superRefine((value, ctx) => {
65
+ if (value.from !== 'status' && !value.path)
66
+ ctx.addIssue({ code: 'custom', path: ['path'], message: `extract.from="${value.from}" exige path` });
67
+ if (value.from === 'regex' && value.path) {
68
+ try {
69
+ new RegExp(value.path);
70
+ }
71
+ catch (err) {
72
+ ctx.addIssue({ code: 'custom', path: ['path'], message: `regex inválida: ${err.message}` });
73
+ }
74
+ }
75
+ })
76
+ .describe('Extração de valor da resposta para uma variável (token, cookie, id de item de lista…)');
77
+ export const checkSchema = z
78
+ .discriminatedUnion('type', [
79
+ z.strictObject({
80
+ type: z.literal('status'),
81
+ in: z.array(z.number().int().min(100).max(599)).min(1).describe('Status HTTP aceitos, ex.: [200, 201]'),
82
+ }),
83
+ z
84
+ .strictObject({
85
+ type: z.literal('json'),
86
+ path: z.string().min(1).describe('Caminho JSON com pontos e [i]'),
87
+ exists: z.boolean().optional().describe('true = o caminho precisa existir; false = não pode existir'),
88
+ equals: z.unknown().optional().describe('Valor esperado (comparação exata)'),
89
+ })
90
+ .refine((c) => c.exists !== undefined || 'equals' in c, { message: 'check json exige exists ou equals', path: ['exists'] }),
91
+ z.strictObject({ type: z.literal('bodyContains'), value: z.string().min(1).describe('Trecho que o corpo precisa conter') }),
92
+ z.strictObject({ type: z.literal('maxDurationMs'), value: z.number().positive().describe('Duração máxima aceitável da requisição em ms') }),
93
+ ])
94
+ .describe('Verificação: status (in), json (path + exists|equals), bodyContains (value), maxDurationMs (value). Check falho conta em checks_failed');
95
+ export const stepSchema = z
96
+ .strictObject({
97
+ name: z.string().min(1).max(120).describe('Nome curto e único do passo (aparece na tabela por passo), ex.: "Login", "Listar pedidos"'),
98
+ method: z.enum(HTTP_METHODS).describe('Método HTTP'),
99
+ path: z
100
+ .string()
101
+ .min(1)
102
+ .describe('Caminho relativo ao baseUrl (ex.: "/v1/orders?limit=20", "/v1/orders/{{orderId}}") ou URL absoluta do mesmo host verificado'),
103
+ headers: headersSchema.optional(),
104
+ body: z.unknown().optional().describe('Corpo JSON (strings aceitam templates, ex.: { "email": "{{user.username}}" })'),
105
+ extract: z.array(extractSchema).optional(),
106
+ checks: z.array(checkSchema).optional(),
107
+ thinkTimeMs: thinkTimeSchema.optional(),
108
+ weight: z.number().positive().optional().describe('Peso relativo do passo (default 1)'),
109
+ skipIf: z.string().nullable().optional().describe('Condição (template) para pular o passo; null = sempre executa'),
110
+ })
111
+ .describe('Passo HTTP do roteiro');
112
+ export const scenarioSchema = z
113
+ .strictObject({
114
+ version: z.literal(1).describe('Versão do formato do roteiro (sempre 1)'),
115
+ name: z.string().min(1).max(120).describe('Nome do roteiro (único no projeto), ex.: "Jornada ouvinte"'),
116
+ baseUrl: z
117
+ .string()
118
+ .url('baseUrl precisa ser uma URL absoluta (https://…)')
119
+ .refine((u) => /^https?:\/\//i.test(u), 'baseUrl precisa usar http(s)')
120
+ .optional()
121
+ .describe('URL base padrão (a execução pode trocar); o host precisa ser do projeto'),
122
+ defaults: z
123
+ .strictObject({
124
+ headers: headersSchema.optional(),
125
+ timeoutMs: z.number().int().positive().max(900_000).optional().describe('Timeout por requisição em ms (default 30000)'),
126
+ thinkTimeMs: thinkTimeSchema.optional(),
127
+ })
128
+ .optional()
129
+ .describe('Valores aplicados a todos os passos'),
130
+ variables: z
131
+ .record(z.string(), z.union([z.string(), z.number(), z.boolean()]))
132
+ .optional()
133
+ .describe('Variáveis fixas, usadas como {{nome}} (nunca coloque senhas aqui)'),
134
+ setup: z.array(stepSchema).optional().describe('Passos executados 1x por VU ao iniciar (ex.: login com {{user.username}}/{{user.password}})'),
135
+ steps: z.array(stepSchema).min(1, 'o roteiro precisa de pelo menos um passo em steps').describe('Passos executados em sequência a cada iteração'),
136
+ teardown: z.array(stepSchema).optional().describe('Passos executados 1x ao parar (ex.: logout)'),
137
+ })
138
+ .describe('Roteiro de jornada (CONTRATO §28.2)');
139
+ /** Converte o caminho do zod em notação `steps[1].checks[0].in`. */
140
+ export function formatIssuePath(path) {
141
+ let out = '';
142
+ for (const seg of path) {
143
+ if (typeof seg === 'number')
144
+ out += `[${seg}]`;
145
+ else
146
+ out += out ? `.${String(seg)}` : String(seg);
147
+ }
148
+ return out || '(raiz)';
149
+ }
150
+ export function zodIssues(error) {
151
+ return error.issues.map((issue) => ({ path: formatIssuePath(issue.path), message: issue.message }));
152
+ }
153
+ /* ---------------- análise semântica ---------------- */
154
+ const BUILTIN_VARS = new Set(['vu', 'iteration', 'uuid']);
155
+ const TEMPLATE_RE = /\{\{\s*([^}]+?)\s*\}\}/g;
156
+ const HAS_TEMPLATE = /\{\{[^}]+\}\}/;
157
+ export const EXTERNAL_EFFECT_RE = /pay(ment|out)?s?\b|checkout|billing|charge|stripe|invoice|refund|subscri(be|ption)|e-?mails?\b|mailer|newsletter|send-?mail|webhooks?|\bsms\b|whatsapp|twilio|invit(e|ation)|push-?notif|notify|forgot-?password|reset-?password|password\/(reset|forgot)|\botp\b|order\/confirm|purchase|transfer|withdraw/i;
158
+ function collectStrings(value, at, out) {
159
+ if (typeof value === 'string')
160
+ out.push({ at, value });
161
+ else if (Array.isArray(value))
162
+ value.forEach((v, i) => collectStrings(v, `${at}[${i}]`, out));
163
+ else if (value && typeof value === 'object')
164
+ for (const [k, v] of Object.entries(value))
165
+ collectStrings(v, at ? `${at}.${k}` : k, out);
166
+ }
167
+ function knownVar(name, defined) {
168
+ if (BUILTIN_VARS.has(name) || defined.has(name))
169
+ return true;
170
+ if (/^randomInt\(\s*-?\d+\s*,\s*-?\d+\s*\)$/.test(name))
171
+ return true;
172
+ if (name === 'user.username' || name === 'user.password' || /^user\.extra\.[\w.]+$/.test(name))
173
+ return true;
174
+ const root = name.split(/[.[]/)[0] ?? name;
175
+ return defined.has(root);
176
+ }
177
+ export function externalEffect(method, path) {
178
+ const m = path.match(EXTERNAL_EFFECT_RE);
179
+ if (!m)
180
+ return null;
181
+ const safe = method === 'GET' || method === 'HEAD' || method === 'OPTIONS';
182
+ return safe
183
+ ? `leitura em rota sensível ("${m[0]}") — confirme que não dispara efeitos externos`
184
+ : `"${m[0]}" pode disparar efeito externo real (pagamento, e-mail, webhook, SMS, convite) — remova o passo ou use modo de teste/sandbox`;
185
+ }
186
+ /** Resumo e avisos semânticos de um roteiro já validado. */
187
+ export function summarizeScenario(scenario) {
188
+ const defined = new Set(Object.keys(scenario.variables ?? {}));
189
+ const warnings = [];
190
+ const externalEffects = [];
191
+ const extractedVars = [];
192
+ const checkTypes = {};
193
+ let checks = 0;
194
+ let usesCredentials = false;
195
+ const names = new Set();
196
+ const sections = [
197
+ ['setup', scenario.setup ?? []],
198
+ ['steps', scenario.steps],
199
+ ['teardown', scenario.teardown ?? []],
200
+ ];
201
+ for (const [section, list] of sections) {
202
+ list.forEach((step, i) => {
203
+ const at = `${section}[${i}]`;
204
+ if (names.has(step.name))
205
+ warnings.push(`${at}: nome "${step.name}" repetido — a tabela por passo agrega passos com o mesmo nome.`);
206
+ names.add(step.name);
207
+ const strings = [];
208
+ collectStrings(step.path, `${at}.path`, strings);
209
+ collectStrings(step.headers, `${at}.headers`, strings);
210
+ collectStrings(step.body, `${at}.body`, strings);
211
+ collectStrings(step.skipIf, `${at}.skipIf`, strings);
212
+ for (const s of strings) {
213
+ for (const m of s.value.matchAll(TEMPLATE_RE)) {
214
+ const name = (m[1] ?? '').trim();
215
+ if (name.startsWith('user.'))
216
+ usesCredentials = true;
217
+ if (!knownVar(name, defined))
218
+ warnings.push(`${s.at}: {{${name}}} não é definida antes deste passo (variables, extract anterior ou embutidas user.*, vu, iteration, uuid, randomInt(a,b)).`);
219
+ }
220
+ }
221
+ // senhas literais no corpo
222
+ const bodyStrings = [];
223
+ collectStrings(step.body, `${at}.body`, bodyStrings);
224
+ for (const s of bodyStrings) {
225
+ if (/(^|\.)(password|senha|pass|passwd|secret|pin)$/i.test(s.at) && !HAS_TEMPLATE.test(s.value)) {
226
+ warnings.push(`${s.at}: senha literal no roteiro — use {{user.password}} (as credenciais de teste ficam cifradas no FG Tracker).`);
227
+ }
228
+ }
229
+ const auth = Object.entries(step.headers ?? {}).find(([k]) => /^authorization$/i.test(k))?.[1];
230
+ if (auth !== undefined && !HAS_TEMPLATE.test(auth))
231
+ warnings.push(`${at}.headers.authorization: token fixo — extraia o token no login (extract) e use {{token}}.`);
232
+ if (/^https?:\/\//i.test(step.path) && scenario.baseUrl) {
233
+ try {
234
+ if (new URL(step.path.replace(TEMPLATE_RE, 'x')).host !== new URL(scenario.baseUrl).host)
235
+ warnings.push(`${at}.path: URL absoluta com host diferente do baseUrl — o host também precisa ser verificado no projeto.`);
236
+ }
237
+ catch {
238
+ /* template no host */
239
+ }
240
+ }
241
+ const effect = externalEffect(step.method, step.path);
242
+ if (effect)
243
+ externalEffects.push({ step: step.name, section, method: step.method, path: step.path, reason: effect });
244
+ for (const e of step.extract ?? []) {
245
+ defined.add(e.var);
246
+ if (!extractedVars.includes(e.var))
247
+ extractedVars.push(e.var);
248
+ }
249
+ for (const c of step.checks ?? []) {
250
+ checks++;
251
+ checkTypes[c.type] = (checkTypes[c.type] ?? 0) + 1;
252
+ }
253
+ if (section === 'steps' && !(step.checks ?? []).some((c) => c.type === 'status'))
254
+ warnings.push(`${at}: sem check de status — adicione { "type": "status", "in": [200] }.`);
255
+ });
256
+ }
257
+ if (!usesCredentials)
258
+ warnings.push('Nenhum passo usa {{user.username}}/{{user.password}}: todos os VUs serão anônimos. Se a aplicação exige login, adicione o login em setup.');
259
+ if (!scenario.defaults?.thinkTimeMs && scenario.steps.every((s) => s.thinkTimeMs === undefined))
260
+ warnings.push('Sem thinkTimeMs: sem pausas, cada VU gera muito mais carga que um usuário real. Use ex.: defaults.thinkTimeMs [500, 1500].');
261
+ return {
262
+ name: scenario.name,
263
+ baseUrl: scenario.baseUrl ?? null,
264
+ setup: (scenario.setup ?? []).map((s) => `${s.method} ${s.path} (${s.name})`),
265
+ steps: scenario.steps.map((s) => `${s.method} ${s.path} (${s.name})`),
266
+ teardown: (scenario.teardown ?? []).map((s) => `${s.method} ${s.path} (${s.name})`),
267
+ extractedVars,
268
+ checks,
269
+ checkTypes,
270
+ usesCredentials,
271
+ externalEffects,
272
+ warnings,
273
+ };
274
+ }
275
+ export function validateScenario(input) {
276
+ const parsed = scenarioSchema.safeParse(input);
277
+ if (!parsed.success)
278
+ return { ok: false, issues: zodIssues(parsed.error) };
279
+ return { ok: true, scenario: parsed.data, summary: summarizeScenario(parsed.data), issues: [] };
280
+ }
281
+ /* ---------------- plano (§28.3) ---------------- */
282
+ export const EXECUTORS = ['constant-vus', 'ramping-vus', 'constant-arrival-rate', 'ramping-arrival-rate', 'shared-iterations', 'per-vu-iterations'];
283
+ export const PRESETS = ['smoke', 'load', 'stress', 'spike', 'soak', 'breakpoint'];
284
+ const stageSchema = z.strictObject({
285
+ duration: durationSchema,
286
+ target: z.number().int().min(0).describe('Alvo ao fim do estágio: VUs (ramping-vus) ou iterações por timeUnit (ramping-arrival-rate)'),
287
+ });
288
+ const THRESHOLD_EXPR = /^(avg|min|max|med|count|rate|p\(\d+(\.\d+)?\))\s*(<=|>=|<|>|==|!=)\s*\d+(\.\d+)?$/;
289
+ export const planSchema = z
290
+ .strictObject({
291
+ executor: z.enum(EXECUTORS).describe('Executor k6: constant-vus | ramping-vus | constant-arrival-rate | ramping-arrival-rate | shared-iterations | per-vu-iterations'),
292
+ vus: z.number().int().positive().optional().describe('VUs (constant-vus e *-iterations)'),
293
+ duration: durationSchema.optional().describe('Duração (constant-vus, constant-arrival-rate; teto das *-iterations)'),
294
+ stages: z.array(stageSchema).min(1).optional().describe('Estágios (ramping-vus e ramping-arrival-rate)'),
295
+ rate: z.number().positive().optional().describe('Iterações por timeUnit (constant-arrival-rate) ou taxa inicial (ramping-arrival-rate)'),
296
+ timeUnit: durationSchema.optional().describe('Unidade da taxa (default "1s")'),
297
+ preAllocatedVUs: z.number().int().positive().optional().describe('VUs pré-alocados (arrival-rate)'),
298
+ maxVUs: z.number().int().positive().optional().describe('Teto de VUs (arrival-rate)'),
299
+ iterations: z.number().int().positive().optional().describe('shared-iterations: total; per-vu-iterations: por VU'),
300
+ gracefulStop: durationSchema.optional().describe('Tempo para iterações em andamento terminarem (default "30s")'),
301
+ thresholds: z
302
+ .record(z.string(), z.array(z.string().regex(THRESHOLD_EXPR, 'threshold inválido: use ex.: "p(95)<500", "rate<0.01"')))
303
+ .optional()
304
+ .describe('Critérios de aprovação, ex.: { "http_req_duration": ["p(95)<500"], "http_req_failed": ["rate<0.01"], "checks": ["rate>0.99"] }'),
305
+ abortOnFail: z.boolean().optional().describe('Aborta quando um threshold falha'),
306
+ preset: z.enum([...PRESETS, 'custom']).optional().describe('Rótulo do preset (só UI)'),
307
+ })
308
+ .superRefine((plan, ctx) => {
309
+ const need = (field) => {
310
+ if (plan[field] === undefined)
311
+ ctx.addIssue({ code: 'custom', path: [field], message: `executor ${plan.executor} exige ${String(field)}` });
312
+ };
313
+ switch (plan.executor) {
314
+ case 'constant-vus':
315
+ need('vus');
316
+ need('duration');
317
+ break;
318
+ case 'ramping-vus':
319
+ case 'ramping-arrival-rate':
320
+ need('stages');
321
+ if (plan.executor === 'ramping-arrival-rate')
322
+ need('preAllocatedVUs');
323
+ break;
324
+ case 'constant-arrival-rate':
325
+ need('rate');
326
+ need('duration');
327
+ need('preAllocatedVUs');
328
+ break;
329
+ case 'shared-iterations':
330
+ case 'per-vu-iterations':
331
+ need('vus');
332
+ need('iterations');
333
+ break;
334
+ }
335
+ if (plan.maxVUs !== undefined && plan.preAllocatedVUs !== undefined && plan.maxVUs < plan.preAllocatedVUs) {
336
+ ctx.addIssue({ code: 'custom', path: ['maxVUs'], message: 'maxVUs precisa ser ≥ preAllocatedVUs' });
337
+ }
338
+ })
339
+ .describe('Plano de carga estilo k6 (CONTRATO §28.3)');
340
+ export function validatePlan(input) {
341
+ const parsed = planSchema.safeParse(input);
342
+ if (!parsed.success)
343
+ return { ok: false, issues: zodIssues(parsed.error) };
344
+ return { ok: true, plan: parsed.data, issues: [] };
345
+ }
346
+ /** Pico de VUs/taxa e duração de um plano válido (para confirmação e avisos). */
347
+ export function describePlan(plan) {
348
+ const stagesMs = (plan.stages ?? []).reduce((acc, s) => acc + (parseDuration(s.duration) ?? 0), 0);
349
+ const maxTarget = Math.max(0, ...(plan.stages ?? []).map((s) => s.target));
350
+ const unitMs = parseDuration(plan.timeUnit ?? '1s') || 1000;
351
+ const perSecond = (rate) => Math.round((rate * 1000 * 100) / unitMs) / 100;
352
+ let peakVus = plan.vus ?? 0;
353
+ let peakIterationsPerSecond = null;
354
+ let durationMs = plan.duration ? parseDuration(plan.duration) : null;
355
+ switch (plan.executor) {
356
+ case 'ramping-vus':
357
+ peakVus = Math.max(maxTarget, plan.vus ?? 0);
358
+ durationMs = stagesMs;
359
+ break;
360
+ case 'constant-arrival-rate':
361
+ peakVus = plan.maxVUs ?? plan.preAllocatedVUs ?? 0;
362
+ peakIterationsPerSecond = perSecond(plan.rate ?? 0);
363
+ break;
364
+ case 'ramping-arrival-rate':
365
+ peakVus = plan.maxVUs ?? plan.preAllocatedVUs ?? 0;
366
+ peakIterationsPerSecond = perSecond(Math.max(maxTarget, plan.rate ?? 0));
367
+ durationMs = stagesMs;
368
+ break;
369
+ case 'shared-iterations':
370
+ case 'per-vu-iterations':
371
+ durationMs = plan.duration ? parseDuration(plan.duration) : null;
372
+ break;
373
+ }
374
+ return {
375
+ executor: plan.executor,
376
+ peakVus,
377
+ peakIterationsPerSecond,
378
+ durationMs,
379
+ duration: durationMs === null ? 'até concluir as iterações' : formatDuration(durationMs),
380
+ };
381
+ }
382
+ const DEFAULT_THRESHOLDS = { http_req_duration: ['p(95)<500'], http_req_failed: ['rate<0.01'], checks: ['rate>0.99'] };
383
+ function stagesFrom(totalMs, parts) {
384
+ const out = [];
385
+ for (const [fraction, target] of parts) {
386
+ const ms = Math.max(10_000, Math.round((totalMs * fraction) / 10_000) * 10_000);
387
+ out.push({ duration: formatDuration(ms), target: Math.max(0, Math.round(target)) });
388
+ }
389
+ return out;
390
+ }
391
+ function arrivalSizing(peakRate) {
392
+ // ~1 s por iteração pré-alocado, teto de 4 s de iteração (latência alta sob carga).
393
+ return { preAllocatedVUs: Math.max(5, Math.ceil(peakRate)), maxVUs: Math.max(20, Math.ceil(peakRate * 4)) };
394
+ }
395
+ function positiveInt(value, fallback) {
396
+ return value !== undefined && Number.isFinite(value) && value > 0 ? Math.max(1, Math.round(value)) : fallback;
397
+ }
398
+ /**
399
+ * Plano sugerido para cada preset (§28.3), no espírito dos tipos de teste do k6:
400
+ * smoke (1–5 VUs, 1 min), load (rampa + platô), stress (degraus acima do normal), spike (salto súbito),
401
+ * soak (carga média por horas) e breakpoint (rampa de arrival-rate até quebrar, abortOnFail).
402
+ */
403
+ export function presetPlan(preset, options = {}) {
404
+ const requested = options.duration !== undefined ? parseDuration(options.duration) : null;
405
+ if (options.duration !== undefined && (requested === null || requested <= 0))
406
+ throw new Error(`duration inválida: "${options.duration}" (use ex.: "10m", "1h30m")`);
407
+ const rps = options.targetRps !== undefined && options.targetRps > 0 ? options.targetRps : undefined;
408
+ const byRate = rps !== undefined && options.vus === undefined;
409
+ switch (preset) {
410
+ case 'smoke': {
411
+ const vus = Math.min(5, positiveInt(options.vus, 3));
412
+ return { executor: 'constant-vus', vus, duration: formatDuration(requested ?? 60_000), gracefulStop: '30s', thresholds: DEFAULT_THRESHOLDS, abortOnFail: false, preset };
413
+ }
414
+ case 'load': {
415
+ const total = requested ?? 10 * 60_000;
416
+ if (byRate) {
417
+ const sizing = arrivalSizing(rps);
418
+ return { executor: 'ramping-arrival-rate', rate: 1, timeUnit: '1s', ...sizing, stages: stagesFrom(total, [[0.2, rps], [0.7, rps], [0.1, 0]]), gracefulStop: '30s', thresholds: DEFAULT_THRESHOLDS, abortOnFail: false, preset };
419
+ }
420
+ const n = positiveInt(options.vus, 50);
421
+ return { executor: 'ramping-vus', stages: stagesFrom(total, [[0.2, n], [0.7, n], [0.1, 0]]), gracefulStop: '30s', thresholds: DEFAULT_THRESHOLDS, abortOnFail: false, preset };
422
+ }
423
+ case 'stress': {
424
+ const total = requested ?? 20 * 60_000;
425
+ const thresholds = { http_req_duration: ['p(95)<1500'], http_req_failed: ['rate<0.05'], checks: ['rate>0.95'] };
426
+ // Degraus: 50% → 100% → 150% → 200% do "normal" informado, cada um com rampa e platô.
427
+ const steps = (normal) => [
428
+ [0.1, normal * 0.5], [0.15, normal * 0.5],
429
+ [0.1, normal], [0.15, normal],
430
+ [0.1, normal * 1.5], [0.15, normal * 1.5],
431
+ [0.1, normal * 2], [0.05, normal * 2],
432
+ [0.1, 0],
433
+ ];
434
+ if (byRate) {
435
+ const sizing = arrivalSizing(rps * 2);
436
+ return { executor: 'ramping-arrival-rate', rate: 1, timeUnit: '1s', ...sizing, stages: stagesFrom(total, steps(rps)), gracefulStop: '30s', thresholds, abortOnFail: false, preset };
437
+ }
438
+ const n = positiveInt(options.vus, 100);
439
+ return { executor: 'ramping-vus', stages: stagesFrom(total, steps(n)), gracefulStop: '30s', thresholds, abortOnFail: false, preset };
440
+ }
441
+ case 'spike': {
442
+ const total = requested ?? 6 * 60_000;
443
+ const thresholds = { http_req_duration: ['p(95)<2000'], http_req_failed: ['rate<0.05'], checks: ['rate>0.95'] };
444
+ const shape = (peak) => {
445
+ const base = Math.max(1, Math.round(peak * 0.1));
446
+ return [[0.1, base], [0.2, base], [0.05, peak], [0.2, peak], [0.05, base], [0.3, base], [0.1, 0]];
447
+ };
448
+ if (byRate) {
449
+ const sizing = arrivalSizing(rps);
450
+ return { executor: 'ramping-arrival-rate', rate: 1, timeUnit: '1s', ...sizing, stages: stagesFrom(total, shape(rps)), gracefulStop: '30s', thresholds, abortOnFail: false, preset };
451
+ }
452
+ const n = positiveInt(options.vus, 200);
453
+ return { executor: 'ramping-vus', stages: stagesFrom(total, shape(n)), gracefulStop: '30s', thresholds, abortOnFail: false, preset };
454
+ }
455
+ case 'soak': {
456
+ const total = requested ?? 2 * 3_600_000;
457
+ const ramp = Math.min(5 * 60_000, Math.round(total * 0.1));
458
+ const stage = (ms, target) => ({ duration: formatDuration(Math.max(10_000, ms)), target });
459
+ const hold = Math.max(10_000, total - 2 * ramp);
460
+ if (byRate) {
461
+ const sizing = arrivalSizing(rps);
462
+ return { executor: 'ramping-arrival-rate', rate: 1, timeUnit: '1s', ...sizing, stages: [stage(ramp, Math.round(rps)), stage(hold, Math.round(rps)), stage(ramp, 0)], gracefulStop: '1m', thresholds: DEFAULT_THRESHOLDS, abortOnFail: false, preset };
463
+ }
464
+ const n = positiveInt(options.vus, 30);
465
+ return { executor: 'ramping-vus', stages: [stage(ramp, n), stage(hold, n), stage(ramp, 0)], gracefulStop: '1m', thresholds: DEFAULT_THRESHOLDS, abortOnFail: false, preset };
466
+ }
467
+ case 'breakpoint': {
468
+ const total = requested ?? 20 * 60_000;
469
+ // Sem alvo: 10 iterações/s por VU informado (ou 500/s).
470
+ const peak = Math.round(rps ?? (options.vus !== undefined ? positiveInt(options.vus, 50) * 10 : 500));
471
+ const sizing = arrivalSizing(peak);
472
+ return {
473
+ executor: 'ramping-arrival-rate',
474
+ rate: 1,
475
+ timeUnit: '1s',
476
+ preAllocatedVUs: Math.max(10, Math.ceil(peak / 4)),
477
+ maxVUs: options.vus !== undefined ? Math.max(positiveInt(options.vus, 50), Math.ceil(peak / 4)) : sizing.maxVUs,
478
+ stages: [{ duration: formatDuration(total), target: peak }],
479
+ gracefulStop: '10s',
480
+ thresholds: { http_req_duration: ['p(95)<2000'], http_req_failed: ['rate<0.05'] },
481
+ abortOnFail: true,
482
+ preset,
483
+ };
484
+ }
485
+ }
486
+ }
487
+ /** Avisos sobre um plano (tamanho, duração, ausência de thresholds). */
488
+ export function planWarnings(plan) {
489
+ const shape = describePlan(plan);
490
+ const out = [];
491
+ if (shape.peakVus > 5000)
492
+ out.push(`Pico de ${shape.peakVus} VUs: exige ${Math.ceil(shape.peakVus / 250)} shards do executor Lambda — confirme limites de concorrência da conta e do alvo.`);
493
+ if ((shape.peakIterationsPerSecond ?? 0) > 2000)
494
+ out.push(`Pico de ${shape.peakIterationsPerSecond} iterações/s: cada iteração faz vários requests; o RPS real é maior.`);
495
+ if ((shape.durationMs ?? 0) > 4 * 3_600_000)
496
+ out.push(`Duração de ${shape.duration}: o custo do executor e do ambiente-alvo cresce com o tempo.`);
497
+ if (!plan.thresholds || Object.keys(plan.thresholds).length === 0)
498
+ out.push('Sem thresholds: o run não terá critério de aprovação (passed/failed).');
499
+ return out;
500
+ }
501
+ //# sourceMappingURL=scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario.js","sourceRoot":"","sources":["../../src/loadtest/scenario.ts"],"names":[],"mappings":"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"}