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 default por 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:

ProtocoloMóduloNotas
HTTP/1.1 y HTTP/2k6/httpNegociación automática de HTTP/2
WebSocketk6/experimental/websocketsSoporte completo de tramas WS
gRPCk6/net/grpcUnario y streaming
Redisk6/experimental/redisMediante extensión xk6-redis
Navegadork6/browserChromium 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

HerramientaLenguajeProtocolosModelo VUCI/CD
k6JavaScriptHTTP, WS, gRPC, BrowserGoroutineNativo
JMeterXML/GUIHTTP, JMS, FTP, JDBCHiloPlugin
GatlingScala/DSLHTTP, WSActor asyncMaven/Gradle
LocustPythonHTTP, customCoroutine asyncCLI
ArtilleryYAML/JSHTTP, WSNode.jsNativo
wrkLuaSolo HTTPEpollManual

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; abortOnFail detiene 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.

Artículos Relacionados