Skip to content
This repository was archived by the owner on Sep 17, 2025. It is now read-only.

Commit 403ee06

Browse files
authored
Add retry for system tests (#67)
1 parent d63db22 commit 403ee06

3 files changed

Lines changed: 230 additions & 137 deletions

File tree

trace/requirements-test.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ psycopg2==2.7.3.1
77
pymysql==0.7.11
88
pytest==3.2.2
99
pytest-cov==2.5.1
10+
retrying==1.3.3
1011
SQLAlchemy==1.1.14
1112
webapp2==2.5.2
1213
WebOb==1.7.3

trace/tests/system/django/django_system_test.py

Lines changed: 113 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,18 @@
2121
import time
2222
import uuid
2323

24+
from retrying import retry
25+
2426
import unittest
2527

2628
PROJECT = os.environ.get('GCLOUD_PROJECT_PYTHON')
2729

2830
HOST_PORT = 'localhost:8000'
2931
BASE_URL = 'http://localhost:8000/'
3032

33+
RETRY_WAIT_PERIOD = 8000 # Wait 8 seconds between each retry
34+
RETRY_MAX_ATTEMPT = 10 # Retry 10 times
35+
3136

3237
def wait_app_to_start():
3338
"""Wait the application to start running."""
@@ -92,114 +97,154 @@ def test_django_request_trace(self):
9297
BASE_URL,
9398
headers=self.headers_trace)
9499

95-
time.sleep(5)
100+
@retry(wait_fixed=RETRY_WAIT_PERIOD, stop_max_attempt_number=RETRY_MAX_ATTEMPT)
101+
def test_with_retry(self):
102+
trace = self.client.get_trace(trace_id=self.trace_id)
103+
spans = trace.get('spans')
96104

97-
trace = self.client.get_trace(trace_id=self.trace_id)
98-
spans = trace.get('spans')
105+
self.assertEqual(trace.get('projectId'), PROJECT)
106+
self.assertEqual(trace.get('traceId'), str(self.trace_id))
107+
self.assertEqual(len(spans), 1)
108+
self.assertEqual(
109+
spans[0].get('parentSpanId'),
110+
str(self.span_id))
99111

100-
self.assertEqual(trace.get('projectId'), PROJECT)
101-
self.assertEqual(trace.get('traceId'), str(self.trace_id))
102-
self.assertEqual(len(spans), 1)
103-
self.assertEqual(
104-
spans[0].get('parentSpanId'),
105-
str(self.span_id))
112+
for span in spans:
113+
labels = span.get('labels')
114+
self.assertEqual(labels.get('/http/status_code'), '200')
106115

107-
for span in spans:
108-
labels = span.get('labels')
109-
self.assertEqual(labels.get('/http/status_code'), '200')
116+
test_with_retry(self)
110117

111118
def test_mysql_trace(self):
112119
requests.get(
113120
'{}mysql'.format(BASE_URL),
114121
headers=self.headers_trace)
115122

116-
time.sleep(5)
123+
@retry(wait_fixed=RETRY_WAIT_PERIOD, stop_max_attempt_number=RETRY_MAX_ATTEMPT)
124+
def test_with_retry(self):
125+
trace = self.client.get_trace(trace_id=self.trace_id)
126+
spans = trace.get('spans')
127+
128+
self.assertEqual(trace.get('projectId'), PROJECT)
129+
self.assertEqual(trace.get('traceId'), str(self.trace_id))
117130

118-
trace = self.client.get_trace(trace_id=self.trace_id)
119-
spans = trace.get('spans')
131+
# Should have 2 spans, one for django request, one for mysql query
132+
self.assertEqual(len(spans), 2)
133+
self.assertEqual(
134+
spans[0].get('parentSpanId'),
135+
str(self.span_id))
120136

121-
self.assertEqual(trace.get('projectId'), PROJECT)
122-
self.assertEqual(trace.get('traceId'), str(self.trace_id))
137+
request_succeeded = False
123138

124-
# Should have 2 spans, one for django request, one for mysql query
125-
self.assertEqual(len(spans), 2)
126-
self.assertEqual(
127-
spans[0].get('parentSpanId'),
128-
str(self.span_id))
139+
for span in spans:
140+
labels = span.get('labels')
141+
if '/http/status_code' in labels.keys():
142+
self.assertEqual(labels.get('/http/status_code'), '200')
143+
request_succeeded = True
129144

130-
for span in spans:
131-
labels = span.get('labels')
132-
self.assertEqual(labels.get('/http/status_code'), '200')
145+
if span.get('name') == '[mysql.query]SELECT 2*3':
146+
self.assertEqual(labels.get('mysql/cursor/method/name'), 'execute')
147+
self.assertEqual(labels.get('mysql/query'), 'SELECT 2*3')
133148

134-
if span.get('name') == '[mysql.query]SELECT 2*3':
135-
self.assertEqual(labels.get('mysql/cursor/method/name'), 'execute')
136-
self.assertEqual(labels.get('mysql/query'), 'SELECT 2*3')
149+
self.assertTrue(request_succeeded)
150+
151+
test_with_retry(self)
137152

138153
def test_postgresql_trace(self):
139154
requests.get(
140155
'{}postgresql'.format(BASE_URL),
141156
headers=self.headers_trace)
142157

143-
time.sleep(5)
158+
@retry(wait_fixed=RETRY_WAIT_PERIOD, stop_max_attempt_number=RETRY_MAX_ATTEMPT)
159+
def test_with_retry(self):
160+
trace = self.client.get_trace(trace_id=self.trace_id)
161+
spans = trace.get('spans')
162+
163+
self.assertEqual(trace.get('projectId'), PROJECT)
164+
self.assertEqual(trace.get('traceId'), str(self.trace_id))
165+
166+
# Should have 2 spans, one for django request, one for postgresql query
167+
self.assertEqual(len(trace.get('spans')), 2)
168+
self.assertEqual(
169+
spans[0].get('parentSpanId'),
170+
str(self.span_id))
144171

