Skip to content

Commit cc57aac

Browse files
authored
Improve reliability of tests (#643)
* Run tests on Windows in Github Actions * core sha update * format code * fix ci yaml * rebase * lint * Try without win+py3.6 fix * Try without win+py3.6 fix * Improve test reliability Update some tests to use more deterministic methods of testing in memory spans. This helps the core repo pass tests after adding Windows to CI matrix.
1 parent c279ee5 commit cc57aac

6 files changed

Lines changed: 61 additions & 46 deletions

File tree

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
- 'release/*'
77
pull_request:
88
env:
9-
CORE_REPO_SHA: 9dc17e33bc083e38c1fd55b8ed6787caba8f54fe
9+
CORE_REPO_SHA: c49ad57bfe35cfc69bfa863d74058ca9bec55fc3
1010

1111
jobs:
1212
build:

exporter/opentelemetry-exporter-datadog/tests/test_datadog_exporter.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414

1515
import itertools
1616
import logging
17+
import sys
1718
import time
1819
import unittest
1920
from unittest import mock
2021

2122
from ddtrace.internal.writer import AgentWriter
2223
from flaky import flaky
24+
from pytest import mark
2325

2426
from opentelemetry import trace as trace_api
2527
from opentelemetry.context import Context
@@ -469,6 +471,9 @@ def test_span_processor_dropped_spans(self):
469471
self.assertEqual(len(datadog_spans), 128)
470472
tracer_provider.shutdown()
471473

474+
@mark.skipif(
475+
sys.platform == "win32", reason="unreliable test on windows",
476+
)
472477
def test_span_processor_scheduled_delay(self):
473478
"""Test that spans are exported each schedule_delay_millis"""
474479
delay = 300

instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_instrumentation.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414
import io
1515
import json
16+
import sys
1617
import zipfile
1718
from unittest.mock import Mock, patch
1819

@@ -30,6 +31,7 @@
3031
mock_sts,
3132
mock_xray,
3233
)
34+
from pytest import mark
3335

3436
from opentelemetry import trace as trace_api
3537
from opentelemetry.context import attach, detach, set_value
@@ -128,12 +130,13 @@ def test_s3_client(self):
128130
s3.list_buckets()
129131
s3.list_buckets()
130132

