Skip to content

adeptvin1/lwmecps-testapp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

49 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

LWMECPS Test App

БистСма для тСстирования сСтСвых соСдинСний ΠΈ эмуляции Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹

  • 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

ИспользованиС

  1. ЗапуститС систСму:

    docker-compose up -d
  2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ экспСримСнт:

    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
          }]
        }
      }'
  3. ЗапуститС экспСримСнт:

    curl -X POST "http://localhost:8001/api/manage_experiment?state=start&experiment_id=<id>"
  4. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ статистику:

    curl -X GET "http://localhost:8001/api/experiment_stats?experiment_id=<id>"

ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³

  • ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Prometheus доступны Π½Π°:
    • Client: http://localhost:8001/metrics
    • Server: http://localhost:8000/metrics

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

ВрСбования

  • 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

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° API

Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚Ρ‹

GET /test-latency

ВыполняСт ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ тСст Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ хоста ΠΈ ΠΏΠΎΡ€Ρ‚Π°.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • host - хост для тСстирования
  • port - ΠΏΠΎΡ€Ρ‚ для тСстирования

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ExperimentResult с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ статус-ΠΊΠΎΠ΄Π΅, Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π² миллисСкундах ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠ΅

GET /result_experiment

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ экспСримСнта ΠΏΠΎ Π΅Π³ΠΎ ID.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • experiment_id - ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ экспСримСнта

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • ΠžΠ±ΡŠΠ΅ΠΊΡ‚ экспСримСнта со всСми настройками ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ

GET /list_experiments

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ список всСх экспСримСнтов.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • Массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² экспСримСнтов (Π±Π΅Π· ΠΏΠΎΠ»Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основная информация)

POST /create_experiment

Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ экспСримСнт с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • name - имя экспСримСнта
  • settings - настройки экспСримСнта:
    • host - хост для тСстирования
    • port - ΠΏΠΎΡ€Ρ‚ для тСстирования
    • load_profiles - список ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ созданного экспСримСнта

POST /manage_experiment

УправляСт состояниСм экспСримСнта.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • state - состояниС экспСримСнта ("start", "pause", "stop")
  • experiment_id - ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ экспСримСнта

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ экспСримСнта ΠΈ Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ΅ состояниС

POST /create_experiment_group

Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ Π½ΠΎΠ²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ экспСримСнтов.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • name - имя Π³Ρ€ΡƒΠΏΠΏΡ‹
  • experiment_ids - список ID экспСримСнтов

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ созданной Π³Ρ€ΡƒΠΏΠΏΡ‹

POST /add_experiments_to_group

ДобавляСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько экспСримСнтов Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • group_id - ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹
  • experiment_ids - список ID экспСримСнтов для добавлСния

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ список Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… экспСримСнтов

GET /group_stats

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ статистику ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΏΠ΅ экспСримСнтов.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • group_id - ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • ΠžΠ±ΡŠΠ΅ΠΊΡ‚ GroupStats с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΈ статистикой ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ экспСримСнту

GET /list_groups

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ список всСх Π³Ρ€ΡƒΠΏΠΏ экспСримСнтов.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • Массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π³Ρ€ΡƒΠΏΠΏ

POST /delete_groups

УдаляСт всС Π³Ρ€ΡƒΠΏΠΏΡ‹ экспСримСнтов.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:

  • Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ

POST /manage_group

УправляСт состояниСм Π³Ρ€ΡƒΠΏΠΏΡ‹ экспСримСнтов.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • 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()

МодСли Π΄Π°Π½Π½Ρ‹Ρ…

Experiment

class Experiment:
    id: Optional[str]
    name: str
    settings: ExperimentSettings
    state: ExperimentState
    current_profile_index: int
    results: List[ExperimentResult]
    created_at: datetime
    updated_at: datetime

ExperimentGroup

class ExperimentGroup:
    id: Optional[str]
    name: str
    experiment_ids: List[str]
    state: ExperimentState
    created_at: datetime
    updated_at: datetime

LoadProfile

class LoadProfile:
    concurrent_users: int
    request_interval: float
    profile_duration: float

Бостояния экспСримСнтов ΠΈ Π³Ρ€ΡƒΠΏΠΏ

  • pending - ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ запуска
  • running - выполняСтся
  • paused - приостановлСн
  • completed - Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½
  • failed - Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ошибкой

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published