| name | load-testing-k6 |
| description | Use ao construir ou rodar testes de carga com k6. Cobre estrutura de script, thresholds objetivos, execução via Docker, e integração com a observabilidade Prometheus já existente no projeto. |
Teste de carga: k6
Por que k6
Script de teste em JavaScript (sem precisar aprender ferramenta nova de
UI), execução leve (escrito em Go por baixo), thresholds que falham o
processo automaticamente quando o limite não é atingido (essencial para
rodar em pipeline de CI, não só manualmente), e suporta exportar métricas
direto para Prometheus — o que já é a stack de observabilidade deste
projeto.
Estrutura de script
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
scenarios: {
carga_normal: {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '30s', target: 50 },
{ duration: '1m', target: 50 },
{ duration: '30s', target: 0 },
],
},
},
thresholds: {
http_req_duration: ['p(95)<300'],
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.get('http://backend:8080/api/v1/processos');
check(res, { 'status é 200': (r) => r.status === 200 });
sleep(1);
}
Execução via Docker (sem instalar nada na máquina)
docker run --rm -i --network=host grafana/k6 run - < load-tests/processos/listagem.js
Em docker-compose.yml, adicionar como serviço sob demanda (perfil
separado, não sobe com docker compose up -d normal):
services:
k6:
image: grafana/k6
profiles: ["load-test"]
networks:
- default
volumes:
- ./load-tests:/scripts
Executa com: docker compose --profile load-test run k6 run /scripts/processos/listagem.js
Saída e thresholds
thresholds no script já fazem o processo retornar código de saída
diferente de zero se o limite não for atingido — isso é o que torna o
teste de carga "passa/falha" objetivo, não leitura manual de número.
- Para enviar resultado direto ao Prometheus já existente no projeto:
k6 run --out experimental-prometheus-rw script.js (requer endpoint
remote-write do Prometheus configurado).
Cenários comuns
- Carga normal (smoke/load): simula tráfego esperado do dia a dia —
use para validar que o sistema aguenta o uso normal.
- Carga de pico (stress): sobe além do esperado para encontrar o
ponto de quebra — use só quando o dono do produto quiser saber o limite
real, não como padrão de toda feature.
- Carga sustentada (soak): mantém carga moderada por tempo longo (ex:
30 min+) para detectar vazamento de memória/degradação — usar com
moderação, é mais caro de rodar.
Interpretação de resultado
p(95) e p(99) importam mais que a média — a média esconde os piores
casos que afetam usuários reais.
- Taxa de erro (
http_req_failed) acima do limite é mais grave que
latência alta — geralmente indica saturação real, não só lentidão.