TL;DR — Kurzzusammenfassung

Grafana k6 für Last- und Performance-Tests meistern. Virtuelle Nutzer, Schwellenwerte, Szenarien, CI/CD-Integration, Browser-Tests und Grafana-Dashboards.

Grafana k6 ist ein entwicklerorientiertes Lasttest-Tool, das JavaScript-Skripte auf einem hochperformanten Go-Runtime ausführt. Dies bietet Ihnen reproduzierbare Tests als Code, Versionskontrolle und nahtlose CI/CD-Integration. Dieser Leitfaden deckt alles ab, vom ersten Smoke-Test bis hin zu produktionsreifen Szenarien mit benutzerdefinierten Metriken, Browser-Tests und Grafana-Dashboards.

Voraussetzungen

  • Node.js nicht erforderlich — k6 hat eine eigene integrierte JavaScript-Runtime (Goja, Go-basierte ES6+-Engine).
  • k6 installiert — Homebrew, apt, Docker oder Release-Binary.
  • Grundlegende JavaScript-Kenntnisse — Funktionen, Objekte, Schleifen.
  • Ein Zieldienst — jede HTTP-API, WebSocket-Server oder gRPC-Endpunkt.

k6-Architektur

k6 führt JavaScript-Skripte in einer Go-Runtime aus. Jeder virtuelle Nutzer (VU) ist eine leichtgewichtige Goroutine, die Ihre default-Funktion in einer Schleife ausführt. Schlüsselkonzepte:

  • VUs — Gleichzeitige virtuelle Nutzer. Jeder führt Ihr Skript unabhängig aus.
  • Iterationen — Eine Ausführung der default-Funktion durch einen VU.
  • Checks — Assertions (wie status === 200). Fehlgeschlagene Checks stoppen den Test NICHT.
  • Thresholds — Bestehens-/Fehlerkriterien (wie p(95) < 250). Verletzung beendet k6 mit Code 99.
  • Metriken — Integriert (http_req_duration, http_reqs, vus) und benutzerdefiniert (Trend, Counter, Gauge, Rate).

Integrierte Protokolle:

ProtokollModulHinweise
HTTP/1.1 und HTTP/2k6/httpAutomatische HTTP/2-Aushandlung
WebSocketk6/experimental/websocketsVollständige WS-Frame-Unterstützung
gRPCk6/net/grpcUnär und Streaming
Redisk6/experimental/redisVia xk6-Redis-Erweiterung
Browserk6/browserEchtes Chromium via Playwright

Lasttest-Typen

Smoke-Test — Skript-Funktionalität prüfen

export const options = { vus: 1, duration: '30s' };

Last-Test — normaler erwarteter Traffic

export const options = {
  stages: [
    { duration: '2m', target: 100 }, // Hochlauf auf 100 VUs
    { duration: '5m', target: 100 }, // Plateau
    { duration: '2m', target: 0   }, // Abfahrt
  ],
};

Stress-Test — über normale Kapazität hinaus

export const options = {
  stages: [
    { duration: '2m', target: 100 },
    { duration: '5m', target: 200 },
    { duration: '2m', target: 300 }, // über Normal hinaus
    { duration: '5m', target: 300 },
    { duration: '2m', target: 0   },
  ],
};

Spike-Test — plötzlicher Anstieg

export const options = {
  stages: [
    { duration: '10s', target: 1000 }, // sofortiger Spike
    { duration: '1m',  target: 1000 },
    { duration: '10s', target: 0    }, // sofortiger Abfall
  ],
};

Soak-Test — erweiterte Dauer (Speicherlecks finden)

export const options = {
  stages: [
    { duration: '5m', target: 100 },
    { duration: '8h', target: 100 }, // 8-Stunden-Soak
    { duration: '5m', target: 0   },
  ],
};

Breakpoint-Test — Grenzen finden

export const options = {
  stages: [{ duration: '2h', target: 20000 }],
  thresholds: {
    http_req_failed: [{ threshold: 'rate<0.01', abortOnFail: true }],
  },
};

Schwellenwerte und benutzerdefinierte Metriken

import { Trend, 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. andere Tools

ToolSpracheProtokolleVU-ModellCI/CD
k6JavaScriptHTTP, WS, gRPC, BrowserGoroutineNativ
JMeterXML/GUIHTTP, JMS, FTP, JDBCThreadPlugin
GatlingScala/DSLHTTP, WSAsync-AkteurMaven/Gradle
LocustPythonHTTP, customAsync-CoroutineCLI
ArtilleryYAML/JSHTTP, WSNode.jsNativ
wrkLuaNur HTTPEpollManuell

CI/CD-Integration mit 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 beendet sich mit Code 99 bei Schwellenwertverstoß, was den Actions-Schritt automatisch fehlschlagen lässt.


Zusammenfassung

  • k6 führt JavaScript auf Go-Runtime aus — leichtgewichtige VUs, Tests als Code, Git-kompatibel.
  • Testtypen — Smoke, Last, Stress, Spike, Soak, Breakpoint — jeder für ein anderes Risiko.
  • Thresholds erzwingen Bestehen/Versagen in CI; abortOnFail stoppt unkontrollierte Breakpoint-Tests.
  • Szenarien mit Executors trennen die Steuerung der Ankunftsrate von der VU-Anzahl.
  • SharedArray parametrisiert große Datensätze ohne Speicheroverhead pro VU.
  • Grafana-Dashboard 2587 visualisiert Echtzeitergebnisse aus der InfluxDB-Ausgabe.

Verwandte Artikel