def test_ok(): status_code = 200 url = 'http://{}/status/{}?foo=bar'.format(BASE_URL, status_code) requests.get(url) subsegment = xray_recorder.current_segment().subsegments[0] assert get_hostname(url) == BASE_URL assert subsegment.name == get_hostname(url) http_meta = subsegment.http assert http_meta['request']['url'] == strip_url(url) assert http_meta['request']['method'].upper() == 'GET' assert http_meta['response']['status'] == status_code
def test_correct_identify_https(): status_code = 200 url = 'https://{}/status/{}?foo=bar&baz=foo'.format(BASE_URL, status_code) _do_req(url, use_https=True) subsegment = xray_recorder.current_segment().subsegments[0] assert subsegment.name == get_hostname(url) https_meta = subsegment.http assert https_meta['request']['url'].split(":")[0] == 'https'
def _xray_traced_http_client_read(wrapped, instance, args, kwargs): xray_data = getattr(instance, _XRAY_PROP, None) if not xray_data: return wrapped(*args, **kwargs) return xray_recorder.record_subsegment( wrapped, instance, args, kwargs, name=get_hostname(xray_data.url), namespace='remote', meta_processor=http_read_processor )
def test_fault(): status_code = 500 url = 'https://{}/status/{}'.format(BASE_URL, status_code) _do_req(url, 'PUT') subsegment = xray_recorder.current_segment().subsegments[1] assert subsegment.name == get_hostname(url) assert subsegment.fault http_meta = subsegment.http assert http_meta['request']['url'] == strip_url(url) assert http_meta['request']['method'].upper() == 'PUT' assert http_meta['response']['status'] == status_code
def test_error(): status_code = 400 url = 'http://{}/status/{}'.format(BASE_URL, status_code) requests.post(url) subsegment = xray_recorder.current_segment().subsegments[0] assert subsegment.name == get_hostname(url) assert subsegment.error http_meta = subsegment.http assert http_meta['request']['url'] == strip_url(url) assert http_meta['request']['method'].upper() == 'POST' assert http_meta['response']['status'] == status_code
def test_throttle(): status_code = 429 url = 'https://{}/status/{}'.format(BASE_URL, status_code) _do_req(url, 'HEAD') subsegment = xray_recorder.current_segment().subsegments[1] assert subsegment.name == get_hostname(url) assert subsegment.error assert subsegment.throttle http_meta = subsegment.http assert http_meta['request']['url'] == strip_url(url) assert http_meta['request']['method'].upper() == 'HEAD' assert http_meta['response']['status'] == status_code
async def begin_subsegment(session, trace_config_ctx, params): name = trace_config_ctx.name if trace_config_ctx.name else get_hostname( str(params.url)) subsegment = xray_recorder.begin_subsegment(name, REMOTE_NAMESPACE) # No-op if subsegment is `None` due to `LOG_ERROR`. if not subsegment: trace_config_ctx.give_up = True else: trace_config_ctx.give_up = False subsegment.put_http_meta(http.METHOD, params.method) subsegment.put_http_meta(http.URL, strip_url(params.url.human_repr())) inject_trace_header(params.headers, subsegment)
def _xray_traced_requests(wrapped, instance, args, kwargs): url = kwargs.get('url') or args[1] return xray_recorder.record_subsegment( wrapped, instance, args, kwargs, name=get_hostname(url), namespace='remote', meta_processor=requests_processor, )
def _xray_traced_http_getresponse(wrapped, instance, args, kwargs): if not PY2 and kwargs.get('buffering', False): # ignore py2 calls that fail as 'buffering` only exists in py2. return wrapped(*args, **kwargs) xray_data = getattr(instance, _XRAY_PROP, None) if not xray_data: return wrapped(*args, **kwargs) return xray_recorder.record_subsegment( wrapped, instance, args, kwargs, name=get_hostname(xray_data.url), namespace='remote', meta_processor=http_response_processor, )
def test_invalid_url(): url = 'KLSDFJKLSDFJKLSDJF' try: requests.get(url) except Exception: # prevent uncatch exception from breaking test run pass subsegment = xray_recorder.current_segment().subsegments[0] assert subsegment.name == get_hostname(url) assert subsegment.fault http_meta = subsegment.http assert http_meta['request']['url'] == strip_url(url) exception = subsegment.cause['exceptions'][0] assert exception.type == 'MissingSchema'
async def test_error(loop, recorder): xray_recorder.begin_segment('name') trace_config = aws_xray_trace_config() status_code = 400 url = 'http://{}/status/{}'.format(BASE_URL, status_code) async with ClientSession(loop=loop, trace_configs=[trace_config]) as session: async with session.post(url): pass subsegment = xray_recorder.current_segment().subsegments[0] assert subsegment.name == get_hostname(url) assert subsegment.error http_meta = subsegment.http assert http_meta['request']['url'] == strip_url(url) assert http_meta['request']['method'] == 'POST' assert http_meta['response']['status'] == status_code
def decompose_args(method, url, body, headers, encode_chunked=False): # skip httplib tracing for SDK built-in centralized sampling pollers if (('/GetSamplingRules' in args or '/SamplingTargets' in args) and type(instance).__name__ == 'botocore.awsrequest.AWSHTTPConnection'): return wrapped(*args, **kwargs) # Only injects headers when the subsegment for the outgoing # calls are opened successfully. subsegment = None try: subsegment = xray_recorder.current_subsegment() except SegmentNotFoundException: pass if subsegment: inject_trace_header(headers, subsegment) if issubclass(instance.__class__, urllib3.connection.HTTPSConnection): ssl_cxt = getattr(instance, 'ssl_context', None) elif issubclass(instance.__class__, httplib.HTTPSConnection): ssl_cxt = getattr(instance, '_context', None) else: # In this case, the patcher can't determine which module the connection instance is from. # We default to it to check ssl_context but may be None so that the default scheme would be # (and may falsely be) http. ssl_cxt = getattr(instance, 'ssl_context', None) scheme = 'https' if ssl_cxt and type( ssl_cxt).__name__ == 'SSLContext' else 'http' xray_url = '{}://{}{}'.format(scheme, instance.host, url) xray_data = _XRay_Data(method, instance.host, xray_url) setattr(instance, _XRAY_PROP, xray_data) # we add a segment here in case connect fails return xray_recorder.record_subsegment( wrapped, instance, args, kwargs, name=get_hostname(xray_data.url), namespace='remote', meta_processor=http_send_request_processor)
def test_get_hostname(): s1 = get_hostname("https://amazon.com/") assert s1 == "amazon.com" s2 = get_hostname("https://amazon.com/avery_long/path/and/stuff") assert s2 == "amazon.com" s3 = get_hostname("http://aws.amazon.com/should_get/sub/domains") assert s3 == "aws.amazon.com" s4 = get_hostname("https://amazon.com/somestuff?get=request&data=chiem") assert s4 == "amazon.com" s5 = get_hostname("INVALID_URL") assert s5 == UNKNOWN_HOST s6 = get_hostname("") assert s6 == UNKNOWN_HOST s7 = get_hostname(None) assert s7 == UNKNOWN_HOST