17
17
logger = logging .getLogger (__name__ )
18
18
19
19
aws_xray_sdk = LazyLoader (constants .XRAY_SDK_MODULE , globals (), constants .XRAY_SDK_MODULE )
20
- aws_xray_sdk .core = LazyLoader (constants .XRAY_SDK_CORE_MODULE , globals (), constants .XRAY_SDK_CORE_MODULE ) # type: ignore # noqa: E501
21
20
22
21
23
22
class Tracer :
@@ -156,7 +155,7 @@ def __init__(
156
155
self .__build_config (
157
156
service = service , disabled = disabled , auto_patch = auto_patch , patch_modules = patch_modules , provider = provider
158
157
)
159
- self .provider : BaseProvider = self ._config ["provider" ]
158
+ self .provider = self ._config ["provider" ]
160
159
self .disabled = self ._config ["disabled" ]
161
160
self .service = self ._config ["service" ]
162
161
self .auto_patch = self ._config ["auto_patch" ]
@@ -167,10 +166,18 @@ def __init__(
167
166
if self .auto_patch :
168
167
self .patch (modules = patch_modules )
169
168
170
- # Set the streaming threshold to 0 on the default recorder to force sending
171
- # subsegments individually, rather than batching them.
172
- # See https://github.com/awslabs/aws-lambda-powertools-python/issues/283
173
- aws_xray_sdk .core .xray_recorder .configure (streaming_threshold = 0 ) # noqa: E800
169
+ if "aws_xray_sdk" in self .provider .__module__ :
170
+ self ._disable_xray_trace_batching ()
171
+
172
+ def _disable_xray_trace_batching (self ):
173
+ """Configure X-Ray SDK to send subsegment individually over batching
174
+ Known issue: https://github.com/awslabs/aws-lambda-powertools-python/issues/283
175
+ """
176
+ if self .disabled :
177
+ logger .debug ("Tracing has been disabled, aborting streaming override" )
178
+ return
179
+
180
+ aws_xray_sdk .core .xray_recorder .configure (streaming_threshold = 0 )
174
181
175
182
def put_annotation (self , key : str , value : Union [str , numbers .Number , bool ]):
176
183
"""Adds annotation to existing segment or subsegment
@@ -239,9 +246,9 @@ def patch(self, modules: Optional[Sequence[str]] = None):
239
246
return
240
247
241
248
if modules is None :
242
- aws_xray_sdk . core .patch_all ()
249
+ self . provider .patch_all ()
243
250
else :
244
- aws_xray_sdk . core .patch (modules )
251
+ self . provider .patch (modules )
245
252
246
253
def capture_lambda_handler (
247
254
self ,
@@ -743,7 +750,8 @@ def __build_config(
743
750
is_disabled = disabled if disabled is not None else self ._is_tracer_disabled ()
744
751
is_service = resolve_env_var_choice (choice = service , env = os .getenv (constants .SERVICE_NAME_ENV ))
745
752
746
- self ._config ["provider" ] = provider or self ._config ["provider" ] or aws_xray_sdk .core .xray_recorder
753
+ # Logic: Choose overridden option first, previously cached config, or default if available
754
+ self ._config ["provider" ] = provider or self ._config ["provider" ] or self ._patch_xray_provider ()
747
755
self ._config ["auto_patch" ] = auto_patch if auto_patch is not None else self ._config ["auto_patch" ]
748
756
self ._config ["service" ] = is_service or self ._config ["service" ]
749
757
self ._config ["disabled" ] = is_disabled or self ._config ["disabled" ]
@@ -752,3 +760,18 @@ def __build_config(
752
760
@classmethod
753
761
def _reset_config (cls ):
754
762
cls ._config = copy .copy (cls ._default_config )
763
+
764
+ def _patch_xray_provider (self ):
765
+ # Due to Lazy Import, we need to activate `core` attrib via import
766
+ # we also need to include `patch`, `patch_all` methods
767
+ # to ensure patch calls are done via the provider
768
+ from aws_xray_sdk .core import xray_recorder
769
+
770
+ provider = xray_recorder
771
+ provider .patch = aws_xray_sdk .core .patch
772
+ provider .patch_all = aws_xray_sdk .core .patch_all
773
+
774
+ return provider
775
+
776
+ def _is_xray_provider (self ):
777
+ return "aws_xray_sdk" in self .provider .__module__
0 commit comments