1111from aws_lambda_powertools .shared .functions import resolve_env_var_choice , resolve_truthy_env_var_choice
1212from aws_lambda_powertools .shared .lazy_import import LazyLoader
1313from aws_lambda_powertools .shared .types import AnyCallableT
14- from aws_lambda_powertools .tracing .base import BaseProvider , BaseSegment
1514from aws_lambda_powertools .tracing .provider import XrayProvider
15+ from aws_lambda_powertools .tracing .provider .base import BaseProvider , BaseSpan
1616
1717is_cold_start = True
1818logger = logging .getLogger (__name__ )
@@ -172,9 +172,17 @@ def __init__(
172172 self .patch (modules = patch_modules )
173173
174174 if self ._is_xray_provider ():
175- # TO why?
176175 self ._disable_xray_trace_batching ()
177176
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+
178186 def put_annotation (self , key : str , value : Union [str , numbers .Number , bool ]):
179187 """Adds annotation to existing segment or subsegment
180188
@@ -197,7 +205,11 @@ def put_annotation(self, key: str, value: Union[str, numbers.Number, bool]):
197205 return
198206
199207 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 )
201213
202214 def put_metadata (self , key : str , value : Any , namespace : Optional [str ] = None ):
203215 """Adds metadata to existing segment or subsegment
@@ -225,7 +237,10 @@ def put_metadata(self, key: str, value: Any, namespace: Optional[str] = None):
225237
226238 namespace = namespace or self .service
227239 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 )
229244
230245 def patch (self , modules : Optional [Sequence [str ]] = None ):
231246 """Patch modules for instrumentation.
@@ -700,7 +715,7 @@ def _add_response_as_metadata(
700715 self ,
701716 method_name : Optional [str ] = None ,
702717 data : Optional [Any ] = None ,
703- subsegment : Optional [BaseSegment ] = None ,
718+ subsegment : Optional [BaseSpan ] = None ,
704719 capture_response : Optional [Union [bool , str ]] = None ,
705720 ):
706721 """Add response as metadata for given subsegment
@@ -718,14 +733,16 @@ def _add_response_as_metadata(
718733 """
719734 if data is None or not capture_response or subsegment is None :
720735 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 )
723740
724741 def _add_full_exception_as_metadata (
725742 self ,
726743 method_name : str ,
727744 error : Exception ,
728- subsegment : BaseSegment ,
745+ subsegment : BaseSpan ,
729746 capture_error : Optional [bool ] = None ,
730747 ):
731748 """Add full exception object as metadata for given subsegment
@@ -744,7 +761,14 @@ def _add_full_exception_as_metadata(
744761 if not capture_error :
745762 return
746763
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+ )
748772
749773 @staticmethod
750774 def _disable_tracer_provider ():
@@ -827,6 +851,9 @@ def _disable_xray_trace_batching(self):
827851 def _is_xray_provider (self ):
828852 return isinstance (self .provider , XrayProvider )
829853
854+ def _is_custom_provider (self ):
855+ return not self ._is_xray_provider and isinstance (self .provider , BaseProvider )
856+
830857 def ignore_endpoint (self , hostname : Optional [str ] = None , urls : Optional [List [str ]] = None ):
831858 """If you want to ignore certain httplib requests you can do so based on the hostname or URL that is being
832859 requested.
0 commit comments