Przejdź do głównej zawartości

Testowanie obciążenia i analiza wydajności

Twój endpoint kasy działa bez zarzutu na stagingu, a potem wykłada się przy pierwszej akcji marketingowej. Latencja p95 skacze ze 120 ms do 4 s, połączenia do Postgresa się wyczerpują i nikt nie potrafi wskazać zmiany, która to spowodowała. Potrzebujesz testu obciążenia, który odtworzy ten skok, odczytu, która warstwa nasyca się jako pierwsza, oraz bramki regresji w CI, żeby kolejny deploy nie zaskoczył Cię o 21:00.

Ten przewodnik pokazuje, jak prowadzić tę pętlę z pomocą AI: wygenerować realistyczny skrypt k6, uruchomić go, dać modelowi przeczytać wynik i log wolnych zapytań, a następnie wpiąć bramkę progową do pipeline’u. Te same prompty działają w Cursorze, Claude Code i Codeksie — różni się tylko sposób uruchamiania każdego narzędzia.

  • Prompt gotowy do wklejenia, który generuje uruchamialny skrypt k6 z narastającym profilem VU oraz thresholds dla konkretnego endpointu
  • Oficjalny serwer MCP k6 (grafana/mcp-k6) wpięty we wszystkie trzy narzędzia, plus k6 x agent init do bootstrapu jedną komendą
  • Prompt, który zamienia podsumowanie k6 i log wolnych zapytań Postgresa w uszeregowaną listę wąskich gardeł „najpierw najważniejsze”
  • Prompt Playwright + Lighthouse, który mierzy Core Web Vitals (LCP, INP, CLS) pod równoległym obciążeniem
  • Bramka regresji w CI, która oblewa build, gdy p95 ulega regresji, korzystając z kodów wyjścia k6 run
  • Tryby awarii, które sprawiają, że liczby z testów obciążenia kłamią — i jak je wyłapać, zanim zaufasz dashboardowi

Warto zainstalować oficjalny serwer MCP k6 od Grafany (grafana/mcp-k6). Pozwala on agentowi walidować skrypty, uruchamiać testy i czytać dokumentację k6 bez przeklejania outputu CLI w tę i z powrotem. Dostarczany jest jako binarka Go lub obraz Dockera — nie jako pakiet npm, więc zignoruj wszelkie „k6 MCP” oparte na npx, które znajdziesz; to nieoficjalne nakładki.

Najszybsza droga to k6 x agent init (wymaga k6 v2.0+ na PATH), które wrzuca odpowiednie pliki skilli do Twojego edytora i rejestruje serwer MCP dla narzędzia, którego używasz:

Okno terminala
# Bootstrap skilli k6 + konfiguracji MCP dla jednego edytora...
k6 x agent init claude-code # or cursor, codex
# ...albo wepnij każdy obsługiwany edytor naraz
k6 x agent init --all

Jeśli wolisz wpiąć serwer MCP ręcznie, instalacja jest identyczna we wszystkich narzędziach — różni się tylko komenda rejestracji.

Zainstaluj binarkę, a następnie dodaj ją w Settings → MCP → Add, podając mcp-k6 jako komendę (stdio). Albo wrzuć to do .cursor/mcp.json:

{
"mcpServers": {
"k6": { "command": "mcp-k6" }
}
}

Najpierw zainstaluj binarkę: brew tap grafana/grafana && brew install mcp-k6 (lub docker pull grafana/mcp-k6:latest).

Do wydajności po stronie przeglądarki przyda Ci się też Playwright MCP (@playwright/mcp), którego konfiguracja jest taka sama w każdym narzędziu:

Okno terminala
claude mcp add playwright -- npx -y @playwright/mcp@latest

W Cursorze dodaj go przez Settings → MCP; w Codeksie dodaj blok [mcp_servers.playwright] wskazujący na tę samą komendę npx.

