| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 21:29:16 -01:00
										 |  |  | from moto import mock_xray_client, XRaySegment, mock_dynamodb | 
					
						
							| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  | from moto.utilities.distutils_version import LooseVersion | 
					
						
							|  |  |  | from unittest import SkipTest | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | from moto.xray.mock_client import MockEmitter | 
					
						
							|  |  |  | import aws_xray_sdk.core as xray_core | 
					
						
							|  |  |  | import aws_xray_sdk.core.patcher as xray_core_patcher | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import botocore.client | 
					
						
							|  |  |  | import botocore.endpoint | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | original_make_api_call = botocore.client.BaseClient._make_api_call | 
					
						
							|  |  |  | original_encode_headers = botocore.endpoint.Endpoint._encode_headers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 20:28:45 -01:00
										 |  |  | import requests  # noqa # pylint: disable=all | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | original_session_request = requests.Session.request | 
					
						
							|  |  |  | original_session_prep_request = requests.Session.prepare_request | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  | def check_coverage_status(): | 
					
						
							|  |  |  |     # If the wrong version of the coverage module is loaded, skip this test | 
					
						
							|  |  |  |     coverage_module = sys.modules.get("coverage") | 
					
						
							|  |  |  |     # If Coverage is not installed, we're fine | 
					
						
							|  |  |  |     if not coverage_module: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     coverage_version = LooseVersion(coverage_module.__version__) | 
					
						
							|  |  |  |     # If we have an old version of Coverage installed, we're fine | 
					
						
							|  |  |  |     if coverage_version < LooseVersion("5.0.0"): | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     # If Coverage is not enabled in this test run, we're fine | 
					
						
							|  |  |  |     if "COV_CORE_SOURCE" not in os.environ: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     raise SkipTest("Can't run this test with Coverage 5.x") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | @mock_xray_client | 
					
						
							| 
									
										
										
										
											2022-03-11 21:29:16 -01:00
										 |  |  | @mock_dynamodb | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | def test_xray_dynamo_request_id(): | 
					
						
							| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  |     check_coverage_status() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  |     # Could be ran in any order, so we need to tell sdk that its been unpatched | 
					
						
							|  |  |  |     xray_core_patcher._PATCHED_MODULES = set() | 
					
						
							|  |  |  |     xray_core.patch_all() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("dynamodb", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with XRaySegment(): | 
					
						
							|  |  |  |         resp = client.list_tables() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         resp["ResponseMetadata"].should.contain("RequestId") | 
					
						
							|  |  |  |         id1 = resp["ResponseMetadata"]["RequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with XRaySegment(): | 
					
						
							|  |  |  |         client.list_tables() | 
					
						
							|  |  |  |         resp = client.list_tables() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         id2 = resp["ResponseMetadata"]["RequestId"] | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     id1.should_not.equal(id2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     setattr(botocore.client.BaseClient, "_make_api_call", original_make_api_call) | 
					
						
							|  |  |  |     setattr(botocore.endpoint.Endpoint, "_encode_headers", original_encode_headers) | 
					
						
							|  |  |  |     setattr(requests.Session, "request", original_session_request) | 
					
						
							|  |  |  |     setattr(requests.Session, "prepare_request", original_session_prep_request) | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 22:06:59 -01:00
										 |  |  | def test_xray_dynamo_request_id_with_context_mgr(): | 
					
						
							| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  |     check_coverage_status() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 22:06:59 -01:00
										 |  |  |     with mock_xray_client(): | 
					
						
							|  |  |  |         assert isinstance(xray_core.xray_recorder._emitter, MockEmitter) | 
					
						
							| 
									
										
										
										
											2022-03-11 21:29:16 -01:00
										 |  |  |         with mock_dynamodb(): | 
					
						
							| 
									
										
										
										
											2021-11-22 22:06:59 -01:00
										 |  |  |             # Could be ran in any order, so we need to tell sdk that its been unpatched | 
					
						
							|  |  |  |             xray_core_patcher._PATCHED_MODULES = set() | 
					
						
							|  |  |  |             xray_core.patch_all() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             client = boto3.client("dynamodb", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             with XRaySegment(): | 
					
						
							|  |  |  |                 resp = client.list_tables() | 
					
						
							|  |  |  |                 resp["ResponseMetadata"].should.contain("RequestId") | 
					
						
							|  |  |  |                 id1 = resp["ResponseMetadata"]["RequestId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             with XRaySegment(): | 
					
						
							|  |  |  |                 client.list_tables() | 
					
						
							|  |  |  |                 resp = client.list_tables() | 
					
						
							|  |  |  |                 id2 = resp["ResponseMetadata"]["RequestId"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             id1.should_not.equal(id2) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             setattr( | 
					
						
							|  |  |  |                 botocore.client.BaseClient, "_make_api_call", original_make_api_call | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             setattr( | 
					
						
							|  |  |  |                 botocore.endpoint.Endpoint, "_encode_headers", original_encode_headers | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             setattr(requests.Session, "request", original_session_request) | 
					
						
							|  |  |  |             setattr(requests.Session, "prepare_request", original_session_prep_request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Verify we have unmocked the xray recorder | 
					
						
							|  |  |  |     assert not isinstance(xray_core.xray_recorder._emitter, MockEmitter) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | @mock_xray_client | 
					
						
							|  |  |  | def test_xray_udp_emitter_patched(): | 
					
						
							| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  |     check_coverage_status() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  |     # Could be ran in any order, so we need to tell sdk that its been unpatched | 
					
						
							|  |  |  |     xray_core_patcher._PATCHED_MODULES = set() | 
					
						
							|  |  |  |     xray_core.patch_all() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert isinstance(xray_core.xray_recorder._emitter, MockEmitter) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     setattr(botocore.client.BaseClient, "_make_api_call", original_make_api_call) | 
					
						
							|  |  |  |     setattr(botocore.endpoint.Endpoint, "_encode_headers", original_encode_headers) | 
					
						
							|  |  |  |     setattr(requests.Session, "request", original_session_request) | 
					
						
							|  |  |  |     setattr(requests.Session, "prepare_request", original_session_prep_request) | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_xray_client | 
					
						
							|  |  |  | def test_xray_context_patched(): | 
					
						
							| 
									
										
										
										
											2022-11-02 20:00:51 -01:00
										 |  |  |     check_coverage_status() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  |     # Could be ran in any order, so we need to tell sdk that its been unpatched | 
					
						
							|  |  |  |     xray_core_patcher._PATCHED_MODULES = set() | 
					
						
							|  |  |  |     xray_core.patch_all() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     xray_core.xray_recorder._context.context_missing.should.equal("LOG_ERROR") | 
					
						
							| 
									
										
										
										
											2017-10-17 01:06:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     setattr(botocore.client.BaseClient, "_make_api_call", original_make_api_call) | 
					
						
							|  |  |  |     setattr(botocore.endpoint.Endpoint, "_encode_headers", original_encode_headers) | 
					
						
							|  |  |  |     setattr(requests.Session, "request", original_session_request) | 
					
						
							|  |  |  |     setattr(requests.Session, "prepare_request", original_session_prep_request) |