aws-lambda-powertools 3.8.1a9__py3-none-any.whl → 3.8.1a11__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 +13 -5
- aws_lambda_powertools/metrics/provider/cold_start.py +11 -0
- aws_lambda_powertools/shared/constants.py +1 -0
- aws_lambda_powertools/shared/version.py +1 -1
- aws_lambda_powertools/tracing/tracer.py +28 -5
- aws_lambda_powertools/utilities/idempotency/base.py +6 -2
- aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py +4 -0
- aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py +1 -0
- {aws_lambda_powertools-3.8.1a9.dist-info → aws_lambda_powertools-3.8.1a11.dist-info}/METADATA +1 -1
- {aws_lambda_powertools-3.8.1a9.dist-info → aws_lambda_powertools-3.8.1a11.dist-info}/RECORD +12 -12
- {aws_lambda_powertools-3.8.1a9.dist-info → aws_lambda_powertools-3.8.1a11.dist-info}/LICENSE +0 -0
- {aws_lambda_powertools-3.8.1a9.dist-info → aws_lambda_powertools-3.8.1a11.dist-info}/WHEEL +0 -0
@@ -64,14 +64,22 @@ def _is_cold_start() -> bool:
|
|
64
64
|
bool
|
65
65
|
cold start bool value
|
66
66
|
"""
|
67
|
-
cold_start = False
|
68
|
-
|
69
67
|
global is_cold_start
|
70
|
-
|
71
|
-
|
68
|
+
|
69
|
+
initialization_type = os.getenv(constants.LAMBDA_INITIALIZATION_TYPE)
|
70
|
+
|
71
|
+
# Check for Provisioned Concurrency environment
|
72
|
+
# AWS_LAMBDA_INITIALIZATION_TYPE is set when using Provisioned Concurrency
|
73
|
+
if initialization_type == "provisioned-concurrency":
|
72
74
|
is_cold_start = False
|
75
|
+
return False
|
76
|
+
|
77
|
+
if not is_cold_start:
|
78
|
+
return False
|
73
79
|
|
74
|
-
return
|
80
|
+
# This is a cold start - flip the flag and return True
|
81
|
+
is_cold_start = False
|
82
|
+
return True
|
75
83
|
|
76
84
|
|
77
85
|
class Logger:
|
@@ -1,7 +1,18 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
+
import os
|
4
|
+
|
5
|
+
from aws_lambda_powertools.shared import constants
|
6
|
+
|
3
7
|
is_cold_start = True
|
4
8
|
|
9
|
+
initialization_type = os.getenv(constants.LAMBDA_INITIALIZATION_TYPE)
|
10
|
+
|
11
|
+
# Check for Provisioned Concurrency environment
|
12
|
+
# AWS_LAMBDA_INITIALIZATION_TYPE is set when using Provisioned Concurrency
|
13
|
+
if initialization_type == "provisioned-concurrency":
|
14
|
+
is_cold_start = False
|
15
|
+
|
5
16
|
|
6
17
|
def reset_cold_start_flag():
|
7
18
|
global is_cold_start
|
@@ -57,6 +57,7 @@ LAMBDA_TASK_ROOT_ENV: str = "LAMBDA_TASK_ROOT"
|
|
57
57
|
SAM_LOCAL_ENV: str = "AWS_SAM_LOCAL"
|
58
58
|
CHALICE_LOCAL_ENV: str = "AWS_CHALICE_CLI_MODE"
|
59
59
|
LAMBDA_FUNCTION_NAME_ENV: str = "AWS_LAMBDA_FUNCTION_NAME"
|
60
|
+
LAMBDA_INITIALIZATION_TYPE: str = "AWS_LAMBDA_INITIALIZATION_TYPE"
|
60
61
|
|
61
62
|
# Debug constants
|
62
63
|
POWERTOOLS_DEV_ENV: str = "POWERTOOLS_DEV"
|
@@ -30,6 +30,32 @@ aws_xray_sdk = LazyLoader(constants.XRAY_SDK_MODULE, globals(), constants.XRAY_S
|
|
30
30
|
T = TypeVar("T")
|
31
31
|
|
32
32
|
|
33
|
+
def _is_cold_start() -> bool:
|
34
|
+
"""Verifies whether is cold start
|
35
|
+
|
36
|
+
Returns
|
37
|
+
-------
|
38
|
+
bool
|
39
|
+
cold start bool value
|
40
|
+
"""
|
41
|
+
global is_cold_start
|
42
|
+
|
43
|
+
initialization_type = os.getenv(constants.LAMBDA_INITIALIZATION_TYPE)
|
44
|
+
|
45
|
+
# Check for Provisioned Concurrency environment
|
46
|
+
# AWS_LAMBDA_INITIALIZATION_TYPE is set when using Provisioned Concurrency
|
47
|
+
if initialization_type == "provisioned-concurrency":
|
48
|
+
is_cold_start = False
|
49
|
+
return False
|
50
|
+
|
51
|
+
if not is_cold_start:
|
52
|
+
return False
|
53
|
+
|
54
|
+
# This is a cold start - flip the flag and return True
|
55
|
+
is_cold_start = False
|
56
|
+
return True
|
57
|
+
|
58
|
+
|
33
59
|
class Tracer:
|
34
60
|
"""Tracer using AWS-XRay to provide decorators with known defaults for Lambda functions
|
35
61
|
|
@@ -340,12 +366,9 @@ class Tracer:
|
|
340
366
|
|
341
367
|
raise
|
342
368
|
finally:
|
343
|
-
|
369
|
+
cold_start = _is_cold_start()
|
344
370
|
logger.debug("Annotating cold start")
|
345
|
-
subsegment.put_annotation(key="ColdStart", value=
|
346
|
-
|
347
|
-
if is_cold_start:
|
348
|
-
is_cold_start = False
|
371
|
+
subsegment.put_annotation(key="ColdStart", value=cold_start)
|
349
372
|
|
350
373
|
if self.service:
|
351
374
|
subsegment.put_annotation(key="Service", value=self.service)
|
@@ -250,10 +250,14 @@ class IdempotencyHandler:
|
|
250
250
|
"item should have been expired in-progress because it already time-outed.",
|
251
251
|
)
|
252
252
|
|
253
|
-
|
253
|
+
inprogress_error_message = (
|
254
254
|
f"Execution already in progress with idempotency key: "
|
255
|
-
f"{self.persistence_store.event_key_jmespath}={data_record.idempotency_key}"
|
255
|
+
f"{self.persistence_store.event_key_jmespath}={data_record.idempotency_key}"
|
256
256
|
)
|
257
|
+
if data_record.sort_key is not None:
|
258
|
+
inprogress_error_message += f" and sort key: {data_record.sort_key}"
|
259
|
+
|
260
|
+
raise IdempotencyAlreadyInProgressError(inprogress_error_message)
|
257
261
|
|
258
262
|
response_dict = data_record.response_json_as_dict()
|
259
263
|
serialized_response = self.output_serializer.from_dict(response_dict) if response_dict else None
|
@@ -27,6 +27,7 @@ class DataRecord:
|
|
27
27
|
in_progress_expiry_timestamp: int | None = None,
|
28
28
|
response_data: str = "",
|
29
29
|
payload_hash: str = "",
|
30
|
+
sort_key: str | None = None,
|
30
31
|
) -> None:
|
31
32
|
"""
|
32
33
|
|
@@ -44,6 +45,8 @@ class DataRecord:
|
|
44
45
|
hashed representation of payload
|
45
46
|
response_data: str, optional
|
46
47
|
response data from previous executions using the record
|
48
|
+
sort_key: str, optional
|
49
|
+
sort key when using composite key
|
47
50
|
"""
|
48
51
|
self.idempotency_key = idempotency_key
|
49
52
|
self.payload_hash = payload_hash
|
@@ -51,6 +54,7 @@ class DataRecord:
|
|
51
54
|
self.in_progress_expiry_timestamp = in_progress_expiry_timestamp
|
52
55
|
self._status = status
|
53
56
|
self.response_data = response_data
|
57
|
+
self.sort_key = sort_key
|
54
58
|
|
55
59
|
@property
|
56
60
|
def is_expired(self) -> bool:
|
@@ -168,6 +168,7 @@ class DynamoDBPersistenceLayer(BasePersistenceLayer):
|
|
168
168
|
in_progress_expiry_timestamp=data.get(self.in_progress_expiry_attr),
|
169
169
|
response_data=data.get(self.data_attr),
|
170
170
|
payload_hash=data.get(self.validation_key_attr),
|
171
|
+
sort_key=data[self.sort_key_attr] if self.sort_key_attr is not None else None,
|
171
172
|
)
|
172
173
|
|
173
174
|
def _get_record(self, idempotency_key) -> DataRecord:
|
{aws_lambda_powertools-3.8.1a9.dist-info → aws_lambda_powertools-3.8.1a11.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.1a11
|
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,7 +49,7 @@ 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=H8f5Rp8P9I_hhzUolQAr2vjMDspV6Kg7u6sfg2V8wjo,49010
|
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
|
@@ -66,7 +66,7 @@ aws_lambda_powertools/metrics/provider/cloudwatch_emf/constants.py,sha256=ByQMR6
|
|
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
|
-
aws_lambda_powertools/metrics/provider/cold_start.py,sha256=
|
69
|
+
aws_lambda_powertools/metrics/provider/cold_start.py,sha256=I4oAfv2HIfMtX69IoLcGp-D79XjSfX4MZDoUdTPcMQ4,505
|
70
70
|
aws_lambda_powertools/metrics/provider/datadog/__init__.py,sha256=3LivCIwqyI7KKEeSLDcxN1Z9RObChoMg5hpiXPin2C0,225
|
71
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
|
@@ -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=5piC-613gUOv2r1miWvSuiT04sG89CGy8iY98Bxlslg,2872
|
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,11 +88,11 @@ 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=HQas4nX_A2mG2I3pU7PjnwNXh6_eX3v23LMpSYKubXs,85
|
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
|
95
|
-
aws_lambda_powertools/tracing/tracer.py,sha256=
|
95
|
+
aws_lambda_powertools/tracing/tracer.py,sha256=bLTdP3NmJQc3VYdcP-tZJ3fdvR8jNTPT8RBuUVtPQqY,32457
|
96
96
|
aws_lambda_powertools/utilities/__init__.py,sha256=BhnoYxIaDboi8oCsEMAizR2Bp-EaJJ-OcdMa9q07thc,39
|
97
97
|
aws_lambda_powertools/utilities/batch/__init__.py,sha256=mjFmfhJwot_3miZrstDcMKH7LzM_0aD35z-581HgZfY,1073
|
98
98
|
aws_lambda_powertools/utilities/batch/base.py,sha256=FAYRjITKFHtRLmADX1xF92WQUPLyqzYXgvLvFtQE4vU,25292
|
@@ -158,15 +158,15 @@ aws_lambda_powertools/utilities/feature_flags/feature_flags.py,sha256=SCRfGo7R5z
|
|
158
158
|
aws_lambda_powertools/utilities/feature_flags/schema.py,sha256=mOU8tr6iGtwY3QD5iorKC8OLwZ23VLKjHOapQp3C9o0,22682
|
159
159
|
aws_lambda_powertools/utilities/feature_flags/types.py,sha256=UBMywajJ_umny7GAd9vYDMxpGqRNrcyBzXtMrGdXtkU,261
|
160
160
|
aws_lambda_powertools/utilities/idempotency/__init__.py,sha256=9GEhuiB6lLalv37ynRxBVkpZ8kvtuPcQNRLrk9TkzF8,619
|
161
|
-
aws_lambda_powertools/utilities/idempotency/base.py,sha256=
|
161
|
+
aws_lambda_powertools/utilities/idempotency/base.py,sha256=enIl3lfDn4I6n3M9cacW-u9sxrEgXKHh-jPCTT1snBs,11425
|
162
162
|
aws_lambda_powertools/utilities/idempotency/config.py,sha256=h8UraMbewI39KoIIh7FpB_fXtIv_v0WjN1URtvLfeJQ,2868
|
163
163
|
aws_lambda_powertools/utilities/idempotency/exceptions.py,sha256=HLQoBsxrmkkbQVxZ7CxKBwbVw5Tk9ko7VKbkh9qOJmc,2914
|
164
164
|
aws_lambda_powertools/utilities/idempotency/hook.py,sha256=XHj6q0dP65C8Cj-TPJ9a8OZB7LyISNJCuEHc8OzhLZg,450
|
165
165
|
aws_lambda_powertools/utilities/idempotency/idempotency.py,sha256=olyu7R-YZny6oVABrOGuUhNN856D_nfrzfaGnH0ojjk,7397
|
166
166
|
aws_lambda_powertools/utilities/idempotency/persistence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
167
167
|
aws_lambda_powertools/utilities/idempotency/persistence/base.py,sha256=slYzih7C-tpAUugXdM2DMemNVA_HnxsbtpsvZKiH3gY,16022
|
168
|
-
aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py,sha256=
|
169
|
-
aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py,sha256=
|
168
|
+
aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py,sha256=brtO34whh_ioHkB6GfIjcIUyvzBI7BrEiwQVwFjEVXc,3644
|
169
|
+
aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py,sha256=H0dm8U1dwNPzAHtmARBoPIq-ajI1ih62bgQFX1RyVxo,13908
|
170
170
|
aws_lambda_powertools/utilities/idempotency/persistence/redis.py,sha256=KN3XfUZzGwEqkkXZB7OGadYGdf7IiwwChtVzZRuZUQE,21588
|
171
171
|
aws_lambda_powertools/utilities/idempotency/serialization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
172
172
|
aws_lambda_powertools/utilities/idempotency/serialization/base.py,sha256=E6ZO7uGOJnhepSkS4NkUbPhw9BNU1581HRmdgEaXe8k,1445
|
@@ -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.1a11.dist-info/LICENSE,sha256=vMHS2eBgmwPUIMPb7LQ4p7ib_FPVQXarVjAasflrTwo,951
|
261
|
+
aws_lambda_powertools-3.8.1a11.dist-info/METADATA,sha256=9VkH-AeDJs7fURrNxl6K06Z5_T0c6alhKqSE5eduyAo,11157
|
262
|
+
aws_lambda_powertools-3.8.1a11.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
263
|
+
aws_lambda_powertools-3.8.1a11.dist-info/RECORD,,
|
{aws_lambda_powertools-3.8.1a9.dist-info → aws_lambda_powertools-3.8.1a11.dist-info}/LICENSE
RENAMED
File without changes
|
File without changes
|