Skip to content

Commit 9162cf6

Browse files
committed
Change to use itertools to traverse spans
1 parent 709b7dd commit 9162cf6

File tree

4 files changed

+64
-94
lines changed

4 files changed

+64
-94
lines changed

trace/google/cloud/trace/trace.py

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ def send(self):
9292
"""
9393
spans_list = []
9494
for root_span in self.spans:
95-
span_tree = _traverse_span_tree(root_span)
96-
spans_list.extend(span_tree)
95+
span_tree = list(iter(root_span))
96+
span_tree_json = [format_span_json(span) for span in span_tree]
97+
spans_list.extend(span_tree_json)
9798

9899
if len(spans_list) == 0:
99100
return
@@ -113,34 +114,7 @@ def send(self):
113114
traces=traces,
114115
options=None)
115116

116-
return traces
117-
118-
119-
def _traverse_span_tree(root_span):
120-
"""Helper to traverse the span tree in level order.
121-
122-
:rtype: :class:`~google.cloud.trace.trace_span.TraceSpan`
123-
:param root_span: The root span in a span tree.
124-
125-
:rtype: list
126-
:returns: A list of all the spans in a span tree.
127-
"""
128-
span_list = []
129-
130-
if root_span is None:
131-
return span_list
132-
133-
span_queue = []
134-
span_queue.append(root_span)
135-
136-
while span_queue:
137-
cur_span = span_queue.pop(0)
138-
span_list.append(format_span_json(cur_span))
139-
140-
for child_span in cur_span.children:
141-
span_queue.append(child_span)
142-
143-
return span_list
117+
return spans_list
144118

145119

146120
def generate_trace_id():

trace/google/cloud/trace/trace_span.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from datetime import datetime
1818
from google.cloud.gapic.trace.v1.enums import TraceSpan as Enum
1919

20+
from itertools import chain
2021
import random
2122

2223

@@ -112,6 +113,11 @@ def set_end_time(self):
112113
"""Set the end time for a span."""
113114
self.end_time = datetime.utcnow().isoformat() + 'Z'
114115

116+
def __iter__(self):
117+
for span in chain(*(map(iter, self.children))):
118+
yield span
119+
yield self
120+
115121
def __enter__(self):
116122
self.set_start_time()
117123
return self

trace/tests/unit/test_trace.py

Lines changed: 34 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -65,24 +65,9 @@ def test_start(self):
6565

6666
self.assertEqual(trace.spans, [])
6767

68-
def test_finish_with_empty_span(self):
69-
70-
def patch_traces(traces, project_id=None, options=None):
71-
_patch_traces_called_with = (traces, project_id, options)
72-
return _patch_traces_called_with
73-
74-
client = mock.Mock(project=self.project, spec=['project'])
75-
client.patch_traces = patch_traces
76-
trace = self._make_one(client=client)
77-
78-
with trace:
79-
trace.spans = [None]
80-
self.assertEqual(trace.spans, [None])
81-
82-
self.assertEqual(trace.spans, [])
83-
8468
def test_finish_with_valid_span(self):
8569
from google.cloud.gapic.trace.v1.enums import TraceSpan as Enum
70+
from google.cloud.trace.trace_span import TraceSpan
8671

8772
def patch_traces(traces, project_id=None, options=None):
8873
_patch_traces_called_with = (traces, project_id, options)
@@ -98,22 +83,16 @@ def patch_traces(traces, project_id=None, options=None):
9883
start_time = '2017-06-25'
9984
end_time = '2017-06-26'
10085

101-
span = mock.Mock(name=span_name,
102-
kind=kind,
103-
parent_span_id=None,
104-
span_id=span_id,
105-
start_time=start_time,
106-
end_time=end_time,
107-
labels=None,
108-
children=[],
109-
spec=['name',
110-
'kind',
111-
'parent_span_id',
112-
'span_id',
113-
'start_time',
114-
'end_time',
115-
'labels',
116-
'children'])
86+
span = mock.Mock(spec=TraceSpan)
87+
span.name = span_name
88+
span.kind = kind
89+
span.parent_span_id = None
90+
span.span_id = span_id
91+
span.start_time = start_time
92+
span.end_time = end_time
93+
span.labels = None
94+
span.children = []
95+
span.__iter__ = mock.Mock(return_value=iter([span]))
11796

11897
with trace:
11998
trace.spans = [span]
@@ -153,6 +132,7 @@ def test_send_without_spans(self):
153132
def test_send_with_spans(self):
154133
from google.cloud.gapic.trace.v1.enums import TraceSpan as Enum
155134
from google.cloud.trace.client import Client
135+
from google.cloud.trace.trace_span import TraceSpan
156136

157137
client = mock.Mock(spec=Client)
158138
client.project = self.project
@@ -170,38 +150,28 @@ def test_send_with_spans(self):
170150
'/component': 'HTTP load balancer',
171151
}
172152

173-
child_span = mock.Mock(name=child_span_name,
174-
kind=kind,
175-
parent_span_id=root_span_id,
176-
span_id=child_span_id,
177-
start_time=start_time,
178-
end_time=end_time,
179-
labels=labels,
180-
children=[],
181-
spec=['name',
182-
'kind',
183-
'parent_span_id',
184-
'span_id',
185-
'start_time',
186-
'end_time',
187-
'labels',
188-
'children'])
189-
root_span = mock.Mock(name=root_span_name,
190-
kind=kind,
191-
parent_span_id=None,
192-
span_id=root_span_id,
193-
start_time=start_time,
194-
end_time=end_time,
195-
labels=None,
196-
children=[child_span],
197-
spec=['name',
198-
'kind',
199-
'parent_span_id',
200-
'span_id',
201-
'start_time',
202-
'end_time',
203-
'labels',
204-
'children'])
153+
child_span = mock.Mock(spec=TraceSpan)
154+
child_span.name = child_span_name
155+
child_span.kind = kind
156+
child_span.parent_span_id = root_span_id
157+
child_span.span_id = child_span_id
158+
child_span.start_time = start_time
159+
child_span.end_time = end_time
160+
child_span.labels = labels
161+
child_span.children = []
162+
child_span.__iter__ = mock.Mock(return_value=iter([child_span]))
163+
164+
root_span = mock.Mock(spec=TraceSpan)
165+
root_span.name = root_span_name
166+
root_span.kind = kind
167+
root_span.parent_span_id = None
168+
root_span.span_id = root_span_id
169+
root_span.start_time = start_time
170+
root_span.end_time = end_time
171+
root_span.labels = None
172+
root_span.children = []
173+
root_span.__iter__ = mock.Mock(
174+
return_value=iter([root_span, child_span]))
205175

206176
child_span_json = {
207177
'name': child_span.name,

trace/tests/unit/test_trace_span.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,23 @@ def test_set_end_time(self):
131131

132132
span.set_end_time()
133133
self.assertIsNotNone(span.end_time)
134+
135+
def test___iter__(self):
136+
root_span_name = 'root_span_name'
137+
child1_span_name = 'child1_span_name'
138+
child2_span_name = 'child2_span_name'
139+
child1_child1_span_name = 'child1_child1_span_name'
140+
141+
root_span = self._make_one(root_span_name)
142+
child1_span = self._make_one(child1_span_name)
143+
child2_span = self._make_one(child2_span_name)
144+
child1_child1_span = self._make_one(child1_child1_span_name)
145+
146+
child1_span._child_spans.append(child1_child1_span)
147+
root_span._child_spans.extend([child1_span, child2_span])
148+
149+
span_iter_list = list(iter(root_span))
150+
151+
self.assertEqual(
152+
span_iter_list,
153+
[child1_child1_span, child1_span, child2_span, root_span])

0 commit comments

Comments
 (0)