aws-lambda-powertools 3.8.1a8__py3-none-any.whl → 3.8.1a9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aws_lambda_powertools/logging/logger.py +6 -0
- aws_lambda_powertools/metrics/functions.py +38 -0
- aws_lambda_powertools/metrics/metrics.py +2 -0
- aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py +10 -1
- aws_lambda_powertools/metrics/provider/datadog/datadog.py +7 -2
- aws_lambda_powertools/shared/constants.py +1 -0
- aws_lambda_powertools/shared/version.py +1 -1
- {aws_lambda_powertools-3.8.1a8.dist-info → aws_lambda_powertools-3.8.1a9.dist-info}/METADATA +1 -1
- {aws_lambda_powertools-3.8.1a8.dist-info → aws_lambda_powertools-3.8.1a9.dist-info}/RECORD +11 -11
- {aws_lambda_powertools-3.8.1a8.dist-info → aws_lambda_powertools-3.8.1a9.dist-info}/LICENSE +0 -0
- {aws_lambda_powertools-3.8.1a8.dist-info → aws_lambda_powertools-3.8.1a9.dist-info}/WHEEL +0 -0
@@ -1127,6 +1127,12 @@ class Logger:
|
|
1127
1127
|
tracer_id = get_tracer_id()
|
1128
1128
|
|
1129
1129
|
if tracer_id and self._buffer_config:
|
1130
|
+
if not self._buffer_cache.get(tracer_id):
|
1131
|
+
# Detect new Lambda invocation context and reset buffer to maintain log isolation
|
1132
|
+
# Ensures logs from previous invocations do not leak into current execution
|
1133
|
+
# Prevent memory excessive usage
|
1134
|
+
self._buffer_cache.clear()
|
1135
|
+
|
1130
1136
|
log_record: dict[str, Any] = _create_buffer_record(
|
1131
1137
|
level=level,
|
1132
1138
|
msg=msg,
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
import os
|
4
4
|
from datetime import datetime
|
5
|
+
from typing import TYPE_CHECKING
|
5
6
|
|
6
7
|
from aws_lambda_powertools.metrics.provider.cloudwatch_emf.exceptions import (
|
7
8
|
MetricResolutionError,
|
@@ -11,6 +12,9 @@ from aws_lambda_powertools.metrics.provider.cloudwatch_emf.metric_properties imp
|
|
11
12
|
from aws_lambda_powertools.shared import constants
|
12
13
|
from aws_lambda_powertools.shared.functions import strtobool
|
13
14
|
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
from aws_lambda_powertools.utilities.typing.lambda_context import LambdaContext
|
17
|
+
|
14
18
|
|
15
19
|
def extract_cloudwatch_metric_resolution_value(metric_resolutions: list, resolution: int | MetricResolution) -> int:
|
16
20
|
"""Return metric value from CloudWatch metric unit whether that's str or MetricResolution enum
|
@@ -161,3 +165,37 @@ def is_metrics_disabled() -> bool:
|
|
161
165
|
]
|
162
166
|
|
163
167
|
return any(disable_conditions)
|
168
|
+
|
169
|
+
|
170
|
+
def resolve_cold_start_function_name(function_name: str | None, context: LambdaContext) -> str:
|
171
|
+
"""
|
172
|
+
Resolve the function name for ColdStart metrics with a prioritized approach.
|
173
|
+
|
174
|
+
Parameters
|
175
|
+
----------
|
176
|
+
function_name : str, optional
|
177
|
+
Explicitly provided function name (highest priority).
|
178
|
+
context : LambdaContext
|
179
|
+
AWS Lambda context object.
|
180
|
+
|
181
|
+
Returns
|
182
|
+
-------
|
183
|
+
str
|
184
|
+
Resolved function name.
|
185
|
+
|
186
|
+
Notes
|
187
|
+
-----
|
188
|
+
Function name resolution follows this priority:
|
189
|
+
1. Explicitly provided function_name
|
190
|
+
2. Environment variable POWERTOOLS_METRICS_FUNCTION_NAME
|
191
|
+
3. Lambda context function name
|
192
|
+
"""
|
193
|
+
|
194
|
+
if function_name:
|
195
|
+
return function_name
|
196
|
+
|
197
|
+
metrics_function_name_env = os.getenv(constants.METRICS_FUNCTION_NAME_ENV)
|
198
|
+
if metrics_function_name_env:
|
199
|
+
return metrics_function_name_env
|
200
|
+
|
201
|
+
return context.function_name
|
@@ -86,6 +86,7 @@ class Metrics:
|
|
86
86
|
service: str | None = None,
|
87
87
|
namespace: str | None = None,
|
88
88
|
provider: AmazonCloudWatchEMFProvider | None = None,
|
89
|
+
function_name: str | None = None,
|
89
90
|
):
|
90
91
|
self.metric_set = self._metrics
|
91
92
|
self.metadata_set = self._metadata
|
@@ -102,6 +103,7 @@ class Metrics:
|
|
102
103
|
dimension_set=self.dimension_set,
|
103
104
|
metadata_set=self.metadata_set,
|
104
105
|
default_dimensions=self._default_dimensions,
|
106
|
+
function_name=function_name,
|
105
107
|
)
|
106
108
|
else:
|
107
109
|
self.provider = provider
|
@@ -16,6 +16,7 @@ from aws_lambda_powertools.metrics.functions import (
|
|
16
16
|
extract_cloudwatch_metric_resolution_value,
|
17
17
|
extract_cloudwatch_metric_unit_value,
|
18
18
|
is_metrics_disabled,
|
19
|
+
resolve_cold_start_function_name,
|
19
20
|
validate_emf_timestamp,
|
20
21
|
)
|
21
22
|
from aws_lambda_powertools.metrics.provider.base import BaseProvider
|
@@ -51,6 +52,10 @@ class AmazonCloudWatchEMFProvider(BaseProvider):
|
|
51
52
|
metric namespace to be set for all metrics
|
52
53
|
POWERTOOLS_SERVICE_NAME : str
|
53
54
|
service name used for default dimension
|
55
|
+
POWERTOOLS_METRICS_FUNCTION_NAME: str
|
56
|
+
function name used as dimension for the ColdStart metric
|
57
|
+
POWERTOOLS_METRICS_DISABLED: bool
|
58
|
+
disables all metrics emitted by Powertools
|
54
59
|
|
55
60
|
Raises
|
56
61
|
------
|
@@ -72,12 +77,14 @@ class AmazonCloudWatchEMFProvider(BaseProvider):
|
|
72
77
|
metadata_set: dict[str, Any] | None = None,
|
73
78
|
service: str | None = None,
|
74
79
|
default_dimensions: dict[str, Any] | None = None,
|
80
|
+
function_name: str | None = None,
|
75
81
|
):
|
76
82
|
self.metric_set = metric_set if metric_set is not None else {}
|
77
83
|
self.dimension_set = dimension_set if dimension_set is not None else {}
|
78
84
|
self.default_dimensions = default_dimensions or {}
|
79
85
|
self.namespace = resolve_env_var_choice(choice=namespace, env=os.getenv(constants.METRICS_NAMESPACE_ENV))
|
80
86
|
self.service = resolve_env_var_choice(choice=service, env=os.getenv(constants.SERVICE_NAME_ENV))
|
87
|
+
self.function_name = function_name
|
81
88
|
|
82
89
|
self.metadata_set = metadata_set if metadata_set is not None else {}
|
83
90
|
self.timestamp: int | None = None
|
@@ -445,9 +452,11 @@ class AmazonCloudWatchEMFProvider(BaseProvider):
|
|
445
452
|
context : Any
|
446
453
|
Lambda context
|
447
454
|
"""
|
455
|
+
|
456
|
+
cold_start_function_name = resolve_cold_start_function_name(function_name=self.function_name, context=context)
|
448
457
|
logger.debug("Adding cold start metric and function_name dimension")
|
449
458
|
with single_metric(name="ColdStart", unit=MetricUnit.Count, value=1, namespace=self.namespace) as metric:
|
450
|
-
metric.add_dimension(name="function_name", value=
|
459
|
+
metric.add_dimension(name="function_name", value=cold_start_function_name)
|
451
460
|
if self.service:
|
452
461
|
metric.add_dimension(name="service", value=str(self.service))
|
453
462
|
|
@@ -10,7 +10,7 @@ import warnings
|
|
10
10
|
from typing import TYPE_CHECKING, Any
|
11
11
|
|
12
12
|
from aws_lambda_powertools.metrics.exceptions import MetricValueError, SchemaValidationError
|
13
|
-
from aws_lambda_powertools.metrics.functions import is_metrics_disabled
|
13
|
+
from aws_lambda_powertools.metrics.functions import is_metrics_disabled, resolve_cold_start_function_name
|
14
14
|
from aws_lambda_powertools.metrics.provider import BaseProvider
|
15
15
|
from aws_lambda_powertools.metrics.provider.datadog.warnings import DatadogDataValidationWarning
|
16
16
|
from aws_lambda_powertools.shared import constants
|
@@ -58,8 +58,10 @@ class DatadogProvider(BaseProvider):
|
|
58
58
|
namespace: str | None = None,
|
59
59
|
flush_to_log: bool | None = None,
|
60
60
|
default_tags: dict[str, Any] | None = None,
|
61
|
+
function_name: str | None = None,
|
61
62
|
):
|
62
63
|
self.metric_set = metric_set if metric_set is not None else []
|
64
|
+
self.function_name = function_name
|
63
65
|
self.namespace = (
|
64
66
|
resolve_env_var_choice(choice=namespace, env=os.getenv(constants.METRICS_NAMESPACE_ENV))
|
65
67
|
or DEFAULT_NAMESPACE
|
@@ -224,8 +226,11 @@ class DatadogProvider(BaseProvider):
|
|
224
226
|
context : Any
|
225
227
|
Lambda context
|
226
228
|
"""
|
229
|
+
|
230
|
+
cold_start_function_name = resolve_cold_start_function_name(function_name=self.function_name, context=context)
|
231
|
+
|
227
232
|
logger.debug("Adding cold start metric and function_name tagging")
|
228
|
-
self.add_metric(name="ColdStart", value=1, function_name=
|
233
|
+
self.add_metric(name="ColdStart", value=1, function_name=cold_start_function_name)
|
229
234
|
|
230
235
|
def log_metrics(
|
231
236
|
self,
|
@@ -41,6 +41,7 @@ METRICS_NAMESPACE_ENV: str = "POWERTOOLS_METRICS_NAMESPACE"
|
|
41
41
|
DATADOG_FLUSH_TO_LOG: str = "DD_FLUSH_TO_LOG"
|
42
42
|
SERVICE_NAME_ENV: str = "POWERTOOLS_SERVICE_NAME"
|
43
43
|
METRICS_DISABLED_ENV: str = "POWERTOOLS_METRICS_DISABLED"
|
44
|
+
METRICS_FUNCTION_NAME_ENV: str = "POWERTOOLS_METRICS_FUNCTION_NAME"
|
44
45
|
# If the timestamp of log event is more than 2 hours in future, the log event is skipped.
|
45
46
|
# If the timestamp of log event is more than 14 days in past, the log event is skipped.
|
46
47
|
# See https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html
|
{aws_lambda_powertools-3.8.1a8.dist-info → aws_lambda_powertools-3.8.1a9.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: aws_lambda_powertools
|
3
|
-
Version: 3.8.
|
3
|
+
Version: 3.8.1a9
|
4
4
|
Summary: Powertools for AWS Lambda (Python) is a developer toolkit to implement Serverless best practices and increase developer velocity.
|
5
5
|
License: MIT
|
6
6
|
Keywords: aws_lambda_powertools,aws,tracing,logging,lambda,powertools,feature_flags,idempotency,middleware
|
@@ -49,26 +49,26 @@ aws_lambda_powertools/logging/formatter.py,sha256=dmE6XXmkWVkYbWdy1Kg69TYJJ0yDXf
|
|
49
49
|
aws_lambda_powertools/logging/formatters/__init__.py,sha256=OqddpJcWMqRYhx5SFy-SPqtt72tkRZbfpEi_oCC47eI,301
|
50
50
|
aws_lambda_powertools/logging/formatters/datadog.py,sha256=NwaaBOp7jIlOAH158NzyvW-EwmWqqnYX9f7Uu_nIUYQ,3169
|
51
51
|
aws_lambda_powertools/logging/lambda_context.py,sha256=VHst_6hxMpXgScoxNwaC61UXPTIdd3AEBHTPzb4esPc,1736
|
52
|
-
aws_lambda_powertools/logging/logger.py,sha256=
|
52
|
+
aws_lambda_powertools/logging/logger.py,sha256=h4jAJMXRZhYQv84j0bnzyxaHUzN1RePn1XdS9yH5imM,48679
|
53
53
|
aws_lambda_powertools/logging/types.py,sha256=Zc95nGdZ2sJUEPdwR0uoArT_F-JSKfpS_LokdCVO0nQ,1263
|
54
54
|
aws_lambda_powertools/logging/utils.py,sha256=NirAObjkkarN5fX2diHs0Ln_8KHLueviL-jCKhckIBM,4069
|
55
55
|
aws_lambda_powertools/metrics/__init__.py,sha256=B5FpJS_VR7zivm2ylvUF8RHBthKz4aDk0VA5GpDn3Tk,592
|
56
56
|
aws_lambda_powertools/metrics/base.py,sha256=Ric6mWDekLgbGHgCW706vdTob40FiIsXvbA50HEDyBo,23774
|
57
57
|
aws_lambda_powertools/metrics/exceptions.py,sha256=HX9k4L4RXI9Ol8kVr5U9FYmUsrN_3v2tugAmzNVp0ng,418
|
58
|
-
aws_lambda_powertools/metrics/functions.py,sha256=
|
58
|
+
aws_lambda_powertools/metrics/functions.py,sha256=Njw-gKtAt_YpKw5ltQMcKFbGvJBFbs3J60t3C0oczB4,6190
|
59
59
|
aws_lambda_powertools/metrics/metric.py,sha256=utHoGjKlx-e1zhgq51ChXRGx3MNSNv3qwanWhlksY0s,165
|
60
|
-
aws_lambda_powertools/metrics/metrics.py,sha256=
|
60
|
+
aws_lambda_powertools/metrics/metrics.py,sha256=wy06nwBDzR03EHQxJ0N2S82fVHD47l237G1dvUQcaD8,8246
|
61
61
|
aws_lambda_powertools/metrics/provider/__init__.py,sha256=7Cg6Rwzy6pYW6LjeWGEl0opDaKleBSGrMPfGNXCH1i4,104
|
62
62
|
aws_lambda_powertools/metrics/provider/base.py,sha256=w1JBW2uYezxdYv3BbersCpzS4-GEfm9G8xk4opS1C-o,6879
|
63
63
|
aws_lambda_powertools/metrics/provider/cloudwatch_emf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
64
|
-
aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py,sha256=
|
64
|
+
aws_lambda_powertools/metrics/provider/cloudwatch_emf/cloudwatch.py,sha256=7o830Az2VksFAQQPZqGK7HEmz4Z8D-lHdemd_1aLRCQ,18619
|
65
65
|
aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py,sha256=ByQMR69yb7CWkHvdI8fToZwJGTVDsiFuM1xijvyzuG8,38
|
66
66
|
aws_lambda_powertools/metrics/provider/cloudwatch_emf/exceptions.py,sha256=FdDzZ5sMLvZQqv2XR55haKdhVuCCCSYIHoat3h-ZpNI,218
|
67
67
|
aws_lambda_powertools/metrics/provider/cloudwatch_emf/metric_properties.py,sha256=pzVuLOFzjyau1GGvTNpHQvmrPXDWpPeG16FaBEsHCH0,1007
|
68
68
|
aws_lambda_powertools/metrics/provider/cloudwatch_emf/types.py,sha256=Rhnn9VkPX41tVjV1dOTqk3gyPRnvcpSNDFC2m2kjSaQ,587
|
69
69
|
aws_lambda_powertools/metrics/provider/cold_start.py,sha256=j-_Mtsr4DnsItiTdrNnx63zH_wsonl9xsGAb8QuKGSs,168
|
70
70
|
aws_lambda_powertools/metrics/provider/datadog/__init__.py,sha256=3LivCIwqyI7KKEeSLDcxN1Z9RObChoMg5hpiXPin2C0,225
|
71
|
-
aws_lambda_powertools/metrics/provider/datadog/datadog.py,sha256=
|
71
|
+
aws_lambda_powertools/metrics/provider/datadog/datadog.py,sha256=zw-AtT4gPqqNLjsQe99flB4eIK-CE1bbWaaSa9D5cFg,14491
|
72
72
|
aws_lambda_powertools/metrics/provider/datadog/metrics.py,sha256=_7dx4sSx6aXGJ2uv3iisqr6AyqmKjHBATOLdI1hjJhw,4285
|
73
73
|
aws_lambda_powertools/metrics/provider/datadog/warnings.py,sha256=tpnTQNhb6NhQp_NZSgUR4SsDSASqG6XBpzPZBgSVXlw,191
|
74
74
|
aws_lambda_powertools/metrics/types.py,sha256=6EhODeacBtnAslVf-YVZ3iPNIE3RwDN95DtuIpefpmA,185
|
@@ -79,7 +79,7 @@ aws_lambda_powertools/package_logger.py,sha256=Q2QX1JXDdc-Piekk1r19qEIDUMN2i4ZZK
|
|
79
79
|
aws_lambda_powertools/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
80
80
|
aws_lambda_powertools/shared/__init__.py,sha256=o2ycxf3MCYfWXm1P-zuTKap_uzJiu8uYmVcCX7s4gUk,75
|
81
81
|
aws_lambda_powertools/shared/cache_dict.py,sha256=X3Ykh-_Fb4Wkc5RGjaostC_FUvMyY_H1L2bOB89A3vM,916
|
82
|
-
aws_lambda_powertools/shared/constants.py,sha256=
|
82
|
+
aws_lambda_powertools/shared/constants.py,sha256=Na17ZV15AgUqWdkrNg-WYXv8FEqwY1ga7KwClgePoG4,2805
|
83
83
|
aws_lambda_powertools/shared/cookies.py,sha256=X2Bkcf7MAmV75PJFm07QGkL4n1psk4HIGpUxzrsjiJY,3868
|
84
84
|
aws_lambda_powertools/shared/dynamodb_deserializer.py,sha256=tWw8MLXEitInnViFkt_xSBkXD_V1n1KcWbqBXBxwUlE,4054
|
85
85
|
aws_lambda_powertools/shared/functions.py,sha256=N5VIND3xW-eZHqY2uPsBMtDbtMx64iklUKByeCh58rc,7625
|
@@ -88,7 +88,7 @@ aws_lambda_powertools/shared/json_encoder.py,sha256=JQeWNu-4M7_xI_hqYExrxsb3OcEH
|
|
88
88
|
aws_lambda_powertools/shared/lazy_import.py,sha256=TbXQm2bcwXdZrYdBaJJXIswyLlumM85RJ_A_0w-h-GU,2019
|
89
89
|
aws_lambda_powertools/shared/types.py,sha256=APkI38HbiTpSF19NSNii8Ydx73vmVUVotgEQ9jHruEI,124
|
90
90
|
aws_lambda_powertools/shared/user_agent.py,sha256=DrCMFQuT4a4iIrpcWpAIjY37EFqR9-QxlxDGD-Nn9Gg,7081
|
91
|
-
aws_lambda_powertools/shared/version.py,sha256=
|
91
|
+
aws_lambda_powertools/shared/version.py,sha256=0GimQ5exesjPqSg5Vhs7H9b-rMcb1FBGy3N7PNMhxSk,84
|
92
92
|
aws_lambda_powertools/tracing/__init__.py,sha256=f4bMThOPBPWTPVcYqcAIErAJPerMsf3H_Z4gCXCsK9I,141
|
93
93
|
aws_lambda_powertools/tracing/base.py,sha256=DbLD8OSK05KLdSV36oNA5wDSGv8KbcOD19qMUqoXh58,4513
|
94
94
|
aws_lambda_powertools/tracing/extensions.py,sha256=APOfXOq-hRBKaK5WyfIyrd_6M1_9SWJZ3zxLA9jDZzU,492
|
@@ -257,7 +257,7 @@ aws_lambda_powertools/utilities/validation/envelopes.py,sha256=YD5HOFx6IClQgii0n
|
|
257
257
|
aws_lambda_powertools/utilities/validation/exceptions.py,sha256=PKy_19zQMBJGCMMFl-sMkcm-cc0v3zZBn_bhGE4wKNo,2084
|
258
258
|
aws_lambda_powertools/utilities/validation/validator.py,sha256=x_1qpuKJBuWpgNU-zCD3Di-vXrZfyUu7oA5RmjZjr84,10034
|
259
259
|
aws_lambda_powertools/warnings/__init__.py,sha256=vqDVeZz8wGtD8WGYNSkQE7AHwqtIrPGRxuoJR_BBnSs,1193
|
260
|
-
aws_lambda_powertools-3.8.
|
261
|
-
aws_lambda_powertools-3.8.
|
262
|
-
aws_lambda_powertools-3.8.
|
263
|
-
aws_lambda_powertools-3.8.
|
260
|
+
aws_lambda_powertools-3.8.1a9.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
|
261
|
+
aws_lambda_powertools-3.8.1a9.dist-info/METADATA,sha256=aZYnZlk41Yz_72E1iQe_wBMG0Nz86xNm0lq6ZWyebvk,11156
|
262
|
+
aws_lambda_powertools-3.8.1a9.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
263
|
+
aws_lambda_powertools-3.8.1a9.dist-info/RECORD,,
|
File without changes
|
File without changes
|