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:
| Protokoll | Modul | Hinweise |
|---|---|---|
| HTTP/1.1 und HTTP/2 | k6/http | Automatische HTTP/2-Aushandlung |
| WebSocket | k6/experimental/websockets | Vollständige WS-Frame-Unterstützung |
| gRPC | k6/net/grpc | Unär und Streaming |
| Redis | k6/experimental/redis | Via xk6-Redis-Erweiterung |
| Browser | k6/browser | Echtes 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
| Tool | Sprache | Protokolle | VU-Modell | CI/CD |
|---|---|---|---|---|
| k6 | JavaScript | HTTP, WS, gRPC, Browser | Goroutine | Nativ |
| JMeter | XML/GUI | HTTP, JMS, FTP, JDBC | Thread | Plugin |
| Gatling | Scala/DSL | HTTP, WS | Async-Akteur | Maven/Gradle |
| Locust | Python | HTTP, custom | Async-Coroutine | CLI |
| Artillery | YAML/JS | HTTP, WS | Node.js | Nativ |
| wrk | Lua | Nur HTTP | Epoll | Manuell |
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;
abortOnFailstoppt 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.