Grafana k6 vs. Locust: Load Testing für APIs und Microservices

Performance-Tests gehören zum Handwerk moderner Software-Entwicklung — doch welches Tool ist das richtige? Grafana k6 und Locust sind die beliebtesten Open-Source-Lösungen für Load Testing. k6 setzt auf JavaScript und eine eingebettete Go-Laufzeit für minimalen Ressourcenverbrauch; Locust setzt auf Python und bietet eine eingebaute Web-UI für interaktive Tests.

Dieser Vergleich zeigt Stärken, Schwächen und typische Einsatzszenarien beider Tools.

Grafana k6: JavaScript-basiertes Load Testing

k6 (seit 2021 Teil von Grafana Labs) ist in Go geschrieben und verwendet JavaScript als Skriptsprache. Dadurch ist es extrem ressourceneffizient: Zehntausende virtuelle User sind auf einem einzigen Rechner möglich.

Einfaches k6-Skript

import http from 'k6/http';
import { sleep, check } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 50 },   // Ramp-up auf 50 VUs
    { duration: '1m',  target: 100 },  // Halte 100 VUs
    { duration: '20s', target: 0 },    // Ramp-down
  ],
  thresholds: {
    http_req_duration: ['p(95)<200'],  // 95% der Requests < 200ms
    http_req_failed: ['rate<0.01'],    // < 1% Fehlerrate
  },
};

export default function () {
  const res = http.get('https://example.com/api/products');
  check(res, {
    'Status 200': (r) => r.status === 200,
    'Body enthält Daten': (r) => r.body.includes('id'),
  });
  sleep(1);
}

k6 starten und Ergebnis auswerten

k6 run script.js

Das Ergebnis enthält automatisch p90/p95/p99-Latenzwerte, Fehlerrate und RPS (Requests Per Second) — direkt in der Konsole oder als JSON exportiert.

Grafana-Integration via InfluxDB

# Ergebnisse live nach InfluxDB/Grafana streamen
k6 run --out influxdb=http://localhost:8086/k6 script.js

k6 Kubernetes Operator für verteilte Tests

apiVersion: k6.io/v1alpha1
kind: TestRun
metadata:
  name: api-load-test
spec:
  parallelism: 4  # 4 Pods parallel = 4x VU-Last
  script:
    configMap:
      name: k6-test-script
      file: script.js

Stärken von Grafana k6

  • Go-Laufzeit, JS-API: Sehr geringer Ressourcenverbrauch — 10.000+ VUs auf einem Rechner
  • Eingebaute Metriken: p90/p95/p99 Latenz, Fehlerrate, RPS ohne Plugin
  • Threshold-basierte CI/CD-Gates: Test schlägt fehl, wenn p95 > 200ms — direkt in der Pipeline
  • Grafana-Integration: Direkte Ausgabe nach InfluxDB, Prometheus Remote Write oder Grafana Cloud
  • Browser-Testing: k6/browser-API für Playwright-ähnliche Browser-Flows
  • k6 Operator: Verteilte Tests auf Kubernetes ohne manuelle Koordination
  • Cloud-Modus: Grafana Cloud k6 für skalierte Tests ohne eigene Infrastruktur

Schwächen von k6

  • Kein eingebautes Web-Dashboard — Metriken nur via externe Systeme (Grafana, InfluxDB) visualisierbar
  • JavaScript-Bibliotheken aus dem npm-Ökosystem nicht direkt importierbar (nur k6-kompatible Module)
  • Kein vollständiges async/await-Modell (eigenes Event-Loop-Konzept)

Locust: Python-basiertes Load Testing

Locust ist ein Python-Framework für Load Tests. Tests werden als Python-Klassen geschrieben — voller Zugriff auf das gesamte Python-Ökosystem. Eine eingebaute Web-UI zeigt Echtzeit-Metriken während des Tests.

Einfaches Locust-Skript

from locust import HttpUser, task, between

class ApiUser(HttpUser):
    wait_time = between(1, 2)  # 1-2 Sekunden Pause zwischen Tasks

    @task(3)  # 3x haeufiger als der andere Task
    def get_products(self):
        self.client.get("/api/products")

    @task(1)
    def get_health(self):
        self.client.get("/api/health")

    def on_start(self):
        # Laeuft einmal pro User beim Start - fuer Login etc.
        self.client.post("/api/login", json={
            "username": "testuser",
            "password": "testpass"
        })