Pętla jest taka sama w każdym narzędziu: wygeneruj skrypt, uruchom go, oddaj wyniki do analizy, a potem wepnij go w bramkę w CI. Zmienia się sposób wywołania.

  1. Wygeneruj skrypt na podstawie prawdziwego endpointu, docelowej liczby VU, profilu narastania i jawnych progów — a nie „napisz test obciążenia”.
  2. Uruchom go względem stagingu (k6 run script.js), gdzie serwer MCP pozwala agentowi bezpośrednio wykonywać go i czytać output.
  3. Przeanalizuj wyniki, przekazując modelowi podsumowanie k6 oraz log wolnych zapytań i prosząc o uszeregowaną listę wąskich gardeł.
  4. Wepnij bramkę w CI, żeby regresja p95 oblała build, zanim trafi na produkcję.

Oto jak odpalić krok 1 i 2 w każdym narzędziu. Prompt jest identyczny — wklej do dowolnego z nich prompt generowania testu obciążenia poniżej.

Otwórz panel agenta (Cmd+I), wklej prompt i pozwól mu napisać tests/load/checkout.js. Z podłączonym serwerem MCP k6 agent może sam uruchomić k6 run i iterować nad oblanymi progami w trybie inline. Użyj checkpointu przed przebiegiem, żeby móc wycofać skrypt, jeśli wygenerowany profil VU jest nierealistyczny.

Wygenerowany skrypt powinien wyjść mniej więcej tak — konkretne etapy VU i progi, a nie szkielet ścieżki happy path:

import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 200 }, // ramp to peak
{ duration: '5m', target: 200 }, // hold
{ duration: '1m', target: 0 }, // ramp down
],
thresholds: {
http_req_duration: ['p(95)<300', 'p(99)<800'],
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.post(`${__ENV.STAGING_URL}/api/checkout`, JSON.stringify({
cartId: 'c_load_test', paymentMethod: 'pm_test',
}), { headers: { 'Content-Type': 'application/json' } });
check(res, { 'status is 200': (r) => r.status === 200 });
sleep(1); // think time so 200 VUs != 200 RPS
}

k6 run kończy się kodem niezerowym, gdy próg zostaje przekroczony, i to właśnie sprawia, że bramka CI z ostatniego kroku jest banalnie prosta.

Ponieważ k6 run zwraca niezerowy kod wyjścia, gdy któryś próg zostanie przekroczony, krok CI sprowadza się do uruchomienia skryptu — bez własnej logiki porównań. Użyj oficjalnej grafana/setup-k6-action, a nie ręcznie sklejonej instalacji przez curl:

.github/workflows/load-test.yml
- uses: actions/checkout@v5
- uses: grafana/setup-k6-action@v1
- run: k6 run tests/load/checkout.js
env:
STAGING_URL: ${{ secrets.STAGING_URL }}
TOKEN: ${{ secrets.LOAD_TEST_TOKEN }}

Żeby pójść dalej, podłącz Sentry MCP, aby agent mógł skorelować przekroczenia progów z błędami i wolnymi transakcjami, które Sentry zarejestrował podczas przebiegu. Zdalny serwer to najprostsza konfiguracja i jest identyczny we wszystkich narzędziach:

Okno terminala
# Official Sentry remote MCP (recommended)
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
# Local stdio alternative, if you need it
claude mcp add sentry -- npx -y @sentry/mcp-server

Potem zapytaj: „Dla okna testu obciążenia 14:00–14:08 UTC wyciągnij najwolniejsze transakcje i wszelkie nowe błędy z Sentry i zestaw je z przekroczeniami progów k6.” To zamienia czerwony przebieg CI w konkretną listę transakcji do naprawy.

Liczby z testów obciążenia kłamią w przewidywalny sposób. Oto tryby awarii, które wysyłają zespoły w pogoń za niewłaściwą naprawą.

Gdy wynik wygląda na niemożliwy, przekaż swojemu narzędziu AI pełne podsumowanie k6 i metryki zasobów generatora i poproś, żeby odróżniło prawdziwe wąskie gardło serwera od artefaktu testu, zanim eskalujesz.