|
2 | 2 | import unittest |
3 | 3 | from enum import Enum |
4 | 4 | import random |
| 5 | +import re |
5 | 6 | import time |
6 | 7 | import threading |
7 | 8 | import uuid |
@@ -264,6 +265,33 @@ def create_index_params_from_dict(field_name: str, index_param_dict: dict) -> In |
264 | 265 | return index_params |
265 | 266 |
|
266 | 267 |
|
| 268 | +def normalize_error_message(error_msg): |
| 269 | + """ |
| 270 | + Normalize error message by extracting text from message= fields. |
| 271 | + Only keep letter content from message values to group similar errors. |
| 272 | + """ |
| 273 | + msg = str(error_msg) |
| 274 | + # Extract all message= content |
| 275 | + messages = re.findall(r'message[=:]\s*["\']?([^"\'>,\)]+)', msg, re.IGNORECASE) |
| 276 | + if messages: |
| 277 | + # Combine all message content and keep only letters and spaces |
| 278 | + combined = ' '.join(messages) |
| 279 | + combined = re.sub(r'[^a-zA-Z\s]', ' ', combined) |
| 280 | + combined = re.sub(r'\s+', ' ', combined).strip() |
| 281 | + return combined |
| 282 | + # Fallback: extract text from details= if no message found |
| 283 | + details = re.findall(r'details\s*=\s*"([^"]+)"', msg) |
| 284 | + if details: |
| 285 | + combined = ' '.join(details) |
| 286 | + combined = re.sub(r'[^a-zA-Z\s]', ' ', combined) |
| 287 | + combined = re.sub(r'\s+', ' ', combined).strip() |
| 288 | + return combined |
| 289 | + # Last fallback: keep only letters from entire message |
| 290 | + msg = re.sub(r'[^a-zA-Z\s]', ' ', msg) |
| 291 | + msg = re.sub(r'\s+', ' ', msg).strip() |
| 292 | + return msg |
| 293 | + |
| 294 | + |
267 | 295 | def trace(fmt=DEFAULT_FMT, prefix='test', flag=True): |
268 | 296 | def decorate(func): |
269 | 297 | @functools.wraps(func) |
@@ -298,6 +326,14 @@ def inner_wrapper(self, *args, **kwargs): |
298 | 326 | else: |
299 | 327 | self._fail += 1 |
300 | 328 | self.fail_records.append(("failure", self._succ + self._fail, start_time, start_time_ts)) |
| 329 | + # Collect unique error messages (normalized to group similar errors) |
| 330 | + if hasattr(res, 'message'): |
| 331 | + normalized_msg = normalize_error_message(res.message) |
| 332 | + elif res is not None: |
| 333 | + normalized_msg = normalize_error_message(str(res)) |
| 334 | + else: |
| 335 | + normalized_msg = "Unknown error" |
| 336 | + self.error_messages.add(normalized_msg) |
301 | 337 | return res, result |
302 | 338 |
|
303 | 339 | return inner_wrapper |
@@ -346,6 +382,7 @@ def __init__(self, collection_name=None, partition_name=None, shards_num=2, dim= |
346 | 382 | self._succ = 0 |
347 | 383 | self._fail = 0 |
348 | 384 | self.fail_records = [] |
| 385 | + self.error_messages = set() # Store unique error messages |
349 | 386 | self._keep_running = True |
350 | 387 | self.rsp_times = [] |
351 | 388 | self.average_time = 0 |
@@ -675,6 +712,7 @@ def reset(self): |
675 | 712 | self._fail = 0 |
676 | 713 | self.rsp_times = [] |
677 | 714 | self.fail_records = [] |
| 715 | + self.error_messages = set() |
678 | 716 | self.average_time = 0 |
679 | 717 |
|
680 | 718 | def get_rto(self): |
|
0 commit comments