2022-11-02 21:00:51 +00:00
|
|
|
import os
|
|
|
|
|
2022-03-11 22:29:16 +00:00
|
|
|
from moto import mock_xray_client, XRaySegment, mock_dynamodb
|
2022-11-02 21:00:51 +00: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 00:06:22 +00:00
|
|
|
import boto3
|
2022-11-02 21:00:51 +00:00
|
|
|
import sys
|
2017-10-17 00:06:22 +00: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 15:44:26 +00:00
|
|
|
|
2017-10-17 00:06:22 +00:00
|
|
|
original_make_api_call = botocore.client.BaseClient._make_api_call
|
|
|
|
original_encode_headers = botocore.endpoint.Endpoint._encode_headers
|
|
|
|
|
2022-03-11 21:28:45 +00:00
|
|
|
import requests # noqa # pylint: disable=all
|
2019-10-31 15:44:26 +00:00
|
|
|
|
2017-10-17 00:06:22 +00:00
|
|
|
original_session_request = requests.Session.request
|
|
|
|
original_session_prep_request = requests.Session.prepare_request
|
|
|
|
|
|
|
|
|
2022-11-02 21:00:51 +00: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 00:06:22 +00:00
|
|
|
@mock_xray_client
|
2022-03-11 22:29:16 +00:00
|
|
|
@mock_dynamodb
|
2017-10-17 00:06:22 +00:00
|
|
|
def test_xray_dynamo_request_id():
|
2022-11-02 21:00:51 +00:00
|
|
|
check_coverage_status()
|
|
|
|
|
2017-10-17 00:06:22 +00: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)
|
|
|
|
|
|
|
|
|
2021-11-22 23:06:59 +00:00
|
|
|
def test_xray_dynamo_request_id_with_context_mgr():
|
2022-11-02 21:00:51 +00:00
|
|
|
check_coverage_status()
|
|
|
|
|
2021-11-22 23:06:59 +00:00
|
|
|
with mock_xray_client():
|
|
|
|
assert isinstance(xray_core.xray_recorder._emitter, MockEmitter)
|
2022-03-11 22:29:16 +00:00
|
|
|
with mock_dynamodb():
|
2021-11-22 23:06:59 +00: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 00:06:22 +00:00
|
|
|
@mock_xray_client
|
|
|
|
def test_xray_udp_emitter_patched():
|
2022-11-02 21:00:51 +00:00
|
|
|
check_coverage_status()
|
|
|
|
|
2017-10-17 00:06:22 +00: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)
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
@mock_xray_client
|
|
|
|
def test_xray_context_patched():
|
2022-11-02 21:00:51 +00:00
|
|
|
check_coverage_status()
|
|
|
|
|
2017-10-17 00:06:22 +00: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()
|
|
|
|
|
|
|
|
xray_core.xray_recorder._context.context_missing.should.equal("LOG_ERROR")
|
|
|
|
|
|
|
|
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)
|