| 145 | |
| 146 | |
| 147 | class QPSTracker: |
| 148 | def __init__(self): |
| 149 | self.query_times = [] |
| 150 | self.total_queries = 0 |
| 151 | self.failed_queries = 0 |
| 152 | self.start_time = None |
| 153 | self.end_time = None |
| 154 | self.lock = threading.Lock() |
| 155 | |
| 156 | def start_tracking(self): |
| 157 | self.start_time = time.time() |
| 158 | self.query_times = [] |
| 159 | self.total_queries = 0 |
| 160 | self.failed_queries = 0 |
| 161 | |
| 162 | def record_query_batch(self, batch_size, batch_duration, failed_count=0): |
| 163 | with self.lock: |
| 164 | self.total_queries += batch_size |
| 165 | self.failed_queries += failed_count |
| 166 | avg_query_time = batch_duration / batch_size if batch_size > 0 else 0 |
| 167 | self.query_times.extend([avg_query_time] * (batch_size - failed_count)) |
| 168 | |
| 169 | def stop_tracking(self): |
| 170 | self.end_time = time.time() |
| 171 | return self.get_metrics() |
| 172 | |
| 173 | def get_metrics(self): |
| 174 | if self.start_time is None or self.end_time is None: |
| 175 | return { |
| 176 | "qps": 0.0, |
| 177 | "avg_query_time": 0.0, |
| 178 | "total_queries": 0, |
| 179 | "successful_queries": 0, |
| 180 | "failed_queries": 0, |
| 181 | "total_duration": 0.0, |
| 182 | } |
| 183 | |
| 184 | total_duration = self.end_time - self.start_time |
| 185 | successful_queries = self.total_queries - self.failed_queries |
| 186 | |
| 187 | qps = successful_queries / total_duration if total_duration > 0 else 0 |
| 188 | avg_query_time = ( |
| 189 | sum(self.query_times) / len(self.query_times) if self.query_times else 0 |
| 190 | ) |
| 191 | |
| 192 | return { |
| 193 | "qps": qps, |
| 194 | "avg_query_time": avg_query_time * 1000, |
| 195 | "total_queries": self.total_queries, |
| 196 | "successful_queries": successful_queries, |
| 197 | "failed_queries": self.failed_queries, |
| 198 | "total_duration": total_duration, |
| 199 | } |
| 200 | |
| 201 | DEFAULT_HOST = os.getenv("COSDATA_HOST", "http://127.0.0.1:8443") |
| 202 | DEFAULT_USER = os.getenv("COSDATA_USERNAME", "admin") |
no outgoing calls