145-
trace = self.client.get_trace(trace_id=self.trace_id)
146-
spans = trace.get('spans')
172+
request_succeeded = False
147173

148-
self.assertEqual(trace.get('projectId'), PROJECT)
149-
self.assertEqual(trace.get('traceId'), str(self.trace_id))
174+
for span in spans:
175+
labels = span.get('labels')
176+
if '/http/status_code' in labels.keys():
177+
self.assertEqual(labels.get('/http/status_code'), '200')
178+
request_succeeded = True
150179

151-
# Should have 2 spans, one for django request, one for postgresql query
152-
self.assertEqual(len(trace.get('spans')), 2)
153-
self.assertEqual(
154-
spans[0].get('parentSpanId'),
155-
str(self.span_id))
180+
if span.get('name') == '[postgresql.query]SELECT 2*3':
181+
self.assertEqual(labels.get('postgresql/cursor/method/name'), 'execute')
182+
self.assertEqual(labels.get('postgresql/query'), 'SELECT 2*3')
156183

157-
for span in spans:
158-
labels = span.get('labels')
159-
self.assertEqual(labels.get('/http/status_code'), '200')
184+
self.assertTrue(request_succeeded)
160185

161-
if span.get('name') == '[postgresql.query]SELECT 2*3':
162-
self.assertEqual(labels.get('postgresql/cursor/method/name'), 'execute')
163-
self.assertEqual(labels.get('postgresql/query'), 'SELECT 2*3')
186+
test_with_retry(self)
164187

165188
def test_sqlalchemy_mysql_trace(self):
166189
requests.get(
167190
'{}sqlalchemy_mysql'.format(BASE_URL),
168191
headers=self.headers_trace)
169192

170-
time.sleep(5)
193+
@retry(wait_fixed=RETRY_WAIT_PERIOD, stop_max_attempt_number=RETRY_MAX_ATTEMPT)
194+
def test_with_retry(self):
195+
trace = self.client.get_trace(trace_id=self.trace_id)
196+
spans = trace.get('spans')
171197

172-
trace = self.client.get_trace(trace_id=self.trace_id)
173-
spans = trace.get('spans')
198+
self.assertEqual(trace.get('projectId'), PROJECT)
199+
self.assertEqual(trace.get('traceId'), str(self.trace_id))
200+
self.assertNotEqual(len(trace.get('spans')), 0)
174201

175-
self.assertEqual(trace.get('projectId'), PROJECT)
176-
self.assertEqual(trace.get('traceId'), str(self.trace_id))
177-
self.assertNotEqual(len(trace.get('spans')), 0)
178-
self.assertEqual(
179-
trace.get('spans')[0].get('parentSpanId'),
180-
str(self.span_id))
202+
has_parent_span = False
203+
request_succeeded = False
181204

182-
for span in spans:
183-
labels = span.get('labels')
184-
self.assertEqual(labels.get('/http/status_code'), '200')
205+
for span in spans:
206+
labels = span.get('labels')
207+
if '/http/status_code' in labels.keys():
208+
self.assertEqual(labels.get('/http/status_code'), '200')
209+
request_succeeded = True
210+
211+
if span.get('name') == 'app.views.sqlalchemy_mysql_trace':
212+
self.assertEqual(span.get('parentSpanId'), str(self.span_id))
213+
has_parent_span = True
214+
215+
self.assertTrue(has_parent_span)
216+
self.assertTrue(request_succeeded)
217+
218+
test_with_retry(self)
185219

186220
def test_sqlalchemy_postgresql_trace(self):
187221
requests.get(
188222
'{}sqlalchemy_postgresql'.format(BASE_URL),
189223
headers=self.headers_trace)
190224

191-
time.sleep(5)
225+
@retry(wait_fixed=RETRY_WAIT_PERIOD, stop_max_attempt_number=RETRY_MAX_ATTEMPT)
226+
def test_with_retry(self):
227+
trace = self.client.get_trace(trace_id=self.trace_id)
228+
spans = trace.get('spans')
229+
230+
self.assertEqual(trace.get('projectId'), PROJECT)
231+
self.assertEqual(trace.get('traceId'), str(self.trace_id))
232+
self.assertNotEqual(len(trace.get('spans')), 0)
233+
234+
has_parent_span = False
235+
request_succeeded = False
236+
237+
for span in spans:
238+
labels = span.get('labels')
239+
if '/http/status_code' in labels.keys():
240+
self.assertEqual(labels.get('/http/status_code'), '200')
241+
request_succeeded = True
192242

193-
trace = self.client.get_trace(trace_id=self.trace_id)
194-
spans = trace.get('spans')
243+
if span.get('name') == 'app.views.sqlalchemy_postgresql_trace':
244+
self.assertEqual(span.get('parentSpanId'), str(self.span_id))
245+
has_parent_span = True
195246

196-
self.assertEqual(trace.get('projectId'), PROJECT)
197-
self.assertEqual(trace.get('traceId'), str(self.trace_id))
198-
self.assertNotEqual(len(trace.get('spans')), 0)
199-
self.assertEqual(
200-
trace.get('spans')[0].get('parentSpanId'),
201-
str(self.span_id))
247+
self.assertTrue(has_parent_span)
248+
self.assertTrue(request_succeeded)
202249

203-
for span in spans:
204-
labels = span.get('labels')
205-
self.assertEqual(labels.get('/http/status_code'), '200')
250+
test_with_retry(self)

0 commit comments

Comments
 (0)