4
4
import logging
5
5
import os
6
6
from distutils .util import strtobool
7
- from typing import Any , Callable , Dict , List
7
+ from typing import Any , Callable , Dict , Generic , List , TypeVar
8
8
9
9
from .base import TracerProvider , XrayProvider
10
10
from .exceptions import InvalidTracerProviderError , TracerProviderNotInitializedError
11
11
12
+ subsegment = TypeVar ("subsegment" )
12
13
is_cold_start = True
13
14
logger = logging .getLogger (__name__ )
14
15
@@ -27,6 +28,9 @@ class Tracer:
27
28
is useful when you are using your own middlewares and want to utilize an existing Tracer.
28
29
Make sure to set `auto_patch=False` in subsequent Tracer instances to avoid double patching.
29
30
31
+ Tracer supports custom providers that implement
32
+ `aws_lambda_powertools.tracing.base.TracerProvider`.
33
+
30
34
Environment variables
31
35
---------------------
32
36
POWERTOOLS_TRACE_DISABLED : str
@@ -115,6 +119,13 @@ def handler(event: dict, context: Any) -> Dict:
115
119
Tracer
116
120
Tracer instance with imported modules patched
117
121
122
+ Raises
123
+ ------
124
+ InvalidTracerProviderError
125
+ When given provider doesn't implement `aws_lambda_powertools.tracing.base.TracerProvider`
126
+ TracerProviderNotInitializedError
127
+ When given provider isn't initialized/bound
128
+
118
129
Limitations
119
130
-----------
120
131
* Async handler and methods not supported
@@ -152,7 +163,7 @@ def __init__(
152
163
if self .auto_patch :
153
164
self .patch (modules = patch_modules )
154
165
155
- def create_subsegment (self , name : str ):
166
+ def create_subsegment (self , name : str ) -> Generic [ subsegment ] :
156
167
"""Creates subsegment/span with a given name
157
168
158
169
It also assumes Tracer would be instantiated statically so that cold starts are captured.
@@ -168,11 +179,10 @@ def create_subsegment(self, name: str):
168
179
169
180
self.create_subsegment(name="a meaningful name")
170
181
171
- # FIXME - Return Subsegment Any type
172
182
Returns
173
183
-------
174
- models. subsegment
175
- AWS X-Ray Subsegment
184
+ subsegment
185
+ Trace provider subsegment
176
186
"""
177
187
# Will no longer be needed once #155 is resolved
178
188
# https://github.com/aws/aws-xray-sdk-python/issues/155
@@ -204,7 +214,7 @@ def put_annotation(self, key: str, value: Any):
204
214
----------
205
215
key : str
206
216
Annotation key (e.g. PaymentStatus)
207
- value : Any
217
+ value : any
208
218
Value for annotation (e.g. "CONFIRMED")
209
219
"""
210
220
# Will no longer be needed once #155 is resolved
@@ -216,14 +226,14 @@ def put_annotation(self, key: str, value: Any):
216
226
logger .debug (f"Annotating on key '{ key } '' with '{ value } ''" )
217
227
self .provider .put_annotation (key = key , value = value )
218
228
219
- def put_metadata (self , key : str , value : object , namespace : str = None ):
229
+ def put_metadata (self , key : str , value : Any , namespace : str = None ):
220
230
"""Adds metadata to existing segment or subsegment
221
231
222
232
Parameters
223
233
----------
224
234
key : str
225
235
Metadata key
226
- value : object
236
+ value : any
227
237
Value for metadata
228
238
namespace : str, optional
229
239
Namespace that metadata will lie under, by default None
@@ -285,7 +295,6 @@ def handler(event, context)
285
295
@functools .wraps (lambda_handler )
286
296
def decorate (event , context ):
287
297
self .create_subsegment (name = f"## { lambda_handler .__name__ } " )
288
-
289
298
try :
290
299
logger .debug ("Calling lambda handler" )
291
300
response = lambda_handler (event , context )
0 commit comments