| """
|
| Locust load testing file for MnemoCore API.
|
|
|
| Usage:
|
| locust -f tests/load/locustfile.py --host http://localhost:8100
|
|
|
| Then open http://localhost:8089 to configure and run the load test.
|
| """
|
|
|
| import random
|
| import string
|
| from locust import HttpUser, task, between
|
|
|
|
|
| def random_content(length: int = 100) -> str:
|
| """Generate random content string."""
|
| return ''.join(random.choices(string.ascii_letters + string.digits + ' ', k=length))
|
|
|
|
|
| class StoreMemoryUser(HttpUser):
|
| """User that stores memories to MnemoCore."""
|
|
|
| wait_time = between(0.1, 0.5)
|
|
|
| def on_start(self):
|
| """Initialize user with API key."""
|
| self.api_key = "test-api-key"
|
| self.headers = {"X-API-Key": self.api_key}
|
|
|
| @task(10)
|
| def store_memory(self):
|
| """Store a random memory."""
|
| payload = {
|
| "content": random_content(200),
|
| "metadata": {
|
| "source": "load_test",
|
| "timestamp": random.randint(1000000000, 2000000000)
|
| }
|
| }
|
| self.client.post(
|
| "/memories",
|
| json=payload,
|
| headers=self.headers,
|
| name="/memories [STORE]"
|
| )
|
|
|
|
|
| class QueryMemoryUser(HttpUser):
|
| """User that queries memories from MnemoCore."""
|
|
|
| wait_time = between(0.05, 0.2)
|
|
|
| def on_start(self):
|
| """Initialize user with API key and some queries."""
|
| self.api_key = "test-api-key"
|
| self.headers = {"X-API-Key": self.api_key}
|
| self.queries = [
|
| "test query",
|
| "memory search",
|
| "find similar",
|
| "cognitive recall",
|
| "semantic search"
|
| ]
|
|
|
| @task(20)
|
| def query_memory(self):
|
| """Query for similar memories."""
|
| query = random.choice(self.queries)
|
| self.client.get(
|
| f"/query?q={query}&limit=10",
|
| headers=self.headers,
|
| name="/query [SEARCH]"
|
| )
|
|
|
|
|
| class MixedUser(HttpUser):
|
| """User that performs both store and query operations."""
|
|
|
| wait_time = between(0.1, 0.3)
|
|
|
| def on_start(self):
|
| """Initialize user."""
|
| self.api_key = "test-api-key"
|
| self.headers = {"X-API-Key": self.api_key}
|
|
|
| @task(3)
|
| def store_memory(self):
|
| """Store a random memory."""
|
| payload = {
|
| "content": random_content(150),
|
| "metadata": {"source": "mixed_user"}
|
| }
|
| self.client.post(
|
| "/memories",
|
| json=payload,
|
| headers=self.headers,
|
| name="/memories [STORE]"
|
| )
|
|
|
| @task(7)
|
| def query_memory(self):
|
| """Query for memories."""
|
| self.client.get(
|
| "/query?q=test&limit=5",
|
| headers=self.headers,
|
| name="/query [SEARCH]"
|
| )
|
|
|
| @task(1)
|
| def health_check(self):
|
| """Check API health."""
|
| self.client.get("/health", name="/health [CHECK]")
|
|
|