TL;DR — Resumen Rápido
Domina Grafana k6 para pruebas de carga y rendimiento. Usuarios virtuales, umbrales, escenarios, integración CI/CD, pruebas de navegador y dashboards Grafana.
Grafana k6 es una herramienta de pruebas de carga centrada en el desarrollador que ejecuta scripts JavaScript en un motor Go de alto rendimiento. Esto te da reproducibilidad de pruebas como código, control de versiones e integración fluida con CI/CD. Esta guía cubre desde el primer smoke test hasta escenarios de producción con métricas personalizadas, pruebas de navegador y dashboards Grafana.
Requisitos Previos
- Node.js no es necesario — k6 tiene su propio motor JavaScript integrado (Goja, basado en Go con soporte ES6+).
- k6 instalado — Homebrew, apt, Docker o binario de lanzamiento.
- Conocimiento básico de JavaScript — funciones, objetos, bucles.
- Un servicio objetivo — cualquier API HTTP, servidor WebSocket o endpoint gRPC.
Arquitectura de k6
k6 ejecuta scripts JavaScript dentro de un motor Go. Cada usuario virtual (VU) es una goroutine ligera que ejecuta tu función default en un bucle. Conceptos clave:
- VUs — Usuarios virtuales concurrentes. Cada uno ejecuta tu script independientemente.
- Iteraciones — Una ejecución de la función
defaultpor un VU. - Checks — Aserciones (como
status === 200). Los checks fallidos NO detienen la prueba. - Thresholds — Criterios de aprobación/fallo (como
p(95) < 250). Incumplirlos termina k6 con código 99. - Métricas — Integradas (
http_req_duration,http_reqs,vus) y personalizadas (Trend,Counter,Gauge,Rate).
Protocolos integrados:
| Protocolo | Módulo | Notas |
|---|---|---|
| HTTP/1.1 y HTTP/2 | k6/http | Negociación automática de HTTP/2 |
| WebSocket | k6/experimental/websockets | Soporte completo de tramas WS |
| gRPC | k6/net/grpc | Unario y streaming |
| Redis | k6/experimental/redis | Mediante extensión xk6-redis |
| Navegador | k6/browser | Chromium real vía Playwright |
Tipos de Pruebas de Carga
Smoke test — verificar que el script funciona
export const options = { vus: 1, duration: '30s' };
Load test — tráfico esperado normal
export const options = {
stages: [
{ duration: '2m', target: 100 }, // rampa hasta 100 VUs
{ duration: '5m', target: 100 }, // meseta
{ duration: '2m', target: 0 }, // bajada
],
};
Stress test — más allá de la capacidad normal
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 200 },
{ duration: '2m', target: 300 }, // superar lo normal
{ duration: '5m', target: 300 },
{ duration: '2m', target: 0 },
],
};
Spike test — pico repentino
export const options = {
stages: [
{ duration: '10s', target: 1000 }, // pico instantáneo
{ duration: '1m', target: 1000 },
{ duration: '10s', target: 0 }, // bajada instantánea
],
};
Soak test — duración extendida (encontrar fugas de memoria)
export const options = {
stages: [
{ duration: '5m', target: 100 },
{ duration: '8h', target: 100 }, // soak de 8 horas
{ duration: '5m', target: 0 },
],
};
Breakpoint test — encontrar el límite
export const options = {
stages: [{ duration: '2h', target: 20000 }],
thresholds: {
http_req_failed: [{ threshold: 'rate<0.01', abortOnFail: true }],
},
};
Umbrales y Métricas Personalizadas
import { Trend, Counter, Rate } from 'k6/metrics';
const apiLatency = new Trend('api_latency', true);
const apiErrors = new Rate('api_errors');
export const options = {
thresholds: {
http_req_duration: ['p(95)<250'],
http_req_failed: ['rate<0.01'],
api_latency: ['p(99)<500'],
},
};
k6 vs Otras Herramientas
| Herramienta | Lenguaje | Protocolos | Modelo VU | CI/CD |
|---|---|---|---|---|
| k6 | JavaScript | HTTP, WS, gRPC, Browser | Goroutine | Nativo |
| JMeter | XML/GUI | HTTP, JMS, FTP, JDBC | Hilo | Plugin |
| Gatling | Scala/DSL | HTTP, WS | Actor async | Maven/Gradle |
| Locust | Python | HTTP, custom | Coroutine async | CLI |
| Artillery | YAML/JS | HTTP, WS | Node.js | Nativo |
| wrk | Lua | Solo HTTP | Epoll | Manual |
Integración CI/CD con GitHub Actions
name: Load Test
on:
push:
branches: [main]
jobs:
k6-load-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run k6 load test
uses: grafana/k6-action@v0.3.1
with:
filename: tests/load/api.js
flags: --vus 50 --duration 2m
env:
BASE_URL: ${{ secrets.STAGING_URL }}
k6 termina con código 99 al incumplir un umbral, haciendo fallar el paso de Actions automáticamente.
Resumen
- k6 ejecuta JavaScript en un motor Go — VUs ligeros, pruebas como código, compatible con Git.
- Tipos de prueba — smoke, load, stress, spike, soak, breakpoint — cada uno para un riesgo diferente.
- Thresholds imponen aprobación/fallo en CI;
abortOnFaildetiene pruebas de breakpoint descontroladas. - Escenarios con executors separan el control de tasa de llegada del conteo de VUs.
- SharedArray parametriza grandes conjuntos de datos sin sobrecarga de memoria por VU.
- Dashboard Grafana 2587 visualiza resultados en tiempo real desde la salida de InfluxDB.