From 106ded0ea4b53420cdab201f4407467200ba0e95 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sat, 15 Aug 2020 22:37:32 +0200 Subject: [PATCH 1/8] docs: clarify auto_patch as per #108 --- docs/content/core/tracer.mdx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/content/core/tracer.mdx b/docs/content/core/tracer.mdx index ba489b0c965..17b1b540f0b 100644 --- a/docs/content/core/tracer.mdx +++ b/docs/content/core/tracer.mdx @@ -199,6 +199,11 @@ async def collect_payment(charge_id): Tracer keeps a copy of its configuration after the first initialization. This is useful for scenarios where you want to use Tracer in more than one location across your code base. + + When reusing Tracer in Lambda Layers, or in multiple modules, do not set auto_patch=False, because import order matters. +

This can result in the first Tracer config being inherited by new instances, and their modules not being patched. +

+ ```python:title=lambda_handler.py # handler.py from aws_lambda_powertools import Tracer @@ -214,8 +219,8 @@ def handler(event, context): ```python:title=another_file.py from aws_lambda_powertools import Tracer # highlight-start -# new instance using existing configuration with auto patching overriden -tracer = Tracer(auto_patch=False) +# new instance using existing configuration +tracer = Tracer(service="payment") # highlight-end ``` From c6cf2af7347d43adf109f9b95edc8b4e600be66d Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sat, 15 Aug 2020 22:40:53 +0200 Subject: [PATCH 2/8] chore: update Tracer docs as per #108 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 655762a5611..34100fc4a1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed +- **Docs**: Clarify confusion on Tracer reuse and `auto_patch=False` statement + ## [1.1.1] - 2020-08-14 ### Fixed - **Logger**: Regression on `Logger` level not accepting `int` i.e. `Logger(level=logging.INFO)` From ba3eb2ed736ef66f1c6975d4dc6eee1de6f45b94 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sun, 16 Aug 2020 18:52:23 +0200 Subject: [PATCH 3/8] fix: return subclass #107 --- aws_lambda_powertools/logging/logger.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index b248055aacf..e2b55f9928f 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -34,7 +34,11 @@ def _is_cold_start() -> bool: return cold_start -class Logger: +# PyCharm does not support autocomplete via getattr +# so we need to return to subclassing removed in #97 +# All methods/properties continue to be proxied to inner logger +# https://github.com/awslabs/aws-lambda-powertools-python/issues/107 +class Logger(logging.Logger): """Creates and setups a logger to format statements in JSON. Includes service name and any additional key=value into logs @@ -187,7 +191,8 @@ def _configure_sampling(self): self.log_level = logging.DEBUG except ValueError: raise InvalidLoggerSamplingRateError( - f"Expected a float value ranging 0 to 1, but received {self.sampling_rate} instead. Please review POWERTOOLS_LOGGER_SAMPLE_RATE environment variable." # noqa E501 + f"Expected a float value ranging 0 to 1, but received {self.sampling_rate} instead." + f"Please review POWERTOOLS_LOGGER_SAMPLE_RATE environment variable." ) def inject_lambda_context(self, lambda_handler: Callable[[Dict, Any], Any] = None, log_event: bool = False): From 1291505a10686c5f25c5182dcff0b5905737a70a Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sun, 16 Aug 2020 18:53:45 +0200 Subject: [PATCH 4/8] improv: cover log statement location --- tests/functional/test_logger.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index 083220ccf8c..fe33f810ce1 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -1,3 +1,4 @@ +import inspect import io import json import logging @@ -344,3 +345,17 @@ def test_logger_level_env_var_as_int(monkeypatch): monkeypatch.setenv("LOG_LEVEL", 50) with pytest.raises(ValueError, match="Unknown level: '50'"): Logger() + + +def test_logger_record_caller_location(stdout): + # GIVEN Logger is initialized + logger = Logger(stream=stdout) + + # WHEN log statement is run + logger.info("log") + + # THEN 'location' field should have + # the correct caller resolution + caller_fn_name = inspect.currentframe().f_code.co_name + log = capture_logging_output(stdout) + assert caller_fn_name in log["location"] From b4680049df58527ec6a51bc837d1a45851bbc7bf Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sun, 16 Aug 2020 18:54:56 +0200 Subject: [PATCH 5/8] chore: remove unused stdout fixture --- tests/functional/test_logger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/functional/test_logger.py b/tests/functional/test_logger.py index fe33f810ce1..7b0c870ee07 100644 --- a/tests/functional/test_logger.py +++ b/tests/functional/test_logger.py @@ -296,7 +296,7 @@ def test_logger_children_propagate_changes(stdout): assert child.parent.name == "order" -def test_logger_child_not_set_returns_same_logger(stdout): +def test_logger_child_not_set_returns_same_logger(): # GIVEN two Loggers are initialized with the same service name # WHEN child param isn't set logger_one = Logger(service="something") @@ -309,7 +309,7 @@ def test_logger_child_not_set_returns_same_logger(stdout): assert logger_one.name is logger_two.name -def test_logger_level_case_insensitive(stdout): +def test_logger_level_case_insensitive(): # GIVEN a Loggers is initialized # WHEN log level is set as "info" instead of "INFO" logger = Logger(level="info") From 1eafdf456916dfc856b58c859bdba0efdc656d1e Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sun, 16 Aug 2020 18:57:20 +0200 Subject: [PATCH 6/8] chore: add autocomplete as unreleased --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34100fc4a1a..d2476c2a53a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - **Docs**: Clarify confusion on Tracer reuse and `auto_patch=False` statement +- **Logger**: Autocomplete for log statements in PyCharm ## [1.1.1] - 2020-08-14 ### Fixed From 75b2c16babd5c5589ed7cbd9bc912c478ad3d705 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sun, 16 Aug 2020 19:22:14 +0200 Subject: [PATCH 7/8] chore: suppress LGTM alert We don't initialize logging.Logger as we use an inner Logger and obj proxy instead. --- 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 e2b55f9928f..54c21e88528 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -38,7 +38,7 @@ def _is_cold_start() -> bool: # so we need to return to subclassing removed in #97 # All methods/properties continue to be proxied to inner logger # https://github.com/awslabs/aws-lambda-powertools-python/issues/107 -class Logger(logging.Logger): +class Logger(logging.Logger): # lgtm [py/missing-call-to-init] """Creates and setups a logger to format statements in JSON. Includes service name and any additional key=value into logs From d39186707f92509d7b73ca2227205ac6735d269b Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Sun, 16 Aug 2020 19:33:40 +0200 Subject: [PATCH 8/8] chore: bump version to 1.1.2 --- CHANGELOG.md | 1 + pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2476c2a53a..61385f19246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.1.2] - 2020-08-16 ### Fixed - **Docs**: Clarify confusion on Tracer reuse and `auto_patch=False` statement - **Logger**: Autocomplete for log statements in PyCharm diff --git a/pyproject.toml b/pyproject.toml index ea087088993..9b4f5ba34e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "aws_lambda_powertools" -version = "1.1.1" +version = "1.1.2" description = "Python utilities for AWS Lambda functions including but not limited to tracing, logging and custom metric" authors = ["Amazon Web Services"] classifiers=[