Latência medida em tela vazia mente. Você roda a suíte de integração, vê 80 ms de resposta e publica. Usuários reais batem na API com centenas de conexões simultâneas, cache frio depois do deploy e pool de banco menor que o tráfego. Load testing roda carga parecida com produção em staging e transforma latência em número que o time defende. O k6, da Grafana, escreve o cenário em JavaScript e quebra o build quando o número passa do combinado.

Cenário que espelha o tráfego

Estágios de rampa substituem subida instantânea: 2 minutos subindo para 50 usuários virtuais, 5 minutos em plateau, 2 minutos descendo. Think time entre passos espalha chamadas como gente lendo tela. Dados de carga vêm de gerador apontando para staging com distribuição parecida com produção, onde uma fatia pequena de buscas concentra a maior parte do tráfego. Cenário com número redondo e distribuição uniforme produz latência bonita que produção não entrega.

Thresholds que quebram o build

Threshold transforma expectativa em regra: http_req_duration: p(95)<400 e http_req_failed: rate<0.01. K6 falha a execução quando viola; CI falha junto. Checks validam contrato por resposta, com status e schema do payload. O Google SRE Book (O'Reilly, 2016) trata latência e erro como SLI; o threshold do k6 é o SLI automatizado antes de existir SLA assinado.

k6 no pipeline

Job do GitHub Actions instala k6, roda o script e publica o resultado como artifact. Cenário curto de regressão, de 2 minutos no fluxo crítico de compra, entra em cada merge. Cenário longo de capacidade roda semanal. Extensões xk6 adicionam saída para Prometheus quando o time quer gráfico além do relatório de CI. John Allspaw, em The Art of Capacity Planning (O'Reilly, 2008), defende teste com a carga do crescimento previsto, não só a de hoje.

Ponto de saturação e o que observar

RPS sobe com VUs até um teto; depois, latência dispara e RPS estagna. Esse teto costuma viver no pool de conexões do banco, antes de viver no CPU da aplicação. Você observa fila de conexões, uso de pool e latência p99 durante o teste, e amarra o script a um trace de request por ID para transformar cada pico em investigação. Cenário sem observabilidade vira número solto que ninguém consegue explicar na reunião de review.