# K6 Baseline Load Test Report

**Date:** 2026-04-09
**Environment:** Local dev (macOS, localhost:3001)
**K6 Version:** v1.7.1
**API Status:** Running (NestJS dev mode)

## Executive Summary

All four K6 test suites executed successfully. Latency metrics are excellent across all endpoints — well within SLA thresholds. However, functional correctness is impacted by dev environment limitations (auth endpoints return 500 due to database/dependency issues, Typesense unavailable for search).

**Key finding:** The API server handles high concurrency well at the network/framework level. Actual business logic performance needs re-validation once backend dependencies (PostgreSQL + Prisma, Typesense, VNPay) are fully operational.

## SLA Thresholds (from config)

| Metric | Target | Status |
|--------|--------|--------|
| p50 latency | < 200ms | **PASS** (all suites < 3ms) |
| p95 latency | < 500ms | **PASS** (all suites < 6ms) |
| p99 latency | < 1000ms | **PASS** (all suites < 19ms) |
| Error rate | < 1% | **FAIL** (auth/listings/payments return 500) |

## Detailed Results

### 1. Auth Suite (auth.js)

| Metric | Value |
|--------|-------|
| Peak VUs | 100 |
| Duration | 2m (ramp 30s → sustain 1m → ramp-down 30s) |
| Total Requests | 4,572 |
| Throughput | 37.6 req/s |
| p50 latency | 2.12ms |
| p95 latency | 5.24ms |
| p99 latency | 9.12ms |
| Error Rate | 100% (HTTP 500 — internal server error) |
| Data Received | 7.6 MB (62 kB/s) |

**Notes:**
- Register endpoint (`POST /auth/register`) returns 500 — likely Prisma/DB connection issue in dev
- Login tests could not run (no users in pool due to failed registration)
- Latency baseline is solid — the framework + routing layer responds fast

### 2. Listings Suite (listings.js)

| Metric | Value |
|--------|-------|
| Peak VUs | 500 |
| Duration | 3m (ramp 30s → sustain 2m → ramp-down 30s) |
| Total Requests | 56,347 |
| Throughput | 311.7 req/s |
| p50 latency | 0.55ms |
| p95 latency | 2.37ms |
| p99 latency | 4.24ms |
| Error Rate | 100% (HTTP 500) |
| Data Received | 68 MB (377 kB/s) |

**Notes:**
- Highest throughput of all suites (311 req/s at 500 VUs)
- Sub-millisecond p50 indicates very fast error responses
- Detail endpoint not tested (no listings created in setup)
- Need to re-test with seeded DB data for realistic benchmarks

### 3. Search Suite (search.js)

| Metric | Value |
|--------|-------|
| Peak VUs | 200 |
| Duration | 3m (ramp 30s → sustain 2m → ramp-down 30s) |
| Total Requests | 18,743 |
| Throughput | 103.7 req/s |
| p50 latency | 1.27ms |
| p95 latency | 2.59ms |
| p99 latency | 4.57ms |
| Error Rate | 0% (503 responses treated as acceptable) |
| Data Received | 155 MB (856 kB/s) |

**Notes:**
- Text search: p95 = 2.65ms, Geo search: p95 = 2.55ms
- HTTP error rate 0% (503 from Typesense is expected in dev without Typesense running)
- Response validation fails (no `data` field in 503 responses) — expected
- Fixed `URLSearchParams` K6 compatibility issue during this test run

### 4. Payments Suite (payments.js)

| Metric | Value |
|--------|-------|
| Peak VUs | 50 |
| Duration | 2m (ramp 30s → sustain 1m → ramp-down 30s) |
| Total Requests | 20 |
| Throughput | 0.17 req/s |
| p50 latency | 1.31ms |
| p95 latency | 5.76ms |
| p99 latency | 18.77ms |
| Error Rate | 100% (setup registration failed) |
| Data Received | 33 kB |

**Notes:**
- Very low request count (20) because setup failed to register users
- Without auth tokens, payment VUs exit immediately
- p99 at 18.77ms is the highest across suites — suggests payment endpoint has more processing overhead
- Need auth working before meaningful payment benchmarks

## Bottlenecks Identified

1. **Auth/Registration (Critical):** `POST /auth/register` returns 500 — blocks all authenticated test flows. Root cause: likely Prisma client not connecting to PostgreSQL or missing migration state.
2. **Typesense Unavailable:** Search returns 503 — expected for local dev without Typesense service. Tests correctly handle this with fallback checks.
3. **K6 Compatibility:** `search.js` used `URLSearchParams` (not available in K6 runtime) — **fixed** by replacing with string interpolation.
4. **Payment Gateway:** VNPay integration returns errors in dev — expected, tests accept 502/503 as valid.

## Baseline Benchmarks (Framework-Level)

These numbers represent the NestJS framework + routing layer performance (error responses), not full business logic:

| Endpoint Category | p50 | p95 | p99 | Max RPS |
|-------------------|-----|-----|-----|---------|
| Auth (register/login) | 2.12ms | 5.24ms | 9.12ms | ~38/s |
| Listings (search/detail) | 0.55ms | 2.37ms | 4.24ms | ~312/s |
| Search (text/geo) | 1.27ms | 2.59ms | 4.57ms | ~104/s |
| Payments (create/list) | 1.31ms | 5.76ms | 18.77ms | ~0.2/s* |

*Payments throughput is artificially low due to setup failure.

## Recommendations

1. **Re-run with full backend:** Set up PostgreSQL + seed data, start Redis, and optionally Typesense before re-running to get business-logic-level benchmarks.
2. **CI integration:** Wire `load-test.yml` GitHub Actions workflow to run against a staging environment with real data.
3. **Performance regression alerts:** Set thresholds in CI — fail the pipeline if p95 > 500ms or error rate > 5%.
4. **Grafana dashboards:** Export K6 results to Grafana Cloud or InfluxDB for historical tracking.
5. **Increase payment VUs:** Once auth works, test payments at 100+ VUs to find gateway bottlenecks.

## Files Generated

- `load-tests/results/auth.json` — Raw K6 JSON output
- `load-tests/results/listings.json` — Raw K6 JSON output
- `load-tests/results/search.json` — Raw K6 JSON output
- `load-tests/results/payments.json` — Raw K6 JSON output