131-
spans = self.memory_exporter.get_finished_spans()
133+
spans = self.get_finished_spans()
132134
assert spans
133-
span = spans[0]
134135
self.assertEqual(len(spans), 2)
136+
137+
buckets_span = spans.by_attr("aws.operation", "ListBuckets")
135138
self.assertSpanHasAttributes(
136-
span,
139+
buckets_span,
137140
{
138141
"aws.operation": "ListBuckets",
139142
"aws.region": "us-west-2",
@@ -144,22 +147,21 @@ def test_s3_client(self):
144147
)
145148

146149
# testing for span error
147-
self.memory_exporter.get_finished_spans()
148150
with self.assertRaises(ParamValidationError):
149151
s3.list_objects(bucket="mybucket")
150-
spans = self.memory_exporter.get_finished_spans()
152+
spans = self.get_finished_spans()
151153
assert spans
152-
span = spans[2]
154+
objects_span = spans.by_attr("aws.operation", "ListObjects")
153155
self.assertSpanHasAttributes(
154-
span,
156+
objects_span,
155157
{
156158
"aws.operation": "ListObjects",
157159
"aws.region": "us-west-2",
158160
"aws.service": "s3",
159161
},
160162
)
161163
self.assertIs(
162-
span.status.status_code, trace_api.StatusCode.ERROR,
164+
objects_span.status.status_code, trace_api.StatusCode.ERROR,
163165
)
164166

165167
# Comment test for issue 1088
@@ -172,10 +174,11 @@ def test_s3_put(self):
172174
s3.put_object(**params)
173175
s3.get_object(Bucket="mybucket", Key="foo")
174176

175-
spans = self.memory_exporter.get_finished_spans()
177+
spans = self.get_finished_spans()
176178
assert spans
177179
self.assertEqual(len(spans), 3)
178-
create_span = spans[0]
180+
181+
create_span = spans.by_attr("aws.operation", "CreateBucket")
179182
self.assertSpanHasAttributes(
180183
create_span,
181184
{
@@ -186,7 +189,8 @@ def test_s3_put(self):
186189
SpanAttributes.HTTP_STATUS_CODE: 200,
187190
},
188191
)
189-
put_span = spans[1]
192+
193+
put_span = spans.by_attr("aws.operation", "PutObject")
190194
self.assertSpanHasAttributes(
191195
put_span,
192196
{
@@ -197,8 +201,10 @@ def test_s3_put(self):
197201
SpanAttributes.HTTP_STATUS_CODE: 200,
198202
},
199203
)
200-
self.assertTrue("params.Body" not in spans[1].attributes.keys())
201-
get_span = spans[2]
204+
self.assertTrue("params.Body" not in put_span.attributes.keys())
205+
206+
get_span = spans.by_attr("aws.operation", "GetObject")
207+
202208
self.assertSpanHasAttributes(
203209
get_span,
204210
{
@@ -359,6 +365,10 @@ def get_role_name(self):
359365
Path="/my-path/",
360366
)["Role"]["Arn"]
361367

368+
@mark.skipif(
369+
sys.platform == "win32",
370+
reason="requires docker and Github CI Windows does not have docker installed by default",
371+
)
362372
@mock_lambda
363373
def test_lambda_invoke_propagation(self):
364374

instrumentation/opentelemetry-instrumentation-elasticsearch/tests/test_elasticsearch.py

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,13 @@ def tearDown(self):
6060
with self.disable_logging():
6161
ElasticsearchInstrumentor().uninstrument()
6262

63-
def get_ordered_finished_spans(self):
64-
return sorted(
65-
self.memory_exporter.get_finished_spans(),
66-
key=lambda s: s.start_time,
67-
)
68-
6963
def test_instrumentor(self, request_mock):
7064
request_mock.return_value = (1, {}, {})
7165

7266
es = Elasticsearch()
7367
es.index(index="sw", doc_type="people", id=1, body={"name": "adam"})
7468

75-
spans_list = self.get_ordered_finished_spans()
69+
spans_list = self.get_finished_spans()
7670
self.assertEqual(len(spans_list), 1)
7771
span = spans_list[0]
7872

@@ -87,7 +81,7 @@ def test_instrumentor(self, request_mock):
8781

8882
es.index(index="sw", doc_type="people", id=1, body={"name": "adam"})
8983

90-
spans_list = self.get_ordered_finished_spans()
84+
spans_list = self.get_finished_spans()
9185
self.assertEqual(len(spans_list), 1)
9286

9387
def test_span_not_recording(self, request_mock):
@@ -127,7 +121,7 @@ def _test_prefix(self, prefix):
127121
es = Elasticsearch()
128122
es.index(index="sw", doc_type="people", id=1, body={"name": "adam"})
129123

130-
spans_list = self.get_ordered_finished_spans()
124+
spans_list = self.get_finished_spans()
131125
self.assertEqual(len(spans_list), 1)
132126
span = spans_list[0]
133127
self.assertTrue(span.name.startswith(prefix))
@@ -141,7 +135,7 @@ def test_result_values(self, request_mock):
141135
es = Elasticsearch()
142136
es.get(index="test-index", doc_type="tweet", id=1)
143137

144-
spans = self.get_ordered_finished_spans()
138+
spans = self.get_finished_spans()
145139

146140
self.assertEqual(1, len(spans))
147141
self.assertEqual("False", spans[0].attributes["elasticsearch.found"])
@@ -169,7 +163,7 @@ def _test_trace_error(self, code, exc):
169163
except Exception: # pylint: disable=broad-except
170164
pass
171165

172-
spans = self.get_ordered_finished_spans()
166+
spans = self.get_finished_spans()
173167
self.assertEqual(1, len(spans))
174168
span = spans[0]
175169
self.assertFalse(span.status.is_ok)
@@ -186,13 +180,13 @@ def test_parent(self, request_mock):
186180
index="sw", doc_type="people", id=1, body={"name": "adam"}
187181
)
188182

189-
spans = self.get_ordered_finished_spans()
183+
spans = self.get_finished_spans()
190184
self.assertEqual(len(spans), 2)
191185

192-
self.assertEqual(spans[0].name, "parent")
193-
self.assertEqual(spans[1].name, "Elasticsearch/sw/people/1")
194-
self.assertIsNotNone(spans[1].parent)
195-
self.assertEqual(spans[1].parent.span_id, spans[0].context.span_id)
186+
parent = spans.by_name("parent")
187+
child = spans.by_name("Elasticsearch/sw/people/1")
188+
self.assertIsNotNone(child.parent)
189+
self.assertEqual(child.parent.span_id, parent.context.span_id)
196190

197191
def test_multithread(self, request_mock):
198192
request_mock.return_value = (1, {}, {})
@@ -222,16 +216,15 @@ def target2():
222216
t1.join()
223217
t2.join()
224218

225-
spans = self.get_ordered_finished_spans()
219+
spans = self.get_finished_spans()
226220
self.assertEqual(3, len(spans))
227-
s1, s2, s3 = spans
228221

229-
self.assertEqual(s1.name, "parent")
222+
s1 = spans.by_name("parent")
223+
s2 = spans.by_name("Elasticsearch/test-index/tweet/1")
224+
s3 = spans.by_name("Elasticsearch/test-index/tweet/2")
230225

231-
self.assertEqual(s2.name, "Elasticsearch/test-index/tweet/1")
232226
self.assertIsNotNone(s2.parent)
233227
self.assertEqual(s2.parent.span_id, s1.context.span_id)
234-
self.assertEqual(s3.name, "Elasticsearch/test-index/tweet/2")
235228
self.assertIsNone(s3.parent)
236229

237230
def test_dsl_search(self, request_mock):
@@ -242,7 +235,7 @@ def test_dsl_search(self, request_mock):
242235
"term", author="testing"
243236
)
244237
search.execute()
245-
spans = self.get_ordered_finished_spans()
238+
spans = self.get_finished_spans()
246239
span = spans[0]
247240
self.assertEqual(1, len(spans))
248241
self.assertEqual(span.name, "Elasticsearch/test-index/_search")
@@ -270,10 +263,11 @@ def test_dsl_create(self, request_mock):
270263
client = Elasticsearch()
271264
Article.init(using=client)
272265

