managarten/services/mana-sync/test/load
Till JS 75a3ea2957 refactor: rename ManaDeck to Cards across entire monorepo
Rename the flashcard/deck management app from ManaDeck to Cards:
- Directory: apps/manadeck → apps/cards, packages/manadeck-database → packages/cards-database
- Packages: @manadeck/* → @cards/*, @manacore/manadeck-database → @manacore/cards-database
- Domain: manadeck.mana.how → cards.mana.how
- Storage: manadeck-storage → cards-storage
- Database: manadeck → cards
- All shared packages, infra configs, services, i18n, and docs updated
- 244 files changed, zero remaining manadeck references

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:45:21 +02:00
..
README.md feat(infra): add load testing + finalize CI/CD for Go and Hono services 2026-03-28 18:22:33 +01:00
sync-load.js refactor: rename ManaDeck to Cards across entire monorepo 2026-04-01 11:45:21 +02:00

mana-sync Load Tests

k6 load tests for the sync server (HTTP sync endpoints + WebSocket connections).

Prerequisites

# Install k6
brew install grafana/tap/k6

# Start infrastructure
pnpm docker:up
pnpm dev:auth
pnpm dev:sync

Get Auth Token

TOKEN=$(curl -s -X POST http://localhost:3001/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"test@example.com","password":"password"}' | jq -r '.token')

Run Tests

Smoke Test (10 VUs, 30s)

k6 run --vus 10 --duration 30s \
  --env AUTH_TOKEN=$TOKEN \
  test/load/sync-load.js

Medium Load (100 VUs, 2min)

k6 run --vus 100 --duration 2m \
  --env AUTH_TOKEN=$TOKEN \
  test/load/sync-load.js

Stress Test (500 VUs, 5min) — ramp scenario

k6 run --env AUTH_TOKEN=$TOKEN test/load/sync-load.js

WebSocket Only (up to 1000 connections)

k6 run --env SCENARIO=websocket --env AUTH_TOKEN=$TOKEN test/load/sync-load.js

Sync Throughput (200 req/s constant)

k6 run --env SCENARIO=sync --env AUTH_TOKEN=$TOKEN test/load/sync-load.js

Thresholds

Metric Target
HTTP p95 < 500ms
Sync push p95 < 300ms
Sync pull p95 < 200ms
Error rate < 1%

Custom Metrics

  • sync_push_duration — POST /sync/{appId} latency
  • sync_pull_duration — GET /sync/{appId}/pull latency
  • ws_connect_duration — WebSocket handshake + auth time
  • sync_conflicts — Number of LWW conflicts detected
  • sync_errors — Error rate across all sync operations