From 658d5bed99b705d59741dbcaec1e78db8022fc2a Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Sun, 3 Jan 2021 09:39:39 -0800 Subject: [PATCH 1/7] chore: General simplications and cleanup * Use simplified logic checks * Use list and dict comprehension * Return value directly --- aws_lambda_powertools/logging/filters.py | 2 +- aws_lambda_powertools/logging/formatter.py | 4 +--- aws_lambda_powertools/logging/logger.py | 8 ++------ aws_lambda_powertools/metrics/base.py | 5 +---- aws_lambda_powertools/tracing/tracer.py | 16 +++++++--------- .../utilities/parameters/dynamodb.py | 6 +----- .../utilities/parser/envelopes/cloudwatch.py | 7 +++---- .../utilities/parser/envelopes/dynamodb.py | 16 +++++++--------- .../utilities/parser/envelopes/kinesis.py | 9 ++++----- .../utilities/parser/envelopes/sns.py | 5 +---- .../utilities/parser/envelopes/sqs.py | 5 +---- 11 files changed, 29 insertions(+), 54 deletions(-) diff --git a/aws_lambda_powertools/logging/filters.py b/aws_lambda_powertools/logging/filters.py index ce0770a222d..5bb77f04f78 100644 --- a/aws_lambda_powertools/logging/filters.py +++ b/aws_lambda_powertools/logging/filters.py @@ -13,4 +13,4 @@ def filter(self, record): # noqa: A003 created by loggers who don't have a handler. """ logger = record.name - return False if self.logger in logger else True + return self.logger not in logger diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 647abf33a8a..ded813ac652 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -49,9 +49,7 @@ def _build_root_keys(**kwargs): @staticmethod def _get_latest_trace_id(): xray_trace_id = os.getenv("_X_AMZN_TRACE_ID") - trace_id = xray_trace_id.split(";")[0].replace("Root=", "") if xray_trace_id else None - - return trace_id + return xray_trace_id.split(";")[0].replace("Root=", "") if xray_trace_id else None def update_formatter(self, **kwargs): self.format_dict.update(kwargs) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 74663ec7b4a..9fd6af90bcd 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -291,9 +291,7 @@ def _get_log_level(level: Union[str, int]) -> Union[str, int]: return level log_level: str = level or os.getenv("LOG_LEVEL") - log_level = log_level.upper() if log_level is not None else logging.INFO - - return log_level + return log_level.upper() if log_level is not None else logging.INFO @staticmethod def _get_caller_filename(): @@ -303,9 +301,7 @@ def _get_caller_filename(): # Before previous frame => Caller frame = inspect.currentframe() caller_frame = frame.f_back.f_back.f_back - filename = caller_frame.f_globals["__name__"] - - return filename + return caller_frame.f_globals["__name__"] def set_package_logger( diff --git a/aws_lambda_powertools/metrics/base.py b/aws_lambda_powertools/metrics/base.py index 5b04e8a3f67..b54b72bf58a 100644 --- a/aws_lambda_powertools/metrics/base.py +++ b/aws_lambda_powertools/metrics/base.py @@ -240,10 +240,7 @@ def add_dimension(self, name: str, value: str): # Cast value to str according to EMF spec # Majority of values are expected to be string already, so # checking before casting improves performance in most cases - if isinstance(value, str): - self.dimension_set[name] = value - else: - self.dimension_set[name] = str(value) + self.dimension_set[name] = value if isinstance(value, str) else str(value) def add_metadata(self, key: str, value: Any): """Adds high cardinal metadata for metrics object diff --git a/aws_lambda_powertools/tracing/tracer.py b/aws_lambda_powertools/tracing/tracer.py index 0aab57ee39a..079f662a9ad 100644 --- a/aws_lambda_powertools/tracing/tracer.py +++ b/aws_lambda_powertools/tracing/tracer.py @@ -454,24 +454,22 @@ async def async_tasks(): method_name = f"{method.__name__}" if inspect.iscoroutinefunction(method): - decorate = self._decorate_async_function( + return self._decorate_async_function( method=method, capture_response=capture_response, method_name=method_name ) elif inspect.isgeneratorfunction(method): - decorate = self._decorate_generator_function( + return self._decorate_generator_function( method=method, capture_response=capture_response, method_name=method_name ) elif hasattr(method, "__wrapped__") and inspect.isgeneratorfunction(method.__wrapped__): - decorate = self._decorate_generator_function_with_context_manager( + return self._decorate_generator_function_with_context_manager( method=method, capture_response=capture_response, method_name=method_name ) else: - decorate = self._decorate_sync_function( + return self._decorate_sync_function( method=method, capture_response=capture_response, method_name=method_name ) - return decorate - def _decorate_async_function(self, method: Callable = None, capture_response: bool = True, method_name: str = None): @functools.wraps(method) async def decorate(*args, **kwargs): @@ -650,9 +648,9 @@ def __build_config( self._config["provider"] = provider if provider is not None else self._config["provider"] self._config["auto_patch"] = auto_patch if auto_patch is not None else self._config["auto_patch"] - self._config["service"] = is_service if is_service else self._config["service"] - self._config["disabled"] = is_disabled if is_disabled else self._config["disabled"] - self._config["patch_modules"] = patch_modules if patch_modules else self._config["patch_modules"] + self._config["service"] = is_service or self._config["service"] + self._config["disabled"] = is_disabled or self._config["disabled"] + self._config["patch_modules"] = patch_modules or self._config["patch_modules"] @classmethod def _reset_config(cls): diff --git a/aws_lambda_powertools/utilities/parameters/dynamodb.py b/aws_lambda_powertools/utilities/parameters/dynamodb.py index 4132697f0b9..dcb447b6060 100644 --- a/aws_lambda_powertools/utilities/parameters/dynamodb.py +++ b/aws_lambda_powertools/utilities/parameters/dynamodb.py @@ -206,8 +206,4 @@ def _get_multiple(self, path: str, **sdk_options) -> Dict[str, str]: response = self.table.query(**sdk_options) items.extend(response.get("Items", [])) - retval = {} - for item in items: - retval[item[self.sort_attr]] = item[self.value_attr] - - return retval + return {item[self.sort_attr]: item[self.value_attr] for item in items} diff --git a/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py b/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py index e4ecdd8b5ac..da5dda1ed23 100644 --- a/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py +++ b/aws_lambda_powertools/utilities/parser/envelopes/cloudwatch.py @@ -36,7 +36,6 @@ def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Model) -> Lis logger.debug(f"Parsing incoming data with SNS model {CloudWatchLogsModel}") parsed_envelope = CloudWatchLogsModel.parse_obj(data) logger.debug(f"Parsing CloudWatch records in `body` with {model}") - output = [] - for record in parsed_envelope.awslogs.decoded_data.logEvents: - output.append(self._parse(data=record.message, model=model)) - return output + return [ + self._parse(data=record.message, model=model) for record in parsed_envelope.awslogs.decoded_data.logEvents + ] diff --git a/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py b/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py index 38d19ffe1c6..3315196af3a 100644 --- a/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py +++ b/aws_lambda_powertools/utilities/parser/envelopes/dynamodb.py @@ -32,13 +32,11 @@ def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Model) -> Lis """ logger.debug(f"Parsing incoming data with DynamoDB Stream model {DynamoDBStreamModel}") parsed_envelope = DynamoDBStreamModel.parse_obj(data) - output = [] logger.debug(f"Parsing DynamoDB Stream new and old records with {model}") - for record in parsed_envelope.Records: - output.append( - { - "NewImage": self._parse(data=record.dynamodb.NewImage, model=model), - "OldImage": self._parse(data=record.dynamodb.OldImage, model=model), - } - ) - return output + return [ + { + "NewImage": self._parse(data=record.dynamodb.NewImage, model=model), + "OldImage": self._parse(data=record.dynamodb.OldImage, model=model), + } + for record in parsed_envelope.Records + ] diff --git a/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py b/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py index 97ad7bffec7..b1e47adf46e 100644 --- a/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py +++ b/aws_lambda_powertools/utilities/parser/envelopes/kinesis.py @@ -11,7 +11,7 @@ class KinesisDataStreamEnvelope(BaseEnvelope): """Kinesis Data Stream Envelope to extract array of Records - The record's data parameter is a base64 encoded string which is parsed into a bytes array, + The record's data parameter is a base64 encoded string which is parsed into a bytes array, though it can also be a JSON encoded string. Regardless of its type it'll be parsed into a BaseModel object. @@ -36,8 +36,7 @@ def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Model) -> Lis """ logger.debug(f"Parsing incoming data with Kinesis model {KinesisDataStreamModel}") parsed_envelope: KinesisDataStreamModel = KinesisDataStreamModel.parse_obj(data) - output = [] logger.debug(f"Parsing Kinesis records in `body` with {model}") - for record in parsed_envelope.Records: - output.append(self._parse(data=record.kinesis.data.decode("utf-8"), model=model)) - return output + return [ + self._parse(data=record.kinesis.data.decode("utf-8"), model=model) for record in parsed_envelope.Records + ] diff --git a/aws_lambda_powertools/utilities/parser/envelopes/sns.py b/aws_lambda_powertools/utilities/parser/envelopes/sns.py index f703bb46c63..d4a78199d07 100644 --- a/aws_lambda_powertools/utilities/parser/envelopes/sns.py +++ b/aws_lambda_powertools/utilities/parser/envelopes/sns.py @@ -35,8 +35,5 @@ def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Model) -> Lis """ logger.debug(f"Parsing incoming data with SNS model {SnsModel}") parsed_envelope = SnsModel.parse_obj(data) - output = [] logger.debug(f"Parsing SNS records in `body` with {model}") - for record in parsed_envelope.Records: - output.append(self._parse(data=record.Sns.Message, model=model)) - return output + return [self._parse(data=record.Sns.Message, model=model) for record in parsed_envelope.Records] diff --git a/aws_lambda_powertools/utilities/parser/envelopes/sqs.py b/aws_lambda_powertools/utilities/parser/envelopes/sqs.py index 3ed479ffa31..acc8f9900dd 100644 --- a/aws_lambda_powertools/utilities/parser/envelopes/sqs.py +++ b/aws_lambda_powertools/utilities/parser/envelopes/sqs.py @@ -35,8 +35,5 @@ def parse(self, data: Optional[Union[Dict[str, Any], Any]], model: Model) -> Lis """ logger.debug(f"Parsing incoming data with SQS model {SqsModel}") parsed_envelope = SqsModel.parse_obj(data) - output = [] logger.debug(f"Parsing SQS records in `body` with {model}") - for record in parsed_envelope.Records: - output.append(self._parse(data=record.body, model=model)) - return output + return [self._parse(data=record.body, model=model) for record in parsed_envelope.Records] From 4c82aad7f2d308ed47e214aecf406c00b2205e3f Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Mon, 4 Jan 2021 06:31:27 -0800 Subject: [PATCH 2/7] Does the same and removes that if/else logic Co-authored-by: Joris Conijn --- aws_lambda_powertools/logging/logger.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 9fd6af90bcd..af8b98d8b6b 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -291,7 +291,9 @@ def _get_log_level(level: Union[str, int]) -> Union[str, int]: return level log_level: str = level or os.getenv("LOG_LEVEL") - return log_level.upper() if log_level is not None else logging.INFO + log_level: str = level or os.getenv("LOG_LEVEL", logging.INFO) + + return log_level.upper() @staticmethod def _get_caller_filename(): From fc33ccf621d8666b0e22e241dad1653f2312f66d Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Mon, 4 Jan 2021 06:31:55 -0800 Subject: [PATCH 3/7] Does the same and removes that if/else logic Co-authored-by: Joris Conijn --- aws_lambda_powertools/logging/logger.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index af8b98d8b6b..526cedfd59f 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -290,7 +290,6 @@ def _get_log_level(level: Union[str, int]) -> Union[str, int]: if isinstance(level, int): return level - log_level: str = level or os.getenv("LOG_LEVEL") log_level: str = level or os.getenv("LOG_LEVEL", logging.INFO) return log_level.upper() From ad2e709b0a42593de7cff85322d4771a08a68676 Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Mon, 4 Jan 2021 06:35:21 -0800 Subject: [PATCH 4/7] Removed unneeded blank line. --- aws_lambda_powertools/logging/logger.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 526cedfd59f..3243891c576 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -291,7 +291,6 @@ def _get_log_level(level: Union[str, int]) -> Union[str, int]: return level log_level: str = level or os.getenv("LOG_LEVEL", logging.INFO) - return log_level.upper() @staticmethod From 7a39f0b751624f49f30c9e5b5ba39021f92b269c Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Mon, 4 Jan 2021 06:37:28 -0800 Subject: [PATCH 5/7] fix: Fix indents from accepting github changes --- aws_lambda_powertools/logging/logger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 3243891c576..fb513e86e96 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -290,8 +290,8 @@ def _get_log_level(level: Union[str, int]) -> Union[str, int]: if isinstance(level, int): return level - log_level: str = level or os.getenv("LOG_LEVEL", logging.INFO) - return log_level.upper() + log_level: str = level or os.getenv("LOG_LEVEL", logging.INFO) + return log_level.upper() @staticmethod def _get_caller_filename(): From ad46d93c92e8ce402aa5df1c6d3df5f435613b0f Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Mon, 4 Jan 2021 06:50:24 -0800 Subject: [PATCH 6/7] fix: Temp fix to correct unit tests --- aws_lambda_powertools/logging/logger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index fb513e86e96..203fcbf4220 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -290,7 +290,7 @@ def _get_log_level(level: Union[str, int]) -> Union[str, int]: if isinstance(level, int): return level - log_level: str = level or os.getenv("LOG_LEVEL", logging.INFO) + log_level: str = level or os.getenv("LOG_LEVEL", "INFO") return log_level.upper() @staticmethod From 5c088079828afebc748c3c64ad225fdff0dbf7ba Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Mon, 4 Jan 2021 07:06:50 -0800 Subject: [PATCH 7/7] chore: Make easier to read --- aws_lambda_powertools/logging/logger.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 203fcbf4220..e03f542e6c6 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -290,7 +290,10 @@ def _get_log_level(level: Union[str, int]) -> Union[str, int]: if isinstance(level, int): return level - log_level: str = level or os.getenv("LOG_LEVEL", "INFO") + log_level: str = level or os.getenv("LOG_LEVEL") + if log_level is None: + return logging.INFO + return log_level.upper() @staticmethod