From c6478c78567541f1b7e8d0343a7970cfc10a9110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Fonseca?= Date: Tue, 31 Jan 2023 11:44:06 +0100 Subject: [PATCH 1/4] fix(tests): make logs fetching more robust --- tests/e2e/logger/test_logger.py | 2 +- tests/e2e/utils/data_fetcher/logs.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/e2e/logger/test_logger.py b/tests/e2e/logger/test_logger.py index 28ee9c0aac0..d01b293e824 100644 --- a/tests/e2e/logger/test_logger.py +++ b/tests/e2e/logger/test_logger.py @@ -30,7 +30,7 @@ def test_basic_lambda_logs_visible(basic_handler_fn, basic_handler_fn_arn): data_fetcher.get_lambda_response(lambda_arn=basic_handler_fn_arn, payload=payload) # THEN - logs = data_fetcher.get_logs(function_name=basic_handler_fn, start_time=execution_time) + logs = data_fetcher.get_logs(function_name=basic_handler_fn, start_time=execution_time, expected_number_of_logs=2) assert len(logs) == 2 assert len(logs.get_cold_start_log()) == 1 diff --git a/tests/e2e/utils/data_fetcher/logs.py b/tests/e2e/utils/data_fetcher/logs.py index a005009f5f5..bc6f0f84cf3 100644 --- a/tests/e2e/utils/data_fetcher/logs.py +++ b/tests/e2e/utils/data_fetcher/logs.py @@ -122,6 +122,7 @@ def __len__(self) -> int: def get_logs( function_name: str, start_time: datetime, + expected_number_of_logs: Optional[int], filter_expression: Optional[str] = None, log_client: Optional[CloudWatchLogsClient] = None, ) -> LogFetcher: @@ -133,6 +134,8 @@ def get_logs( Name of Lambda function to fetch logs for start_time : datetime Start date range to filter traces + expected_number_of_logs : Optional[int] + Retry fetching logs until this number of log lines are obtained log_client : Optional[CloudWatchLogsClient], optional Amazon CloudWatch Logs Client, by default boto3.client('logs) filter_expression : Optional[str], optional @@ -143,6 +146,11 @@ def get_logs( LogFetcher LogFetcher instance with logs available as properties and methods """ - return LogFetcher( + log_fetcher = LogFetcher( function_name=function_name, start_time=start_time, filter_expression=filter_expression, log_client=log_client ) + + if expected_number_of_logs is not None and len(log_fetcher) < expected_number_of_logs: + raise ValueError(f"expected {expected_number_of_logs} logs but only got ${len(log_fetcher)}") + + return log_fetcher From 76f2054b75f1eb852e520bd248c4f75e837b8730 Mon Sep 17 00:00:00 2001 From: Ruben Fonseca Date: Tue, 31 Jan 2023 14:00:59 +0100 Subject: [PATCH 2/4] Update tests/e2e/utils/data_fetcher/logs.py Co-authored-by: Heitor Lessa Signed-off-by: Ruben Fonseca --- tests/e2e/utils/data_fetcher/logs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/utils/data_fetcher/logs.py b/tests/e2e/utils/data_fetcher/logs.py index bc6f0f84cf3..c96d6e11252 100644 --- a/tests/e2e/utils/data_fetcher/logs.py +++ b/tests/e2e/utils/data_fetcher/logs.py @@ -134,7 +134,7 @@ def get_logs( Name of Lambda function to fetch logs for start_time : datetime Start date range to filter traces - expected_number_of_logs : Optional[int] + minimum_log_entries : Optional[int] Retry fetching logs until this number of log lines are obtained log_client : Optional[CloudWatchLogsClient], optional Amazon CloudWatch Logs Client, by default boto3.client('logs) From f054cdedda580649e30169e1339c26fc3347eafe Mon Sep 17 00:00:00 2001 From: Ruben Fonseca Date: Tue, 31 Jan 2023 14:01:06 +0100 Subject: [PATCH 3/4] Update tests/e2e/utils/data_fetcher/logs.py Co-authored-by: Heitor Lessa Signed-off-by: Ruben Fonseca --- tests/e2e/utils/data_fetcher/logs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/utils/data_fetcher/logs.py b/tests/e2e/utils/data_fetcher/logs.py index c96d6e11252..78244bb9e26 100644 --- a/tests/e2e/utils/data_fetcher/logs.py +++ b/tests/e2e/utils/data_fetcher/logs.py @@ -150,7 +150,7 @@ def get_logs( function_name=function_name, start_time=start_time, filter_expression=filter_expression, log_client=log_client ) - if expected_number_of_logs is not None and len(log_fetcher) < expected_number_of_logs: + if minimum_log_entries < len(log_fetcher): raise ValueError(f"expected {expected_number_of_logs} logs but only got ${len(log_fetcher)}") return log_fetcher From f23f6bba983c6e30a60826701763dbf9e3a61614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Fonseca?= Date: Tue, 31 Jan 2023 14:05:54 +0100 Subject: [PATCH 4/4] chore: refactor --- tests/e2e/logger/test_logger.py | 2 +- tests/e2e/utils/data_fetcher/logs.py | 28 ++++++++++++++++++---------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/tests/e2e/logger/test_logger.py b/tests/e2e/logger/test_logger.py index d01b293e824..80379125d11 100644 --- a/tests/e2e/logger/test_logger.py +++ b/tests/e2e/logger/test_logger.py @@ -30,7 +30,7 @@ def test_basic_lambda_logs_visible(basic_handler_fn, basic_handler_fn_arn): data_fetcher.get_lambda_response(lambda_arn=basic_handler_fn_arn, payload=payload) # THEN - logs = data_fetcher.get_logs(function_name=basic_handler_fn, start_time=execution_time, expected_number_of_logs=2) + logs = data_fetcher.get_logs(function_name=basic_handler_fn, start_time=execution_time, minimum_log_entries=2) assert len(logs) == 2 assert len(logs.get_cold_start_log()) == 1 diff --git a/tests/e2e/utils/data_fetcher/logs.py b/tests/e2e/utils/data_fetcher/logs.py index 78244bb9e26..79fcee9290b 100644 --- a/tests/e2e/utils/data_fetcher/logs.py +++ b/tests/e2e/utils/data_fetcher/logs.py @@ -29,6 +29,7 @@ def __init__( start_time: datetime, log_client: Optional[CloudWatchLogsClient] = None, filter_expression: Optional[str] = None, + minimum_log_entries: int = 1, ): """Fetch and expose Powertools Logger logs from CloudWatch Logs @@ -42,12 +43,15 @@ def __init__( Amazon CloudWatch Logs Client, by default boto3.client('logs) filter_expression : Optional[str], optional CloudWatch Logs Filter Pattern expression, by default "message" + minimum_log_entries: int + Minimum number of log entries to be retrieved before exhausting retry attempts """ self.function_name = function_name self.start_time = int(start_time.timestamp()) self.log_client = log_client or boto3.client("logs") self.filter_expression = filter_expression or "message" # Logger message key self.log_group = f"/aws/lambda/{self.function_name}" + self.minimum_log_entries = minimum_log_entries self.logs: List[Log] = self._get_logs() def get_log(self, key: str, value: Optional[any] = None) -> List[Log]: @@ -112,6 +116,11 @@ def _get_logs(self) -> List[Log]: continue filtered_logs.append(message) + if len(filtered_logs) < self.minimum_log_entries: + raise ValueError( + f"Number of log entries found doesn't meet minimum required ({self.minimum_log_entries}). Repeating..." + ) + return filtered_logs def __len__(self) -> int: @@ -122,7 +131,7 @@ def __len__(self) -> int: def get_logs( function_name: str, start_time: datetime, - expected_number_of_logs: Optional[int], + minimum_log_entries: int = 1, filter_expression: Optional[str] = None, log_client: Optional[CloudWatchLogsClient] = None, ) -> LogFetcher: @@ -134,8 +143,8 @@ def get_logs( Name of Lambda function to fetch logs for start_time : datetime Start date range to filter traces - minimum_log_entries : Optional[int] - Retry fetching logs until this number of log lines are obtained + minimum_log_entries : int + Minimum number of log entries to be retrieved before exhausting retry attempts log_client : Optional[CloudWatchLogsClient], optional Amazon CloudWatch Logs Client, by default boto3.client('logs) filter_expression : Optional[str], optional @@ -146,11 +155,10 @@ def get_logs( LogFetcher LogFetcher instance with logs available as properties and methods """ - log_fetcher = LogFetcher( - function_name=function_name, start_time=start_time, filter_expression=filter_expression, log_client=log_client + return LogFetcher( + function_name=function_name, + start_time=start_time, + filter_expression=filter_expression, + log_client=log_client, + minimum_log_entries=minimum_log_entries, ) - - if minimum_log_entries < len(log_fetcher): - raise ValueError(f"expected {expected_number_of_logs} logs but only got ${len(log_fetcher)}") - - return log_fetcher