273-
spans = self.get_ordered_finished_spans()
266+
spans = self.get_finished_spans()
274267
self.assertEqual(2, len(spans))
275-
span1, span2 = spans
276-
self.assertEqual(span1.name, "Elasticsearch/test-index")
268+
span1 = spans.by_attr(key="elasticsearch.method", value="HEAD")
269+
span2 = spans.by_attr(key="elasticsearch.method", value="PUT")
270+
277271
self.assertEqual(
278272
span1.attributes,
279273
{
@@ -283,7 +277,6 @@ def test_dsl_create(self, request_mock):
283277
},
284278
)
285279

286-
self.assertEqual(span2.name, "Elasticsearch/test-index")
287280
attributes = {
288281
SpanAttributes.DB_SYSTEM: "elasticsearch",
289282
"elasticsearch.url": "/test-index",
@@ -306,7 +299,7 @@ def test_dsl_index(self, request_mock):
306299
)
307300
res = article.save(using=client)
308301
self.assertTrue(res)
309-
spans = self.get_ordered_finished_spans()
302+
spans = self.get_finished_spans()
310303
self.assertEqual(1, len(spans))
311304
span = spans[0]
312305
self.assertEqual(span.name, helpers.dsl_index_span_name)

instrumentation/opentelemetry-instrumentation-tornado/tests/test_instrumentation.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,19 @@ def test_coroutine_handler(self):
185185
def _test_async_handler(self, url, handler_name):
186186
response = self.fetch(url)
187187
self.assertEqual(response.code, 201)
188-
spans = self.memory_exporter.get_finished_spans()
188+
spans = self.get_finished_spans()
189189
self.assertEqual(len(spans), 5)
190190

191-
sub2, sub1, sub_wrapper, server, client = self.sorted_spans(spans)
191+
client = spans.by_name("GET")
192+
server = spans.by_name(handler_name + ".get")
193+
sub_wrapper = spans.by_name("sub-task-wrapper")
192194

195+
sub2 = spans.by_name("sub-task-2")
193196
self.assertEqual(sub2.name, "sub-task-2")
194197
self.assertEqual(sub2.parent, sub_wrapper.context)
195198
self.assertEqual(sub2.context.trace_id, client.context.trace_id)
196199

200+
sub1 = spans.by_name("sub-task-1")
197201
self.assertEqual(sub1.name, "sub-task-1")
198202
self.assertEqual(sub1.parent, sub_wrapper.context)
199203
self.assertEqual(sub1.context.trace_id, client.context.trace_id)
@@ -238,9 +242,11 @@ def test_500(self):
238242
response = self.fetch("/error")
239243
self.assertEqual(response.code, 500)
240244

241-
spans = self.sorted_spans(self.memory_exporter.get_finished_spans())
245+
spans = self.get_finished_spans()
242246
self.assertEqual(len(spans), 2)
243-
server, client = spans
247+
248+
client = spans.by_name("GET")
249+
server = spans.by_name("BadHandler.get")
244250

245251
self.assertEqual(server.name, "BadHandler.get")
246252
self.assertEqual(server.kind, SpanKind.SERVER)

tox.ini

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ envlist =
122122
py3{6,7,8,9}-test-instrumentation-grpc
123123

124124
; opentelemetry-instrumentation-sqlalchemy
125-
py3{6,7,8,9}-test-instrumentation-sqlalchemy{11,14}
125+
py3{6,7}-test-instrumentation-sqlalchemy{11}
126+
py3{6,7,8,9}-test-instrumentation-sqlalchemy{14}
126127
pypy3-test-instrumentation-sqlalchemy{11,14}
127128

128129
; opentelemetry-instrumentation-redis

0 commit comments

Comments
 (0)