Skip to content

Commit b5ed104

Browse files
authored
Capture and scrub outgoing http query params (#115)
* Capture and scrub outgoing http query params * Update tests to support older python dict ordering
1 parent e943940 commit b5ed104

File tree

2 files changed

+113
-4
lines changed

2 files changed

+113
-4
lines changed

instana/instrumentation/urllib3.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,24 @@ def collect(instance, args, kwargs):
1515
""" Build and return a fully qualified URL for this request """
1616
try:
1717
kvs = {}
18-
1918
kvs['host'] = instance.host
2019
kvs['port'] = instance.port
2120

2221
if args is not None and len(args) is 2:
2322
kvs['method'] = args[0]
24-
kvs['path'] = strip_secrets(args[1], agent.secrets_matcher, agent.secrets_list)
23+
kvs['path'] = args[1]
2524
else:
2625
kvs['method'] = kwargs.get('method')
2726
kvs['path'] = kwargs.get('path')
2827
if kvs['path'] is None:
2928
kvs['path'] = kwargs.get('url')
3029

31-
# Strip any secrets from potential query params
32-
kvs['path'] = strip_secrets(kvs['path'], agent.secrets_matcher, agent.secrets_list)
30+
# Strip any secrets from potential query params
31+
if '?' in kvs['path']:
32+
parts = kvs['path'].split('?')
33+
kvs['path'] = parts[0]
34+
if len(parts) is 2:
35+
kvs['query'] = strip_secrets(parts[1], agent.secrets_matcher, agent.secrets_list)
3336

3437
if type(instance) is urllib3.connectionpool.HTTPSConnectionPool:
3538
kvs['url'] = 'https://%s:%d%s' % (kvs['host'], kvs['port'], kvs['path'])
@@ -54,6 +57,8 @@ def urlopen_with_instana(wrapped, instance, args, kwargs):
5457
kvs = collect(instance, args, kwargs)
5558
if 'url' in kvs:
5659
scope.span.set_tag(ext.HTTP_URL, kvs['url'])
60+
if 'query' in kvs:
61+
scope.span.set_tag("http.params", kvs['query'])
5762
if 'method' in kvs:
5863
scope.span.set_tag(ext.HTTP_METHOD, kvs['method'])
5964

tests/test_urllib3.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,110 @@ def test_get_request(self):
7777
self.assertTrue(type(urllib3_span.stack) is list)
7878
self.assertTrue(len(urllib3_span.stack) > 1)
7979

80+
def test_get_request_with_query(self):
81+
with tracer.start_active_span('test'):
82+
r = self.http.request('GET', 'http://127.0.0.1:5000/?one=1&two=2')
83+
84+
spans = self.recorder.queued_spans()
85+
self.assertEqual(3, len(spans))
86+
87+
wsgi_span = spans[0]
88+
urllib3_span = spans[1]
89+
test_span = spans[2]
90+
91+
assert(r)
92+
self.assertEqual(200, r.status)
93+
self.assertIsNone(tracer.active_span)
94+
95+
# Same traceId
96+
self.assertEqual(test_span.t, urllib3_span.t)
97+
self.assertEqual(urllib3_span.t, wsgi_span.t)
98+
99+
# Parent relationships
100+
self.assertEqual(urllib3_span.p, test_span.s)
101+
self.assertEqual(wsgi_span.p, urllib3_span.s)
102+
103+
# Error logging
104+
self.assertFalse(test_span.error)
105+
self.assertIsNone(test_span.ec)
106+
self.assertFalse(urllib3_span.error)
107+
self.assertIsNone(urllib3_span.ec)
108+
self.assertFalse(wsgi_span.error)
109+
self.assertIsNone(wsgi_span.ec)
110+
111+
# wsgi
112+
self.assertEqual("wsgi", wsgi_span.n)
113+
self.assertEqual('127.0.0.1:5000', wsgi_span.data.http.host)
114+
self.assertEqual('/', wsgi_span.data.http.url)
115+
self.assertEqual('GET', wsgi_span.data.http.method)
116+
self.assertEqual('200', wsgi_span.data.http.status)
117+
self.assertIsNone(wsgi_span.data.http.error)
118+
self.assertIsNotNone(wsgi_span.stack)
119+
self.assertEqual(2, len(wsgi_span.stack))
120+
121+
# urllib3
122+
self.assertEqual("test", test_span.data.sdk.name)
123+
self.assertEqual("urllib3", urllib3_span.n)
124+
self.assertEqual(200, urllib3_span.data.http.status)
125+
self.assertEqual("http://127.0.0.1:5000/", urllib3_span.data.http.url)
126+
self.assertTrue(urllib3_span.data.http.params in ["one=1&two=2", "two=2&one=1"] )
127+
self.assertEqual("GET", urllib3_span.data.http.method)
128+
self.assertIsNotNone(urllib3_span.stack)
129+
self.assertTrue(type(urllib3_span.stack) is list)
130+
self.assertTrue(len(urllib3_span.stack) > 1)
131+
132+
def test_get_request_with_alt_query(self):
133+
with tracer.start_active_span('test'):
134+
r = self.http.request('GET', 'http://127.0.0.1:5000/', fields={'one': '1', 'two': 2})
135+
136+
spans = self.recorder.queued_spans()
137+
self.assertEqual(3, len(spans))
138+
139+
wsgi_span = spans[0]
140+
urllib3_span = spans[1]
141+
test_span = spans[2]
142+
143+
assert(r)
144+
self.assertEqual(200, r.status)
145+
self.assertIsNone(tracer.active_span)
146+
147+
# Same traceId
148+
self.assertEqual(test_span.t, urllib3_span.t)
149+
self.assertEqual(urllib3_span.t, wsgi_span.t)
150+
151+
# Parent relationships
152+
self.assertEqual(urllib3_span.p, test_span.s)
153+
self.assertEqual(wsgi_span.p, urllib3_span.s)
154+
155+
# Error logging
156+
self.assertFalse(test_span.error)
157+
self.assertIsNone(test_span.ec)
158+
self.assertFalse(urllib3_span.error)
159+
self.assertIsNone(urllib3_span.ec)
160+
self.assertFalse(wsgi_span.error)
161+
self.assertIsNone(wsgi_span.ec)
162+
163+
# wsgi
164+
self.assertEqual("wsgi", wsgi_span.n)
165+
self.assertEqual('127.0.0.1:5000', wsgi_span.data.http.host)
166+
self.assertEqual('/', wsgi_span.data.http.url)
167+
self.assertEqual('GET', wsgi_span.data.http.method)
168+
self.assertEqual('200', wsgi_span.data.http.status)
169+
self.assertIsNone(wsgi_span.data.http.error)
170+
self.assertIsNotNone(wsgi_span.stack)
171+
self.assertEqual(2, len(wsgi_span.stack))
172+
173+
# urllib3
174+
self.assertEqual("test", test_span.data.sdk.name)
175+
self.assertEqual("urllib3", urllib3_span.n)
176+
self.assertEqual(200, urllib3_span.data.http.status)
177+
self.assertEqual("http://127.0.0.1:5000/", urllib3_span.data.http.url)
178+
self.assertTrue(urllib3_span.data.http.params in ["one=1&two=2", "two=2&one=1"] )
179+
self.assertEqual("GET", urllib3_span.data.http.method)
180+
self.assertIsNotNone(urllib3_span.stack)
181+
self.assertTrue(type(urllib3_span.stack) is list)
182+
self.assertTrue(len(urllib3_span.stack) > 1)
183+
80184
def test_put_request(self):
81185
with tracer.start_active_span('test'):
82186
r = self.http.request('PUT', 'http://127.0.0.1:5000/notfound')

0 commit comments

Comments
 (0)