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.
@@ -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
- if is_cold_start:
71
- cold_start = is_cold_start
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 cold_start
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"
@@ -1,3 +1,3 @@
1
1
  """Exposes version constant to avoid circular dependencies."""
2
2
 
3
- VERSION = "3.8.1a9"
3
+ VERSION = "3.8.1a11"
@@ -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
- global is_cold_start
369
+ cold_start = _is_cold_start()
344
370
  logger.debug("Annotating cold start")
345
- subsegment.put_annotation(key="ColdStart", value=is_cold_start)
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
- raise IdempotencyAlreadyInProgressError(
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: aws_lambda_powertools
3
- Version: 3.8.1a9
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=h4jAJMXRZhYQv84j0bnzyxaHUzN1RePn1XdS9yH5imM,48679
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=j-_Mtsr4DnsItiTdrNnx63zH_wsonl9xsGAb8QuKGSs,168
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=Na17ZV15AgUqWdkrNg-WYXv8FEqwY1ga7KwClgePoG4,2805
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=0GimQ5exesjPqSg5Vhs7H9b-rMcb1FBGy3N7PNMhxSk,84
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=auCuwi_ebQ8DMklRACdjfEQxu-eds-D-zWt7jQNcjsY,31904
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=MR2zCGGUto5h6_XRNPUUTrycR2pcTVxrvepLeIZYAoo,11225
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=qqX-Z5GxzoTOE7URFRLyLKesKTOetwE19FCrctulxrQ,3496
169
- aws_lambda_powertools/utilities/idempotency/persistence/dynamodb.py,sha256=3WyVLEwsKhlpjp5iKAeWD5D5lF_xYyMDmRkxzWoZxjU,13817
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.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,,
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,,