Π‘ΠΈΡΡΠ΅ΠΌΠ° Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠ΅Π²ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΈ ΡΠΌΡΠ»ΡΡΠΈΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ.
- Server (
/server
) - Π‘Π΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄Π»Ρ ΡΠΌΡΠ»ΡΡΠΈΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ - Client (
/client
) - ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΠ°ΠΌΠΈ - MongoDB - ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ²
# ΠΠ°ΠΏΡΡΠΊ Π²ΡΠ΅Ρ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
docker-compose up -d
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΠ°ΡΡΡΠ°
docker-compose ps
# ΠΡΠΎΡΠΌΠΎΡΡ Π»ΠΎΠ³ΠΎΠ²
docker-compose logs -f
- Client API:
8001
- Server API:
8000
- MongoDB:
27017
.
βββ client/ # ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
β βββ api/ # API endpoints
β βββ models/ # Pydantic ΠΌΠΎΠ΄Π΅Π»ΠΈ
β βββ database.py # MongoDB ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
βββ server/ # Π‘Π΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
β βββ api/ # API endpoints
β βββ config.py # ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
βββ docker-compose.yml
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» .env
Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ:
# Client
CLIENT_HOST=0.0.0.0
CLIENT_PORT=8001
CLIENT_DEBUG=True
MONGODB_URI=mongodb://mongodb:27017
DATABASE_NAME=network_checks
# Server
SERVER_HOST=0.0.0.0
SERVER_PORT=8000
SERVER_DEBUG=True
CPU_LIMIT=200
RAM_LIMIT=256
MAX_LATENCY=0.5
-
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ:
docker-compose up -d
-
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ:
curl -X POST "http://localhost:8001/api/create_experiment" \ -H "Content-Type: application/json" \ -d '{ "settings": { "hosts": [{"host": "server", "port": 8000}], "timeout": 1.0, "load_profiles": [{ "concurrent_users": 1, "request_interval": 1.0, "profile_duration": 60 }] } }'
-
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ:
curl -X POST "http://localhost:8001/api/manage_experiment?state=start&experiment_id=<id>"
-
ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ:
curl -X GET "http://localhost:8001/api/experiment_stats?experiment_id=<id>"
- ΠΠ΅ΡΡΠΈΠΊΠΈ Prometheus Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π°:
- Client:
http://localhost:8001/metrics
- Server:
http://localhost:8000/metrics
- Client:
- Python 3.10+
- Docker ΠΈ Docker Compose
- MongoDB
# Client
cd client
pip install -r requirements.txt
# Server
cd server
pip install -r requirements.txt
# Client
cd client
uvicorn main:app --reload --host 0.0.0.0 --port 8001
# Server
cd server
uvicorn main:app --reload --host 0.0.0.0 --port 8000
MIT
ΠΠ°Π½Π½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ API Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ FastAPI, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ (latency) ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ². Π‘Π΅ΡΠ²ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ, ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ ΠΏΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ API.
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ (Ρ ΠΎΡΡ, ΠΏΠΎΡΡ, ΠΏΡΠΎΡΠΈΠ»ΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠΈ)
- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ²
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π³ΡΡΠΏΠΏ (Π·Π°ΠΏΡΡΠΊ, ΠΏΠ°ΡΠ·Π°, ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ°)
- ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ API-ΡΠ½Π΄ΠΏΠΎΠΈΠ½ΡΠΎΠ²
- Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² Π² MongoDB
- ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ΅Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΈ Π³ΡΡΠΏΠΏ
- ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ Π³ΡΡΠΏΠΏΡ
- ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· Π³ΡΡΠΏΠΏ
- Docker ΠΈ Docker Compose
- Python 3.6+ (Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ)
- FastAPI
- httpx
- MongoDB
- asyncio
ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΡΠ΅ΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ ΠΎΡΡΠ° ΠΈ ΠΏΠΎΡΡΠ°.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
host
- Ρ ΠΎΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡport
- ΠΏΠΎΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ±ΡΠ΅ΠΊΡ
ExperimentResult
Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ ΡΡΠ°ΡΡΡ-ΠΊΠΎΠ΄Π΅, Π·Π°Π΄Π΅ΡΠΆΠΊΠ΅ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅ΡΠΊΠ΅
ΠΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° ΠΏΠΎ Π΅Π³ΠΎ ID.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
experiment_id
- ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ±ΡΠ΅ΠΊΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°ΠΌΠΈ
ΠΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ°ΡΡΠΈΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² (Π±Π΅Π· ΠΏΠΎΠ»Π½ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ)
Π‘ΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
name
- ΠΈΠΌΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°settings
- Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°:host
- Ρ ΠΎΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡport
- ΠΏΠΎΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡload_profiles
- ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠΈ
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°
Π£ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
state
- ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° ("start", "pause", "stop")experiment_id
- ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
Π‘ΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΡ Π³ΡΡΠΏΠΏΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
name
- ΠΈΠΌΡ Π³ΡΡΠΏΠΏΡexperiment_ids
- ΡΠΏΠΈΡΠΎΠΊ ID ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ²
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ
ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΡΡΠ΅ΡΡΠ²ΡΡΡΡΡ Π³ΡΡΠΏΠΏΡ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
group_id
- ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡexperiment_ids
- ΡΠΏΠΈΡΠΎΠΊ ID ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ ΠΈ ΡΠΏΠΈΡΠΎΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ²
ΠΠΎΠ»ΡΡΠ°Π΅Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ Π³ΡΡΠΏΠΏΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
group_id
- ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ±ΡΠ΅ΠΊΡ
GroupStats
Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ Π³ΡΡΠΏΠΏΠ΅ ΠΈ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ
ΠΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ Π³ΡΡΠΏΠΏ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ°ΡΡΠΈΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π³ΡΡΠΏΠΏ
Π£Π΄Π°Π»ΡΠ΅Ρ Π²ΡΠ΅ Π³ΡΡΠΏΠΏΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ
Π£ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π³ΡΡΠΏΠΏΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
group_id
- ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡstate
- ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΡΡΠΏΠΏΡ ("start", "pause", "stop")
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ:
- ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ ΠΈ Π΅Π΅ Π½ΠΎΠ²ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅
import requests
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°
experiment_data = {
"name": "Π’Π΅ΡΡΠΎΠ²ΡΠΉ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ",
"settings": {
"host": "example.com",
"port": 80,
"load_profiles": [
{
"concurrent_users": 10,
"request_interval": 1.0,
"profile_duration": 60.0
},
{
"concurrent_users": 20,
"request_interval": 0.5,
"profile_duration": 30.0
}
]
}
}
response = requests.post("http://localhost:8001/api/create_experiment", json=experiment_data)
experiment_id = response.json()["experiment_id"]
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³ΡΡΠΏΠΏΡ
group_data = {
"name": "Π’Π΅ΡΡΠΎΠ²Π°Ρ Π³ΡΡΠΏΠΏΠ°",
"experiment_ids": [experiment_id]
}
response = requests.post("http://localhost:8001/api/create_experiment_group", json=group_data)
group_id = response.json()["group_id"]
# ΠΠ°ΠΏΡΡΠΊ Π³ΡΡΠΏΠΏΡ
response = requests.post(
"http://localhost:8001/api/manage_group",
params={"group_id": group_id, "state": "start"}
)
# ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΈ
response = requests.get(f"http://localhost:8001/api/group_stats?group_id={group_id}")
stats = response.json()
class Experiment:
id: Optional[str]
name: str
settings: ExperimentSettings
state: ExperimentState
current_profile_index: int
results: List[ExperimentResult]
created_at: datetime
updated_at: datetime
class ExperimentGroup:
id: Optional[str]
name: str
experiment_ids: List[str]
state: ExperimentState
created_at: datetime
updated_at: datetime
class LoadProfile:
concurrent_users: int
request_interval: float
profile_duration: float
pending
- ΠΎΠΆΠΈΠ΄Π°Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°running
- Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡpaused
- ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½completed
- Π·Π°Π²Π΅ΡΡΠ΅Π½failed
- Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