1import requests
2import time
3import sys
4from datetime import datetime
5
6# Configuration
7URL = "http://localhost:8080/xrpc/app.vylet.feed.getActorPosts?actor=hailey.at"
8INITIAL_DELAY = 5.0
9MIN_DELAY = 0.001
10RAMP_FACTOR = 0.5
11
12
13def make_request(session, request_num, delay):
14 try:
15 start_time = time.time()
16 response = session.get(URL, timeout=10)
17 elapsed = time.time() - start_time
18
19 timestamp = datetime.now().strftime("%H:%M:%S")
20 rate = 1 / delay if delay > 0 else float("inf")
21
22 print(
23 f"[{timestamp}] Request #{request_num:4d} | "
24 f"Status: {response.status_code} | "
25 f"Time: {elapsed:.3f}s | "
26 f"Rate: {rate:.2f} req/s"
27 )
28
29 return True
30 except requests.exceptions.RequestException as e:
31 timestamp = datetime.now().strftime("%H:%M:%S")
32 print(f"[{timestamp}] Request #{request_num:4d} | ERROR: {e}")
33 return False
34
35
36def main():
37 print("=" * 70)
38 print("Gradual Load Tester")
39 print("=" * 70)
40 print(f"Target URL: {URL}")
41 print(f"Starting delay: {INITIAL_DELAY}s ({1 / INITIAL_DELAY:.2f} req/s)")
42 print(f"Min delay: {MIN_DELAY}s ({1 / MIN_DELAY:.2f} req/s)")
43 print(
44 f"Ramp factor: {RAMP_FACTOR} (gets {(1 - RAMP_FACTOR) * 100:.0f}% faster each cycle)"
45 )
46 print("=" * 70)
47 print("\nPress Ctrl+C to stop\n")
48
49 session = requests.Session()
50 delay = INITIAL_DELAY
51 request_num = 0
52
53 try:
54 while True:
55 request_num += 1
56 make_request(session, request_num, delay)
57
58 time.sleep(delay)
59
60 if delay > MIN_DELAY:
61 delay = max(delay * RAMP_FACTOR, MIN_DELAY)
62 if delay == MIN_DELAY:
63 print(f"\n{'=' * 70}")
64 print(f"Reached maximum rate: {1 / MIN_DELAY:.2f} requests/second")
65 print(f"{'=' * 70}\n")
66
67 except KeyboardInterrupt:
68 print(f"\n\n{'=' * 70}")
69 print(f"Stopped after {request_num} requests")
70 print(f"Final rate: {1 / delay:.2f} requests/second")
71 print(f"{'=' * 70}")
72 sys.exit(0)
73
74
75if __name__ == "__main__":
76 main()