snikhilesh commited on
Commit
ea096d7
·
verified ·
1 Parent(s): bc3fc7c

Deploy simple_load_test.py to backend/ directory

Browse files
Files changed (1) hide show
  1. backend/simple_load_test.py +227 -0
backend/simple_load_test.py ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Simplified Load Testing - Synchronous Version
3
+ """
4
+
5
+ import requests
6
+ import time
7
+ import statistics
8
+ from datetime import datetime
9
+
10
+ class SimpleLoadTester:
11
+ def __init__(self, base_url="http://localhost:7860"):
12
+ self.base_url = base_url
13
+ self.results = []
14
+
15
+ def make_request(self, endpoint):
16
+ start = time.time()
17
+ try:
18
+ response = requests.get(f"{self.base_url}{endpoint}", timeout=5)
19
+ latency_ms = (time.time() - start) * 1000
20
+ return {
21
+ 'success': response.status_code == 200,
22
+ 'latency_ms': latency_ms,
23
+ 'status_code': response.status_code,
24
+ 'endpoint': endpoint
25
+ }
26
+ except Exception as e:
27
+ latency_ms = (time.time() - start) * 1000
28
+ return {
29
+ 'success': False,
30
+ 'latency_ms': latency_ms,
31
+ 'status_code': 0,
32
+ 'endpoint': endpoint,
33
+ 'error': str(e)
34
+ }
35
+
36
+ def run_test(self, endpoint, num_requests=50):
37
+ print(f"\n{'='*60}")
38
+ print(f"Testing: {endpoint}")
39
+ print(f"Requests: {num_requests}")
40
+ print(f"{'='*60}")
41
+
42
+ results = []
43
+ for i in range(num_requests):
44
+ result = self.make_request(endpoint)
45
+ results.append(result)
46
+ self.results.append(result)
47
+
48
+ if (i + 1) % 10 == 0:
49
+ print(f"Progress: {i+1}/{num_requests}")
50
+
51
+ # Analyze results
52
+ successes = [r for r in results if r['success']]
53
+ failures = [r for r in results if not r['success']]
54
+ latencies = [r['latency_ms'] for r in successes]
55
+
56
+ print(f"\nResults for {endpoint}:")
57
+ print(f" Total Requests: {len(results)}")
58
+ print(f" Successful: {len(successes)} ({len(successes)/len(results)*100:.1f}%)")
59
+ print(f" Failed: {len(failures)} ({len(failures)/len(results)*100:.1f}%)")
60
+
61
+ if latencies:
62
+ print(f"\nLatency Statistics:")
63
+ print(f" Mean: {statistics.mean(latencies):.2f} ms")
64
+ print(f" Median: {statistics.median(latencies):.2f} ms")
65
+ print(f" Min: {min(latencies):.2f} ms")
66
+ print(f" Max: {max(latencies):.2f} ms")
67
+ if len(latencies) > 1:
68
+ print(f" Std Dev: {statistics.stdev(latencies):.2f} ms")
69
+
70
+ def verify_monitoring_accuracy(self):
71
+ print(f"\n{'='*60}")
72
+ print("VERIFYING MONITORING ACCURACY")
73
+ print(f"{'='*60}")
74
+
75
+ # Get initial count
76
+ response = requests.get(f"{self.base_url}/health/dashboard")
77
+ initial_data = response.json()
78
+ initial_count = initial_data['system']['total_requests']
79
+ print(f"Initial request count: {initial_count}")
80
+
81
+ # Make exactly 20 requests
82
+ print(f"\nMaking 20 test requests...")
83
+ for i in range(20):
84
+ self.make_request("/health")
85
+
86
+ time.sleep(1) # Wait for metrics to update
87
+
88
+ # Get final count
89
+ response = requests.get(f"{self.base_url}/health/dashboard")
90
+ final_data = response.json()
91
+ final_count = final_data['system']['total_requests']
92
+ print(f"Final request count: {final_count}")
93
+
94
+ actual_increase = final_count - initial_count
95
+ expected_increase = 20
96
+
97
+ print(f"\nMonitoring Accuracy:")
98
+ print(f" Expected increase: {expected_increase}")
99
+ print(f" Actual increase: {actual_increase}")
100
+ print(f" Accuracy: {(actual_increase/expected_increase*100):.1f}%")
101
+
102
+ if actual_increase >= expected_increase * 0.95:
103
+ print(f" PASS: Monitoring is accurately tracking requests")
104
+ else:
105
+ print(f" WARNING: Monitoring may have tracking issues")
106
+
107
+ def test_cache_effectiveness(self):
108
+ print(f"\n{'='*60}")
109
+ print("TESTING CACHE EFFECTIVENESS")
110
+ print(f"{'='*60}")
111
+
112
+ # Get initial cache stats
113
+ response = requests.get(f"{self.base_url}/health/dashboard")
114
+ initial_data = response.json()
115
+ initial_hits = initial_data['cache']['hits']
116
+ initial_misses = initial_data['cache']['misses']
117
+ initial_hit_rate = initial_data['cache']['hit_rate']
118
+
119
+ print(f"Initial cache state:")
120
+ print(f" Hits: {initial_hits}")
121
+ print(f" Misses: {initial_misses}")
122
+ print(f" Hit Rate: {(initial_hit_rate * 100):.1f}%")
123
+
124
+ # Make repeated requests
125
+ print(f"\nMaking 30 requests to test caching...")
126
+ for i in range(30):
127
+ self.make_request("/health/dashboard")
128
+
129
+ time.sleep(1)
130
+
131
+ # Get final cache stats
132
+ response = requests.get(f"{self.base_url}/health/dashboard")
133
+ final_data = response.json()
134
+ final_hits = final_data['cache']['hits']
135
+ final_misses = final_data['cache']['misses']
136
+ final_hit_rate = final_data['cache']['hit_rate']
137
+
138
+ print(f"\nFinal cache state:")
139
+ print(f" Hits: {final_hits}")
140
+ print(f" Misses: {final_misses}")
141
+ print(f" Hit Rate: {(final_hit_rate * 100):.1f}%")
142
+
143
+ print(f"\nCache Performance:")
144
+ print(f" Hit increase: {final_hits - initial_hits}")
145
+ print(f" Miss increase: {final_misses - initial_misses}")
146
+ print(f" Current hit rate: {(final_hit_rate * 100):.1f}%")
147
+
148
+ def generate_report(self):
149
+ print(f"\n{'='*60}")
150
+ print("COMPREHENSIVE LOAD TEST REPORT")
151
+ print(f"{'='*60}")
152
+ print(f"Generated: {datetime.now().isoformat()}")
153
+
154
+ if not self.results:
155
+ print("No test results available")
156
+ return
157
+
158
+ total = len(self.results)
159
+ successes = [r for r in self.results if r['success']]
160
+ failures = [r for r in self.results if not r['success']]
161
+
162
+ print(f"\nOverall Statistics:")
163
+ print(f" Total Requests: {total}")
164
+ print(f" Successful: {len(successes)} ({len(successes)/total*100:.1f}%)")
165
+ print(f" Failed: {len(failures)} ({len(failures)/total*100:.1f}%)")
166
+
167
+ all_latencies = [r['latency_ms'] for r in successes]
168
+ if all_latencies:
169
+ print(f"\nGlobal Latency Statistics:")
170
+ print(f" Mean: {statistics.mean(all_latencies):.2f} ms")
171
+ print(f" Median: {statistics.median(all_latencies):.2f} ms")
172
+ print(f" Min: {min(all_latencies):.2f} ms")
173
+ print(f" Max: {max(all_latencies):.2f} ms")
174
+
175
+ # Breakdown by endpoint
176
+ endpoints = set(r['endpoint'] for r in self.results)
177
+ print(f"\nBreakdown by Endpoint:")
178
+ for endpoint in sorted(endpoints):
179
+ endpoint_results = [r for r in self.results if r['endpoint'] == endpoint]
180
+ endpoint_successes = [r for r in endpoint_results if r['success']]
181
+ print(f" {endpoint}:")
182
+ print(f" Requests: {len(endpoint_results)}")
183
+ print(f" Success Rate: {len(endpoint_successes)/len(endpoint_results)*100:.1f}%")
184
+ if endpoint_successes:
185
+ latencies = [r['latency_ms'] for r in endpoint_successes]
186
+ print(f" Avg Latency: {statistics.mean(latencies):.2f} ms")
187
+
188
+ print(f"\nLoad testing complete!")
189
+
190
+ def main():
191
+ print("="*60)
192
+ print("MEDICAL AI PLATFORM - MONITORING LOAD TEST")
193
+ print("="*60)
194
+ print(f"Target: http://localhost:7860")
195
+ print(f"Started: {datetime.now().isoformat()}")
196
+
197
+ tester = SimpleLoadTester()
198
+
199
+ try:
200
+ # Test 1: Health endpoint
201
+ tester.run_test("/health", num_requests=50)
202
+
203
+ # Test 2: Dashboard endpoint
204
+ tester.run_test("/health/dashboard", num_requests=30)
205
+
206
+ # Test 3: Admin endpoints
207
+ tester.run_test("/admin/cache/statistics", num_requests=20)
208
+
209
+ # Test 4: Monitoring accuracy
210
+ tester.verify_monitoring_accuracy()
211
+
212
+ # Test 5: Cache effectiveness
213
+ tester.test_cache_effectiveness()
214
+
215
+ # Generate final report
216
+ tester.generate_report()
217
+
218
+ print(f"\n{'='*60}")
219
+ print("ALL TESTS COMPLETED SUCCESSFULLY")
220
+ print(f"{'='*60}")
221
+
222
+ except Exception as e:
223
+ print(f"\nTest failed with error: {str(e)}")
224
+ raise
225
+
226
+ if __name__ == "__main__":
227
+ main()