Skip to content

Commit 7019dc5

Browse files
authored
Merge pull request #192 from chanchiem/hostname
Downstream Http Calls should use hostname rather than full URL as subsegment name
2 parents 324d185 + 5dbe8b3 commit 7019dc5

File tree

8 files changed

+163
-44
lines changed

8 files changed

+163
-44
lines changed

aws_xray_sdk/ext/aiohttp/client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from aws_xray_sdk.core import xray_recorder
99
from aws_xray_sdk.core.models import http
1010
from aws_xray_sdk.core.utils import stacktrace
11-
from aws_xray_sdk.ext.util import inject_trace_header, strip_url
11+
from aws_xray_sdk.ext.util import inject_trace_header, strip_url, get_hostname
1212

1313
# All aiohttp calls will entail outgoing HTTP requests, only in some ad-hoc
1414
# exceptions the namespace will be flip back to local.
@@ -22,7 +22,7 @@
2222

2323

2424
async def begin_subsegment(session, trace_config_ctx, params):
25-
name = trace_config_ctx.name if trace_config_ctx.name else strip_url(str(params.url))
25+
name = trace_config_ctx.name if trace_config_ctx.name else get_hostname(str(params.url))
2626
subsegment = xray_recorder.begin_subsegment(name, REMOTE_NAMESPACE)
2727

2828
# No-op if subsegment is `None` due to `LOG_ERROR`.
@@ -31,7 +31,7 @@ async def begin_subsegment(session, trace_config_ctx, params):
3131
else:
3232
trace_config_ctx.give_up = False
3333
subsegment.put_http_meta(http.METHOD, params.method)
34-
subsegment.put_http_meta(http.URL, params.url.human_repr())
34+
subsegment.put_http_meta(http.URL, strip_url(params.url.human_repr()))
3535
inject_trace_header(params.headers, subsegment)
3636

3737

aws_xray_sdk/ext/httplib/patch.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from aws_xray_sdk.core.models import http
99
from aws_xray_sdk.core.exceptions.exceptions import SegmentNotFoundException
1010
from aws_xray_sdk.core.patcher import _PATCHED_MODULES
11-
from aws_xray_sdk.ext.util import inject_trace_header, strip_url, unwrap
11+
from aws_xray_sdk.ext.util import inject_trace_header, strip_url, unwrap, get_hostname
1212

