Skip to content

Commit 04ee1d0

Browse files
fix(tests): make logs fetching more robust (#1878)
Co-authored-by: Heitor Lessa <[email protected]>
1 parent 289a874 commit 04ee1d0

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

tests/e2e/logger/test_logger.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_basic_lambda_logs_visible(basic_handler_fn, basic_handler_fn_arn):
3030
data_fetcher.get_lambda_response(lambda_arn=basic_handler_fn_arn, payload=payload)
3131

3232
# THEN
33-
logs = data_fetcher.get_logs(function_name=basic_handler_fn, start_time=execution_time)
33+
logs = data_fetcher.get_logs(function_name=basic_handler_fn, start_time=execution_time, minimum_log_entries=2)
3434

3535
assert len(logs) == 2
3636
assert len(logs.get_cold_start_log()) == 1

tests/e2e/utils/data_fetcher/logs.py

+17-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __init__(
2929
start_time: datetime,
3030
log_client: Optional[CloudWatchLogsClient] = None,
3131
filter_expression: Optional[str] = None,
32+
minimum_log_entries: int = 1,
3233
):
3334
"""Fetch and expose Powertools Logger logs from CloudWatch Logs
3435
@@ -42,12 +43,15 @@ def __init__(
4243
Amazon CloudWatch Logs Client, by default boto3.client('logs)
4344
filter_expression : Optional[str], optional
4445
CloudWatch Logs Filter Pattern expression, by default "message"
46+
minimum_log_entries: int
47+
Minimum number of log entries to be retrieved before exhausting retry attempts
4548
"""
4649
self.function_name = function_name
4750
self.start_time = int(start_time.timestamp())
4851
self.log_client = log_client or boto3.client("logs")
4952
self.filter_expression = filter_expression or "message" # Logger message key
5053
self.log_group = f"/aws/lambda/{self.function_name}"
54+
self.minimum_log_entries = minimum_log_entries
5155
self.logs: List[Log] = self._get_logs()
5256

5357
def get_log(self, key: str, value: Optional[any] = None) -> List[Log]:
@@ -112,6 +116,11 @@ def _get_logs(self) -> List[Log]:
112116
continue
113117
filtered_logs.append(message)
114118

119+
if len(filtered_logs) < self.minimum_log_entries:
120+
raise ValueError(
121+
f"Number of log entries found doesn't meet minimum required ({self.minimum_log_entries}). Repeating..."
122+
)
123+
115124
return filtered_logs
116125

117126
def __len__(self) -> int:
@@ -122,6 +131,7 @@ def __len__(self) -> int:
122131
def get_logs(
123132
function_name: str,
124133
start_time: datetime,
134+
minimum_log_entries: int = 1,
125135
filter_expression: Optional[str] = None,
126136
log_client: Optional[CloudWatchLogsClient] = None,
127137
) -> LogFetcher:
@@ -133,6 +143,8 @@ def get_logs(
133143
Name of Lambda function to fetch logs for
134144
start_time : datetime
135145
Start date range to filter traces
146+
minimum_log_entries : int
147+
Minimum number of log entries to be retrieved before exhausting retry attempts
136148
log_client : Optional[CloudWatchLogsClient], optional
137149
Amazon CloudWatch Logs Client, by default boto3.client('logs)
138150
filter_expression : Optional[str], optional
@@ -144,5 +156,9 @@ def get_logs(
144156
LogFetcher instance with logs available as properties and methods
145157
"""
146158
return LogFetcher(
147-
function_name=function_name, start_time=start_time, filter_expression=filter_expression, log_client=log_client
159+
function_name=function_name,
160+
start_time=start_time,
161+
filter_expression=filter_expression,
162+
log_client=log_client,
163+
minimum_log_entries=minimum_log_entries,
148164
)

0 commit comments

Comments
 (0)