From 091a32c88d6388c226ffa0dd9c60887f79058f1a Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Tue, 4 Oct 2022 17:57:00 +0200 Subject: [PATCH 1/6] refactor(logger): localize powertools_dev logic and warning to ease reusing --- aws_lambda_powertools/logging/formatter.py | 4 ++-- aws_lambda_powertools/shared/constants.py | 1 + aws_lambda_powertools/shared/functions.py | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/logging/formatter.py b/aws_lambda_powertools/logging/formatter.py index 51f60a87021..25f9c227c97 100644 --- a/aws_lambda_powertools/logging/formatter.py +++ b/aws_lambda_powertools/logging/formatter.py @@ -9,7 +9,7 @@ from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union from ..shared import constants -from ..shared.functions import strtobool +from ..shared.functions import powertools_dev_is_set RESERVED_LOG_ATTRS = ( "name", @@ -116,7 +116,7 @@ def __init__( self.json_deserializer = json_deserializer or json.loads self.json_default = json_default or str self.json_indent = ( - constants.PRETTY_INDENT if strtobool(os.getenv("POWERTOOLS_DEV", "0")) else constants.COMPACT_INDENT + constants.PRETTY_INDENT if powertools_dev_is_set() else constants.COMPACT_INDENT ) # indented json serialization when in AWS SAM Local self.json_serializer = json_serializer or partial( json.dumps, default=self.json_default, separators=(",", ":"), indent=self.json_indent diff --git a/aws_lambda_powertools/shared/constants.py b/aws_lambda_powertools/shared/constants.py index 09d9132af90..5db9ec08a56 100644 --- a/aws_lambda_powertools/shared/constants.py +++ b/aws_lambda_powertools/shared/constants.py @@ -36,3 +36,4 @@ # JSON indentation level PRETTY_INDENT: int = 4 COMPACT_INDENT = None +POWERTOOLS_DEV_ENV: str = "POWERTOOLS_DEV" diff --git a/aws_lambda_powertools/shared/functions.py b/aws_lambda_powertools/shared/functions.py index e9bc3521125..8f28bc12e8e 100644 --- a/aws_lambda_powertools/shared/functions.py +++ b/aws_lambda_powertools/shared/functions.py @@ -1,5 +1,7 @@ import base64 import logging +import os +import warnings from binascii import Error as BinAsciiError from typing import Optional, Union @@ -78,3 +80,12 @@ def bytes_to_string(value: bytes) -> str: return value.decode("utf-8") except (BinAsciiError, TypeError): raise ValueError("base64 UTF-8 decode failed") + + +def powertools_dev_is_set() -> bool: + is_on = strtobool(os.getenv("POWERTOOLS_DEV", "0")) + if is_on: + warnings.warn("POWERTOOLS_DEV environment variable is enabled. Increasing verbosity across utilities.") + return True + + return False From 81608fd96a624633105a453eef59e1ba3795087d Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Tue, 4 Oct 2022 18:37:53 +0200 Subject: [PATCH 2/6] refactor(apigateway): warn on event_handler_debug deprecation in favour of powertools_dev --- .../event_handler/api_gateway.py | 22 +++++++++++++++---- .../event_handler/test_api_gateway.py | 10 +++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/aws_lambda_powertools/event_handler/api_gateway.py b/aws_lambda_powertools/event_handler/api_gateway.py index 4fdce465dab..ef89cb69709 100644 --- a/aws_lambda_powertools/event_handler/api_gateway.py +++ b/aws_lambda_powertools/event_handler/api_gateway.py @@ -15,7 +15,7 @@ from aws_lambda_powertools.event_handler import content_types from aws_lambda_powertools.event_handler.exceptions import NotFoundError, ServiceError from aws_lambda_powertools.shared import constants -from aws_lambda_powertools.shared.functions import resolve_truthy_env_var_choice +from aws_lambda_powertools.shared.functions import powertools_dev_is_set, strtobool from aws_lambda_powertools.shared.json_encoder import Encoder from aws_lambda_powertools.utilities.data_classes import ( ALBEvent, @@ -444,9 +444,7 @@ def __init__( self._cors = cors self._cors_enabled: bool = cors is not None self._cors_methods: Set[str] = {"OPTIONS"} - self._debug = resolve_truthy_env_var_choice( - env=os.getenv(constants.EVENT_HANDLER_DEBUG_ENV, "false"), choice=debug - ) + self._debug = self._has_debug(debug) self._strip_prefixes = strip_prefixes # Allow for a custom serializer or a concise json serialization @@ -511,6 +509,22 @@ def resolve(self, event, context) -> Dict[str, Any]: def __call__(self, event, context) -> Any: return self.resolve(event, context) + @staticmethod + def _has_debug(debug: Optional[bool] = None) -> bool: + # It might have been explicitly switched off (debug=False) + if debug is not None: + return debug + + # Maintenance: deprecate EVENT_HANDLER_DEBUG later in V2. + env_debug = os.getenv(constants.EVENT_HANDLER_DEBUG_ENV) + if env_debug is not None: + warnings.warn( + "POWERTOOLS_EVENT_HANDLER_DEBUG is set and will be deprecated in V2. Please use POWERTOOLS_DEV instead." + ) + return strtobool(env_debug) or powertools_dev_is_set() + + return powertools_dev_is_set() + @staticmethod def _compile_regex(rule: str): """Precompile regex pattern diff --git a/tests/functional/event_handler/test_api_gateway.py b/tests/functional/event_handler/test_api_gateway.py index 145d435688a..2806341c992 100644 --- a/tests/functional/event_handler/test_api_gateway.py +++ b/tests/functional/event_handler/test_api_gateway.py @@ -686,6 +686,16 @@ def test_debug_mode_environment_variable(monkeypatch): assert app._debug +def test_powertools_dev_sets_debug_mode(monkeypatch): + # GIVEN a debug mode environment variable is set + monkeypatch.setenv(constants.POWERTOOLS_DEV_ENV, "true") + app = ApiGatewayResolver() + + # WHEN calling app._debug + # THEN the debug mode is enabled + assert app._debug + + def test_debug_json_formatting(json_dump): # GIVEN debug is True app = ApiGatewayResolver(debug=True) From 38598d383511e980203f324a26b55cebb258d81f Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Wed, 5 Oct 2022 09:37:32 +0200 Subject: [PATCH 3/6] docs(apigateway): address leandro's feedback on replacing POWERTOOLS_EVENT_HANDLER_DEBUG --- docs/core/event_handler/api_gateway.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/event_handler/api_gateway.md b/docs/core/event_handler/api_gateway.md index f4f45a051f8..2eb23d64c53 100644 --- a/docs/core/event_handler/api_gateway.md +++ b/docs/core/event_handler/api_gateway.md @@ -388,7 +388,7 @@ Like `compress` feature, the client must send the `Accept` header with the corre ### Debug mode -You can enable debug mode via `debug` param, or via `POWERTOOLS_EVENT_HANDLER_DEBUG` [environment variable](../../index.md#environment-variables). +You can enable debug mode via `debug` param, or via `POWERTOOLS_DEV` [environment variable](../../index.md#environment-variables). This will enable full tracebacks errors in the response, print request and responses, and set CORS in development mode. From 0006417d9ec53ccd30dca69d55806d20b8c34339 Mon Sep 17 00:00:00 2001 From: Heitor Lessa Date: Wed, 5 Oct 2022 09:39:52 +0200 Subject: [PATCH 4/6] fix(shared): use constant POWERTOOLS_DEV env var Co-authored-by: Leandro Damascena --- aws_lambda_powertools/shared/functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/shared/functions.py b/aws_lambda_powertools/shared/functions.py index 8f28bc12e8e..480d7aafdf4 100644 --- a/aws_lambda_powertools/shared/functions.py +++ b/aws_lambda_powertools/shared/functions.py @@ -83,7 +83,7 @@ def bytes_to_string(value: bytes) -> str: def powertools_dev_is_set() -> bool: - is_on = strtobool(os.getenv("POWERTOOLS_DEV", "0")) + is_on = strtobool(os.getenv(constants.POWERTOOLS_DEV_ENV, "0")) if is_on: warnings.warn("POWERTOOLS_DEV environment variable is enabled. Increasing verbosity across utilities.") return True From 51ec4ef6ace1259bc857c9bb702e7e53b1b8d913 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Wed, 5 Oct 2022 09:47:24 +0200 Subject: [PATCH 5/6] chore: add constants missing import --- aws_lambda_powertools/shared/functions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aws_lambda_powertools/shared/functions.py b/aws_lambda_powertools/shared/functions.py index 480d7aafdf4..c82cca1e90d 100644 --- a/aws_lambda_powertools/shared/functions.py +++ b/aws_lambda_powertools/shared/functions.py @@ -5,6 +5,8 @@ from binascii import Error as BinAsciiError from typing import Optional, Union +import constants + logger = logging.getLogger(__name__) From 55a5b12375377f3de6ca2346ca1475d6998d1401 Mon Sep 17 00:00:00 2001 From: heitorlessa Date: Wed, 5 Oct 2022 09:49:23 +0200 Subject: [PATCH 6/6] fix: constants import mypy --- aws_lambda_powertools/shared/functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/shared/functions.py b/aws_lambda_powertools/shared/functions.py index c82cca1e90d..a25a3e7631e 100644 --- a/aws_lambda_powertools/shared/functions.py +++ b/aws_lambda_powertools/shared/functions.py @@ -5,7 +5,7 @@ from binascii import Error as BinAsciiError from typing import Optional, Union -import constants +from aws_lambda_powertools.shared import constants logger = logging.getLogger(__name__)