Skip to content

Commit 9e30192

Browse files
feat(tracer): auto-disable tracer when for AWS SAM and Chalice environments (#3949)
Disabling Tracer in non-Lambda envs
1 parent a403f4d commit 9e30192

File tree

4 files changed

+73
-40
lines changed

4 files changed

+73
-40
lines changed
+35-33
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,16 @@
1+
# Tracer constants
12
TRACER_CAPTURE_RESPONSE_ENV: str = "POWERTOOLS_TRACER_CAPTURE_RESPONSE"
23
TRACER_CAPTURE_ERROR_ENV: str = "POWERTOOLS_TRACER_CAPTURE_ERROR"
34
TRACER_DISABLED_ENV: str = "POWERTOOLS_TRACE_DISABLED"
5+
XRAY_SDK_MODULE: str = "aws_xray_sdk"
6+
XRAY_SDK_CORE_MODULE: str = "aws_xray_sdk.core"
7+
XRAY_TRACE_ID_ENV: str = "_X_AMZN_TRACE_ID"
8+
MIDDLEWARE_FACTORY_TRACE_ENV: str = "POWERTOOLS_TRACE_MIDDLEWARES"
49

10+
# Logger constants
511
LOGGER_LOG_SAMPLING_RATE: str = "POWERTOOLS_LOGGER_SAMPLE_RATE"
612
LOGGER_LOG_EVENT_ENV: str = "POWERTOOLS_LOGGER_LOG_EVENT"
713
LOGGER_LOG_DEDUPLICATION_ENV: str = "POWERTOOLS_LOG_DEDUPLICATION_DISABLED"
8-
9-
MIDDLEWARE_FACTORY_TRACE_ENV: str = "POWERTOOLS_TRACE_MIDDLEWARES"
10-
11-
METRICS_NAMESPACE_ENV: str = "POWERTOOLS_METRICS_NAMESPACE"
12-
13-
DATADOG_FLUSH_TO_LOG: str = "DD_FLUSH_TO_LOG"
14-
15-
SERVICE_NAME_ENV: str = "POWERTOOLS_SERVICE_NAME"
16-
XRAY_TRACE_ID_ENV: str = "_X_AMZN_TRACE_ID"
17-
LAMBDA_TASK_ROOT_ENV: str = "LAMBDA_TASK_ROOT"
18-
19-
20-
LAMBDA_FUNCTION_NAME_ENV: str = "AWS_LAMBDA_FUNCTION_NAME"
21-
22-
XRAY_SDK_MODULE: str = "aws_xray_sdk"
23-
XRAY_SDK_CORE_MODULE: str = "aws_xray_sdk.core"
24-
25-
IDEMPOTENCY_DISABLED_ENV: str = "POWERTOOLS_IDEMPOTENCY_DISABLED"
26-
27-
PARAMETERS_SSM_DECRYPT_ENV: str = "POWERTOOLS_PARAMETERS_SSM_DECRYPT"
28-
PARAMETERS_MAX_AGE_ENV: str = "POWERTOOLS_PARAMETERS_MAX_AGE"
29-
3014
LOGGER_LAMBDA_CONTEXT_KEYS = [
3115
"function_arn",
3216
"function_memory_size",
@@ -35,17 +19,6 @@
3519
"cold_start",
3620
"xray_trace_id",
3721
]
38-
39-
# JSON indentation level
40-
PRETTY_INDENT: int = 4
41-
COMPACT_INDENT = None
42-
43-
POWERTOOLS_DEV_ENV: str = "POWERTOOLS_DEV"
44-
POWERTOOLS_DEBUG_ENV: str = "POWERTOOLS_DEBUG"
45-
POWERTOOLS_LOG_LEVEL_ENV: str = "POWERTOOLS_LOG_LEVEL"
46-
POWERTOOLS_LOG_LEVEL_LEGACY_ENV: str = "LOG_LEVEL"
47-
LAMBDA_LOG_LEVEL_ENV: str = "AWS_LAMBDA_LOG_LEVEL"
48-
4922
# Mapping of Lambda log levels to Python logging levels
5023
# https://docs.aws.amazon.com/lambda/latest/dg/configuration-logging.html#configuration-logging-log-levels
5124
LAMBDA_ADVANCED_LOGGING_LEVELS = {
@@ -57,3 +30,32 @@
5730
"ERROR": "ERROR",
5831
"FATAL": "CRITICAL",
5932
}
33+
POWERTOOLS_LOG_LEVEL_ENV: str = "POWERTOOLS_LOG_LEVEL"
34+
POWERTOOLS_LOG_LEVEL_LEGACY_ENV: str = "LOG_LEVEL"
35+
LAMBDA_LOG_LEVEL_ENV: str = "AWS_LAMBDA_LOG_LEVEL"
36+
37+
# Metrics constants
38+
METRICS_NAMESPACE_ENV: str = "POWERTOOLS_METRICS_NAMESPACE"
39+
DATADOG_FLUSH_TO_LOG: str = "DD_FLUSH_TO_LOG"
40+
SERVICE_NAME_ENV: str = "POWERTOOLS_SERVICE_NAME"
41+
42+
# Parameters constants
43+
PARAMETERS_SSM_DECRYPT_ENV: str = "POWERTOOLS_PARAMETERS_SSM_DECRYPT"
44+
PARAMETERS_MAX_AGE_ENV: str = "POWERTOOLS_PARAMETERS_MAX_AGE"
45+
46+
# Runtime and environment constants
47+
LAMBDA_TASK_ROOT_ENV: str = "LAMBDA_TASK_ROOT"
48+
SAM_LOCAL_ENV: str = "AWS_SAM_LOCAL"
49+
CHALICE_LOCAL_ENV: str = "AWS_CHALICE_CLI_MODE"
50+
LAMBDA_FUNCTION_NAME_ENV: str = "AWS_LAMBDA_FUNCTION_NAME"
51+
52+
# Debug constants
53+
POWERTOOLS_DEV_ENV: str = "POWERTOOLS_DEV"
54+
POWERTOOLS_DEBUG_ENV: str = "POWERTOOLS_DEBUG"
55+
56+
# JSON constants
57+
PRETTY_INDENT: int = 4
58+
COMPACT_INDENT = None
59+
60+
# Idempotency constants
61+
IDEMPOTENCY_DISABLED_ENV: str = "POWERTOOLS_IDEMPOTENCY_DISABLED"

aws_lambda_powertools/tracing/tracer.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
import os
88
from typing import Any, Callable, Dict, List, Optional, Sequence, Union, cast, overload
99

10-
from ..shared import constants
11-
from ..shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice
12-
from ..shared.lazy_import import LazyLoader
13-
from ..shared.types import AnyCallableT
14-
from .base import BaseProvider, BaseSegment
10+
from aws_lambda_powertools.shared import constants
11+
from aws_lambda_powertools.shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice
12+
from aws_lambda_powertools.shared.lazy_import import LazyLoader
13+
from aws_lambda_powertools.shared.types import AnyCallableT
14+
from aws_lambda_powertools.tracing.base import BaseProvider, BaseSegment
1515

1616
is_cold_start = True
1717
logger = logging.getLogger(__name__)
@@ -766,13 +766,15 @@ def _is_tracer_disabled() -> Union[bool, str]:
766766
"""
767767
logger.debug("Verifying whether Tracing has been disabled")
768768
is_lambda_env = os.getenv(constants.LAMBDA_TASK_ROOT_ENV)
769+
is_lambda_sam_cli = os.getenv(constants.SAM_LOCAL_ENV)
770+
is_chalice_cli = os.getenv(constants.CHALICE_LOCAL_ENV)
769771
is_disabled = resolve_truthy_env_var_choice(env=os.getenv(constants.TRACER_DISABLED_ENV, "false"))
770772

771773
if is_disabled:
772774
logger.debug("Tracing has been disabled via env var POWERTOOLS_TRACE_DISABLED")
773775
return is_disabled
774776

775-
if not is_lambda_env:
777+
if not is_lambda_env or (is_lambda_sam_cli or is_chalice_cli):
776778
logger.debug("Running outside Lambda env; disabling Tracing")
777779
return True
778780

docs/core/tracer.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ Tracer keeps a copy of its configuration after the first initialization. This is
227227

228228
## Testing your code
229229

230-
Tracer is disabled by default when not running in the AWS Lambda environment - This means no code changes or environment variables to be set.
230+
Tracer is disabled by default when not running in the AWS Lambda environment, including AWS SAM CLI and Chalice environments. This means no code changes or environment variables to be set.
231231

232232
## Tips
233233

tests/functional/test_tracing.py

+29
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,35 @@ def handler(event, context):
7373
handler({}, {})
7474

7575

76+
def test_tracer_lambda_running_in_sam_cli(monkeypatch, dummy_response):
77+
# GIVEN tracer runs in AWS SAM CLI (ie: `AWS_SAM_LOCAL` is set)
78+
monkeypatch.setenv("AWS_SAM_LOCAL", "true")
79+
monkeypatch.setenv("LAMBDA_TASK_ROOT", "/opt/")
80+
tracer = Tracer()
81+
82+
# WHEN a lambda function is run through SAM CLI emulator
83+
@tracer.capture_lambda_handler
84+
def handler(event, context):
85+
return dummy_response
86+
87+
# THEN tracer should run in disabled mode, and not raise an Exception
88+
handler({}, {})
89+
90+
91+
def test_tracer_lambda_running_in_chalice(monkeypatch, dummy_response):
92+
# GIVEN tracer runs in CHALICE (ie: `AWS_CHALICE_CLI_MODE` is set)
93+
monkeypatch.setenv("AWS_CHALICE_CLI_MODE", "true")
94+
tracer = Tracer()
95+
96+
# WHEN a lambda function is run through SAM CLI emulator
97+
@tracer.capture_lambda_handler
98+
def handler(event, context):
99+
return dummy_response
100+
101+
# THEN tracer should run in disabled mode, and not raise an Exception
102+
handler({}, {})
103+
104+
76105
def test_tracer_metadata_disabled(dummy_response):
77106
# GIVEN tracer is disabled, and annotations/metadata are used
78107
tracer = Tracer(disabled=True)

0 commit comments

Comments
 (0)