1313
if sys.version_info >= (3, 0, 0):
1414
PY2 = False
@@ -33,7 +33,7 @@ def http_response_processor(wrapped, instance, args, kwargs, return_value,
3333
return
3434

3535
subsegment.put_http_meta(http.METHOD, xray_data.method)
36-
subsegment.put_http_meta(http.URL, xray_data.url)
36+
subsegment.put_http_meta(http.URL, strip_url(xray_data.url))
3737

3838
if return_value:
3939
subsegment.put_http_meta(http.STATUS, return_value.status)
@@ -57,7 +57,7 @@ def _xray_traced_http_getresponse(wrapped, instance, args, kwargs):
5757

5858
return xray_recorder.record_subsegment(
5959
wrapped, instance, args, kwargs,
60-
name=strip_url(xray_data.url),
60+
name=get_hostname(xray_data.url),
6161
namespace='remote',
6262
meta_processor=http_response_processor,
6363
)
@@ -71,7 +71,7 @@ def http_send_request_processor(wrapped, instance, args, kwargs, return_value,
7171

7272
# we don't delete the attr as we can have multiple reads
7373
subsegment.put_http_meta(http.METHOD, xray_data.method)
74-
subsegment.put_http_meta(http.URL, xray_data.url)
74+
subsegment.put_http_meta(http.URL, strip_url(xray_data.url))
7575

7676
if exception:
7777
subsegment.add_exception(exception, stack)
@@ -111,7 +111,7 @@ def decompose_args(method, url, body, headers, encode_chunked=False):
111111
# we add a segment here in case connect fails
112112
return xray_recorder.record_subsegment(
113113
wrapped, instance, args, kwargs,
114-
name=strip_url(xray_data.url),
114+
name=get_hostname(xray_data.url),
115115
namespace='remote',
116116
meta_processor=http_send_request_processor
117117
)
@@ -127,7 +127,7 @@ def http_read_processor(wrapped, instance, args, kwargs, return_value,
127127

128128
# we don't delete the attr as we can have multiple reads
129129
subsegment.put_http_meta(http.METHOD, xray_data.method)
130-
subsegment.put_http_meta(http.URL, xray_data.url)
130+
subsegment.put_http_meta(http.URL, strip_url(xray_data.url))
131131
subsegment.put_http_meta(http.STATUS, instance.status)
132132

133133
if exception:
@@ -141,7 +141,7 @@ def _xray_traced_http_client_read(wrapped, instance, args, kwargs):
141141

142142
return xray_recorder.record_subsegment(
143143
wrapped, instance, args, kwargs,
144-
name=strip_url(xray_data.url),
144+
name=get_hostname(xray_data.url),
145145
namespace='remote',
146146
meta_processor=http_read_processor
147147
)

aws_xray_sdk/ext/requests/patch.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from aws_xray_sdk.core import xray_recorder
44
from aws_xray_sdk.core.models import http
5-
from aws_xray_sdk.ext.util import inject_trace_header, strip_url
5+
from aws_xray_sdk.ext.util import inject_trace_header, strip_url, get_hostname
66

77

88
def patch():
@@ -26,7 +26,7 @@ def _xray_traced_requests(wrapped, instance, args, kwargs):
2626

2727
return xray_recorder.record_subsegment(
2828
wrapped, instance, args, kwargs,
29-
name=strip_url(url),
29+
name=get_hostname(url),
3030
namespace='remote',
3131
meta_processor=requests_processor,
3232
)
@@ -48,7 +48,7 @@ def requests_processor(wrapped, instance, args, kwargs,
4848
url = kwargs.get('url') or args[1]
4949

5050
subsegment.put_http_meta(http.METHOD, method)
51-
subsegment.put_http_meta(http.URL, url)
51+
subsegment.put_http_meta(http.URL, strip_url(url))
5252

5353
if return_value is not None:
5454
subsegment.put_http_meta(http.STATUS, return_value.status_code)

aws_xray_sdk/ext/util.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,17 @@
44
from aws_xray_sdk.core.models import http
55

66
import wrapt
7+
import sys
8+
9+
if sys.version_info.major >= 3: # Python 3 and above
10+
from urllib.parse import urlparse
11+
else: # Python 2 and below
12+
from urlparse import urlparse
713

814

915
first_cap_re = re.compile('(.)([A-Z][a-z]+)')
1016
all_cap_re = re.compile('([a-z0-9])([A-Z])')
17+
UNKNOWN_HOSTNAME = "UNKNOWN HOST"
1118

1219

1320
def inject_trace_header(headers, entity):
@@ -118,6 +125,16 @@ def strip_url(url):
118125
return url.partition('?')[0] if url else url
119126

120127

128+
def get_hostname(url):
129+
if url is None:
130+
return UNKNOWN_HOSTNAME
131+
url_parse = urlparse(url)
132+
hostname = url_parse.hostname
133+
if hostname is None:
134+
return UNKNOWN_HOSTNAME
135+
return hostname if hostname else url # If hostname is none, we return the regular URL; indication of malformed url
136+
137+
121138
def unwrap(obj, attr):
122139
"""
123140
Will unwrap a `wrapt` attribute

tests/ext/aiohttp/test_client.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from aws_xray_sdk.core import xray_recorder
55
from aws_xray_sdk.core.async_context import AsyncContext
66
from aws_xray_sdk.core.exceptions.exceptions import SegmentNotFoundException
7-
from aws_xray_sdk.ext.util import strip_url
7+
from aws_xray_sdk.ext.util import strip_url, get_hostname
88
from aws_xray_sdk.ext.aiohttp.client import aws_xray_trace_config
99
from aws_xray_sdk.ext.aiohttp.client import REMOTE_NAMESPACE, LOCAL_NAMESPACE
1010

@@ -34,11 +34,11 @@ async def test_ok(loop, recorder):
3434
pass
3535

3636
subsegment = xray_recorder.current_segment().subsegments[0]
37-
assert subsegment.name == strip_url(url)
37+
assert subsegment.name == get_hostname(url)
3838
assert subsegment.namespace == REMOTE_NAMESPACE
3939

4040
http_meta = subsegment.http
41-
assert http_meta['request']['url'] == url
41+
assert http_meta['request']['url'] == strip_url(url)
4242
assert http_meta['request']['method'] == 'GET'
4343
assert http_meta['response']['status'] == status_code
4444

@@ -66,11 +66,11 @@ async def test_error(loop, recorder):
6666
pass
6767

6868
subsegment = xray_recorder.current_segment().subsegments[0]
69-
assert subsegment.name == url
69+
assert subsegment.name == get_hostname(url)
7070
assert subsegment.error
7171

7272
http_meta = subsegment.http
73-
assert http_meta['request']['url'] == url
73+
assert http_meta['request']['url'] == strip_url(url)
7474
assert http_meta['request']['method'] == 'POST'
7575
assert http_meta['response']['status'] == status_code
7676

@@ -85,12 +85,12 @@ async def test_throttle(loop, recorder):
8585
pass
8686

8787
subsegment = xray_recorder.current_segment().subsegments[0]
88-
assert subsegment.name == url
88+
assert subsegment.name == get_hostname(url)
8989
assert subsegment.error
9090
assert subsegment.throttle
9191

9292
http_meta = subsegment.http
93-
assert http_meta['request']['url'] == url
93+
assert http_meta['request']['url'] == strip_url(url)
9494
assert http_meta['request']['method'] == 'HEAD'
9595
assert http_meta['response']['status'] == status_code
9696

@@ -105,11 +105,11 @@ async def test_fault(loop, recorder):
105105
pass
106106

107107
subsegment = xray_recorder.current_segment().subsegments[0]
108-
assert subsegment.name == url
108+
assert subsegment.name == get_hostname(url)
109109
assert subsegment.fault
110110

111111
http_meta = subsegment.http
112-
assert http_meta['request']['url'] == url
112+
assert http_meta['request']['url'] == strip_url(url)
113113
assert http_meta['request']['method'] == 'PUT'
114114
assert http_meta['response']['status'] == status_code
115115

tests/ext/httplib/test_httplib.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from aws_xray_sdk.core import patch
55
from aws_xray_sdk.core import xray_recorder
66
from aws_xray_sdk.core.context import Context
7-
from aws_xray_sdk.ext.util import strip_url
7+
from aws_xray_sdk.ext.util import strip_url, get_hostname
88

99
if sys.version_info >= (3, 0, 0):
1010
import http.client as httplib
@@ -57,10 +57,10 @@ def test_ok():
5757
url = 'https://{}/status/{}?foo=bar&baz=foo'.format(BASE_URL, status_code)
5858
_do_req(url)
5959
subsegment = xray_recorder.current_segment().subsegments[1]
60-
assert subsegment.name == strip_url(url)
60+
assert subsegment.name == get_hostname(url)
6161

6262
http_meta = subsegment.http
63-
assert http_meta['request']['url'] == url
63+
assert http_meta['request']['url'] == strip_url(url)
6464
assert http_meta['request']['method'].upper() == 'GET'
6565
assert http_meta['response']['status'] == status_code
6666

@@ -70,11 +70,11 @@ def test_error():
7070
url = 'https://{}/status/{}'.format(BASE_URL, status_code)
7171
_do_req(url, 'POST')
7272
subsegment = xray_recorder.current_segment().subsegments[1]
73-
assert subsegment.name == url
73+
assert subsegment.name == get_hostname(url)
7474
assert subsegment.error
7575

7676
http_meta = subsegment.http
77-
assert http_meta['request']['url'] == url
77+
assert http_meta['request']['url'] == strip_url(url)
7878
assert http_meta['request']['method'].upper() == 'POST'
7979
assert http_meta['response']['status'] == status_code
8080

@@ -84,12 +84,12 @@ def test_throttle():
8484
url = 'https://{}/status/{}'.format(BASE_URL, status_code)
8585
_do_req(url, 'HEAD')
8686
subsegment = xray_recorder.current_segment().subsegments[1]
87-
assert subsegment.name == url
87+
assert subsegment.name == get_hostname(url)
8888
assert subsegment.error
8989
assert subsegment.throttle
9090

9191
http_meta = subsegment.http
92-
assert http_meta['request']['url'] == url
92+
assert http_meta['request']['url'] == strip_url(url)
9393
assert http_meta['request']['method'].upper() == 'HEAD'
9494
assert http_meta['response']['status'] == status_code
9595

@@ -99,11 +99,11 @@ def test_fault():
9999
url = 'https://{}/status/{}'.format(BASE_URL, status_code)
100100
_do_req(url, 'PUT')
101101
subsegment = xray_recorder.current_segment().subsegments[1]
102-
assert subsegment.name == url
102+
assert subsegment.name == get_hostname(url)
103103
assert subsegment.fault
104104

105105
http_meta = subsegment.http
106-
assert http_meta['request']['url'] == url
106+
assert http_meta['request']['url'] == strip_url(url)
107107
assert http_meta['request']['method'].upper() == 'PUT'
108108
assert http_meta['response']['status'] == status_code
109109

@@ -126,7 +126,7 @@ def test_correct_identify_http():
126126
url = 'http://{}/status/{}?foo=bar&baz=foo'.format(BASE_URL, status_code)
127127
_do_req(url, use_https=False)
128128
subsegment = xray_recorder.current_segment().subsegments[0]
129-
assert subsegment.name == strip_url(url)
129+
assert subsegment.name == get_hostname(url)
130130

131131
http_meta = subsegment.http
132132
assert http_meta['request']['url'].split(":")[0] == 'http'
@@ -137,7 +137,7 @@ def test_correct_identify_https():
137137
url = 'https://{}/status/{}?foo=bar&baz=foo'.format(BASE_URL, status_code)
138138
_do_req(url, use_https=True)
139139
subsegment = xray_recorder.current_segment().subsegments[0]
140-
assert subsegment.name == strip_url(url)
140+
assert subsegment.name == get_hostname(url)
141141

142142
https_meta = subsegment.http
143143
assert https_meta['request']['url'].split(":")[0] == 'https'

0 commit comments

Comments
 (0)