Locust starten

# Mit Web-UI (Port 8089)
locust -f locustfile.py --host https://example.com

# Headless-Modus fuer CI/CD
locust -f locustfile.py --headless -u 100 -r 10 \
  --host https://example.com --run-time 60s

Verteilte Tests (Master-Worker)

# Master-Node
locust -f locustfile.py --master --host https://example.com

# Worker-Nodes (beliebig viele)
locust -f locustfile.py --worker --master-host 192.168.1.10

Stärken von Locust

  • Python-Syntax: Voller Zugriff auf das Python-Ökosystem (Faker, SQLAlchemy, Requests...)
  • Web-UI: Eingebautes Real-Time-Dashboard auf Port 8089 — sofort ohne externe Tools nutzbar
  • Flexibles User-Modell: wait_time, Task-Gewichtung, on_start()-Hooks für Login-Flows
  • Verteilte Tests: Master-Worker-Architektur für horizontale Skalierung auf viele Maschinen
  • Einfaches Debugging: Python-Stack-Traces, jeder Python-Entwickler kann sofort loslegen
  • CSV-Export: Ergebnisse direkt aus der Web-UI herunterladbar

Schwächen von Locust

  • Python-Overhead: Höherer RAM/CPU-Verbrauch pro simuliertem User als k6 (Python GIL)
  • Kein nativer Browser-Test-Support (kein Playwright/Puppeteer-ähnliches API)
  • Grafana-Export erfordert zusätzlichen Code oder Plugin
  • Kein offizieller Kubernetes Operator für automatisierte verteilte Tests

Head-to-Head-Vergleich

Merkmal Grafana k6 Locust
Skriptsprache JavaScript Python
Laufzeit Go (eingebettet) Python
Ressourcenverbrauch Sehr gering (Go) Mittel (Python GIL)
Web-UI Nicht eingebaut Ja (Port 8089)
Grafana-Integration Nativ Via Custom-Code
Browser-Testing Ja (k6/browser) Nein
Verteilte Tests k6 Operator / Cloud Master-Worker
Kubernetes-Integration k6 Operator Manuell
CI/CD-Thresholds Native (YAML) Custom-Script
Lernkurve Niedrig (JS) Sehr niedrig (Python)

Wann k6, wann Locust?

k6 ist die bessere Wahl für:

  • Teams, die Grafana bereits für Observability nutzen und nahtlose Integration wollen
  • Kubernetes-basierte Infrastruktur mit automatischen CI/CD-Performance-Gates (Thresholds)
  • Browser-basierte End-to-End-Performance-Tests (Single Page Applications)
  • Sehr hohe Last (10.000+ VUs) mit minimalem Hardware-Aufwand

Locust überzeugt, wenn:

  • Das Team hauptsächlich Python entwickelt und das npm-Ökosystem nicht braucht
  • Komplexe Test-Logik (Zustandsmaschinen, Datenbankabfragen, Authentifizierungsflows) nötig ist
  • Eine eingebaute Web-UI für interaktive, explorative Tests gewünscht wird
  • Schnelles Prototyping ohne Tool-Lernkurve wichtig ist

Typische Use Cases im Vergleich

k6 in der CI/CD-Pipeline (GitHub Actions):

- name: Load Test
  run: k6 run k6/script.js
  env:
    K6_THRESHOLDS_HTTP_REQ_DURATION: "p(95)<200"

Locust für Regression-Tests nach Deployments: Die Web-UI ermöglicht es, Last interaktiv hochzufahren und sofort zu sehen, ab welchem Punkt Fehler auftreten.

Alternativen im Überblick

  • Apache JMeter: GUI-basiertes Java-Tool, Standard in Enterprise-Umgebungen — schwergewichtig
  • Gatling: Scala-basiert, ausgezeichnete HTML-Reports, DSL für komplexe Szenarien
  • Artillery: Node.js-basiert, YAML-Konfiguration für einfache API-Tests, Cloud-Modus vorhanden
  • Wrk / hey: Schnelle HTTP-Benchmarking-Tools ohne Scripting für einfache Einzelmessungen

Weiterführende Artikel

Verwandte Technologien im Techradar