PitLane is an automated database evaluation suite for architecture decisions.
Instead of arguing SQL vs NoSQL in abstract, teams define expected read/write patterns in a JSON workload file and PitLane empirically measures:
- Latency under concurrent load
- Throughput and error rate
- Docker CPU and memory usage
- Cost-aware and latency-aware winners per scenario
PitLane then emits recommendation-friendly output that can also be used as a regression gate in CI/CD.
- Pick the right database engine for a new feature using real workload evidence.
- Prevent invisible performance regressions by comparing against a baseline run.
- Evaluate tradeoffs between speed and operational footprint, not just raw latency.
- Workload-driven benchmarking from custom JSON files
- Built-in and custom mock query execution
- Concurrent execution to simulate real user load
- Docker stats telemetry capture (CPU/memory) during each benchmark
- Decision scoring for fastest, cheapest, and balanced recommendation
- Optional regression checks against a previous CSV baseline
- PostgreSQL (Docker)
- MongoDB (Docker)
- DynamoDB Local (Docker)
python -m venv .venv
# Windows PowerShell: .\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
docker-compose up -d
python setup/postgres_setup.py
python setup/dynamo_setup.py
python seed.py
# Run default workload
python run.py --workload workloads/default_workload.json
# Fast smoke validation
python run.py --workload workloads/default_workload.json --smoke
# Generate analysis image
python analyze.py
# Optional dashboard
uvicorn dashboard.main:app --reloadOpen dashboard at http://localhost:8000.
Use workloads/custom_template.json as a starting point.
Each workload contains:
name,version,descriptionschemametadata (your entities/index assumptions)defaultsfor runs/concurrency/warmupscenarioswith either:type: "builtin"for PitLane built-in scenariostype: "custom"withmock_queriesper database
python run.py --workload workloads/default_workload.jsonpython run.py --workload workloads/custom_template.jsonUse smoke mode to run a lightweight pass through the full benchmark pipeline:
python run.py --workload workloads/default_workload.json --smokeYou can tune smoke limits when needed:
python run.py \
--workload workloads/default_workload.json \
--smoke \
--smoke-max-runs 12 \
--smoke-max-concurrency 6 \
--smoke-max-warmup-runs 1Use the previous run output as baseline:
python run.py \
--workload workloads/default_workload.json \
--baseline results/baseline.csv \
--regression-p95-threshold 15 \
--regression-cost-threshold 20 \
--fail-on-regressionIf thresholds are exceeded, PitLane writes results/regressions.csv and exits non-zero when --fail-on-regression is enabled.
Per scenario and database:
- Latency:
avg,p50,p95,p99,min,max - Load profile:
runs,concurrency,throughput_ops_s,error_rate_pct - Resource profile:
cpu_avg_pct,cpu_p95_pct,cpu_max_pct,mem_avg_mb,mem_p95_mb,mem_max_mb - Decision fields:
cost_index,decision_score,latency_winner,cost_winner,recommended
- results/results.csv: full benchmark and decision data
- results/results.png: chart summary from analyze.py
results/regressions.csv(optional): threshold violations vs baseline
Run dashboard API:
uvicorn dashboard.main:app --reloadEndpoints:
GET /serves dashboard/index.htmlGET /api/resultsreturns all benchmark rowsGET /api/summaryreturns per-db best metrics and per-scenario winners
- run.py: concurrent benchmark runner and regression checks
- benchmark.py: DB operations, thread-safe execution, custom query handlers
- workload.py: workload validation and token resolution
- telemetry.py: Docker CPU/memory sampling
- workloads/default_workload.json: built-in default workload
- workloads/custom_template.json: custom schema/query template
Run:
python seed.py- Ensure Docker is running.
- Ensure containers from docker-compose.yml are up.
- Confirm container names match:
benchmark_postgres,benchmark_mongo,benchmark_dynamo.
Run:
python run.py --workload workloads/default_workload.jsondocker-compose down -v
docker-compose up -d
python setup/postgres_setup.py
python setup/dynamo_setup.py
python seed.py
python run.py --workload workloads/default_workload.json
python analyze.py