11
11
from aws_lambda_powertools .shared .functions import resolve_env_var_choice , resolve_truthy_env_var_choice
12
12
from aws_lambda_powertools .shared .lazy_import import LazyLoader
13
13
from aws_lambda_powertools .shared .types import AnyCallableT
14
- from aws_lambda_powertools .tracing .base import BaseProvider , BaseSegment
15
14
from aws_lambda_powertools .tracing .provider import XrayProvider
15
+ from aws_lambda_powertools .tracing .provider .base import BaseProvider , BaseSpan
16
16
17
17
is_cold_start = True
18
18
logger = logging .getLogger (__name__ )
@@ -172,9 +172,17 @@ def __init__(
172
172
self .patch (modules = patch_modules )
173
173
174
174
if self ._is_xray_provider ():
175
- # TO why?
176
175
self ._disable_xray_trace_batching ()
177
176
177
+ def set_attribute (self , key : str , value : Union [str , numbers .Number , bool ]):
178
+ if self .disabled :
179
+ logger .debug ("Tracing has been disabled, aborting put_annotation" )
180
+ return
181
+
182
+ logger .debug (f"setting attribute on key '{ key } ' with '{ value } '" )
183
+
184
+ self .provider .set_attribute (key = key , value = value )
185
+
178
186
def put_annotation (self , key : str , value : Union [str , numbers .Number , bool ]):
179
187
"""Adds annotation to existing segment or subsegment
180
188
@@ -197,7 +205,11 @@ def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]):
197
205
return
198
206
199
207
logger .debug (f"Annotating on key '{ key } ' with '{ value } '" )
200
- self .provider .put_annotation (key = key , value = value )
208
+
209
+ if not self ._is_custom_provider ():
210
+ self .provider .put_annotation (key = key , value = value ) # type: ignore
211
+ else :
212
+ self .provider .set_attribute (key = key , value = value )
201
213
202
214
def put_metadata (self , key : str , value : Any , namespace : Optional [str ] = None ):
203
215
"""Adds metadata to existing segment or subsegment
@@ -225,7 +237,10 @@ def put_metadata(self, key: str, value: Any, namespace: Optional[str] = None):
225
237
226
238
namespace = namespace or self .service
227
239
logger .debug (f"Adding metadata on key '{ key } ' with '{ value } ' at namespace '{ namespace } '" )
228
- self .provider .put_metadata (key = key , value = value , namespace = namespace )
240
+ if not self ._is_custom_provider ():
241
+ self .provider .put_metadata (key = key , value = value , namespace = namespace ) # type: ignore
242
+ else :
243
+ self .provider .set_attribute (key = f"{ namespace } .{ key } " , value = value )
229
244
230
245
def patch (self , modules : Optional [Sequence [str ]] = None ):
231
246
"""Patch modules for instrumentation.
@@ -700,7 +715,7 @@ def _add_response_as_metadata(
700
715
self ,
701
716
method_name : Optional [str ] = None ,
702
717
data : Optional [Any ] = None ,
703
- subsegment : Optional [BaseSegment ] = None ,
718
+ subsegment : Optional [BaseSpan ] = None ,
704
719
capture_response : Optional [Union [bool , str ]] = None ,
705
720
):
706
721
"""Add response as metadata for given subsegment
@@ -718,14 +733,16 @@ def _add_response_as_metadata(
718
733
"""
719
734
if data is None or not capture_response or subsegment is None :
720
735
return
721
-
722
- subsegment .put_metadata (key = f"{ method_name } response" , value = data , namespace = self .service )
736
+ if not self ._is_custom_provider ():
737
+ subsegment .put_metadata (key = f"{ method_name } response" , value = data , namespace = self .service ) # type: ignore
738
+ else :
739
+ subsegment .set_attribute (key = f"{ method_name } response" , value = data , namespace = self .service )
723
740
724
741
def _add_full_exception_as_metadata (
725
742
self ,
726
743
method_name : str ,
727
744
error : Exception ,
728
- subsegment : BaseSegment ,
745
+ subsegment : BaseSpan ,
729
746
capture_error : Optional [bool ] = None ,
730
747
):
731
748
"""Add full exception object as metadata for given subsegment
@@ -744,7 +761,14 @@ def _add_full_exception_as_metadata(
744
761
if not capture_error :
745
762
return
746
763
747
- subsegment .put_metadata (key = f"{ method_name } error" , value = error , namespace = self .service )
764
+ if not self ._is_custom_provider ():
765
+ subsegment .put_metadata (key = f"{ method_name } error" , value = error , namespace = self .service ) # type: ignore
766
+ else :
767
+ subsegment .set_attribute (
768
+ key = f"{ self .service } .{ method_name } error" ,
769
+ value = str (error ),
770
+ namespace = self .service ,
771
+ )
748
772
749
773
@staticmethod
750
774
def _disable_tracer_provider ():
@@ -827,6 +851,9 @@ def _disable_xray_trace_batching(self):
827
851
def _is_xray_provider (self ):
828
852
return isinstance (self .provider , XrayProvider )
829
853
854
+ def _is_custom_provider (self ):
855
+ return not self ._is_xray_provider and isinstance (self .provider , BaseProvider )
856
+
830
857
def ignore_endpoint (self , hostname : Optional [str ] = None , urls : Optional [List [str ]] = None ):
831
858
"""If you want to ignore certain httplib requests you can do so based on the hostname or URL that is being
832
859
requested.
0 commit comments