Skip to content

Commit 3aa0b76

Browse files
authored
test: add unique error message collection in chaos checker (#46262)
/kind improvement - Add normalize_error_message function to extract and normalize error text - Collect unique error messages during chaos test execution - Display error details in assertion messages for better debugging Signed-off-by: zhuwenxing <[email protected]>
1 parent 75d6f0d commit 3aa0b76

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

tests/python_client/chaos/chaos_commons.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ def assert_statistic(
109109
succ_rate = checkers[k].succ_rate()
110110
total = checkers[k].total()
111111
average_time = checkers[k].average_time
112+
error_messages = getattr(checkers[k], 'error_messages', set())
112113
if expectations.get(k, "") == constants.FAIL:
113114
log.info(
114115
f"Expect Fail: {str(k)} succ rate {succ_rate}, total: {total}, average time: {average_time:.4f}"
@@ -121,7 +122,12 @@ def assert_statistic(
121122
log.info(
122123
f"Expect Succ: {str(k)} succ rate {succ_rate}, total: {total}, average time: {average_time:.4f}"
123124
)
125+
# Build assertion message with error details
126+
assert_msg = f"Expect Succ: {str(k)} succ rate {succ_rate}, total: {total}, average time: {average_time:.4f}"
127+
if error_messages:
128+
error_details = "; ".join(error_messages)
129+
assert_msg += f", unique errors({len(error_messages)}): [{error_details}]"
124130
pytest.assume(
125131
succ_rate >= succ_rate_threshold and total > 2,
126-
f"Expect Succ: {str(k)} succ rate {succ_rate}, total: {total}, average time: {average_time:.4f}",
132+
assert_msg,
127133
)

tests/python_client/chaos/checker.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import unittest
33
from enum import Enum
44
import random
5+
import re
56
import time
67
import threading
78
import uuid
@@ -264,6 +265,33 @@ def create_index_params_from_dict(field_name: str, index_param_dict: dict) -> In
264265
return index_params
265266

266267

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+
267295
def trace(fmt=DEFAULT_FMT, prefix='test', flag=True):
268296
def decorate(func):
269297
@functools.wraps(func)
@@ -298,6 +326,14 @@ def inner_wrapper(self, *args, **kwargs):
298326
else:
299327
self._fail += 1
300328
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)
301337
return res, result
302338

303339
return inner_wrapper
@@ -346,6 +382,7 @@ def __init__(self, collection_name=None, partition_name=None, shards_num=2, dim=
346382
self._succ = 0
347383
self._fail = 0
348384
self.fail_records = []
385+
self.error_messages = set() # Store unique error messages
349386
self._keep_running = True
350387
self.rsp_times = []
351388
self.average_time = 0
@@ -675,6 +712,7 @@ def reset(self):
675712
self._fail = 0
676713
self.rsp_times = []
677714
self.fail_records = []
715+
self.error_messages = set()
678716
self.average_time = 0
679717

680718
def get_rto(self):

0 commit comments

Comments
 (0)