From 39df92d757fc0d821cd30e6eeffc17045296fe5d Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Tue, 26 Nov 2019 11:49:49 -0800 Subject: [PATCH 1/7] Using InMemorySpanExporter for wsgi/flask tests Signed-off-by: Alex Boten --- .../tests/test_flask_integration.py | 119 ++++++------------ .../ext/testutil/wsgitestutil.py | 26 ++-- .../tests/test_wsgi_middleware.py | 10 +- tox.ini | 1 + 4 files changed, 59 insertions(+), 97 deletions(-) diff --git a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py index d03e7604a81..5567c693805 100644 --- a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py +++ b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py @@ -13,7 +13,6 @@ # limitations under the License. import unittest -from unittest import mock from flask import Flask from werkzeug.test import Client @@ -28,14 +27,6 @@ class TestFlaskIntegration(WsgiTestBase): def setUp(self): super().setUp() - self.span_attrs = {} - - def setspanattr(key, value): - self.assertIsInstance(key, str) - self.span_attrs[key] = value - - self.span.set_attribute = setspanattr - self.app = Flask(__name__) def hello_endpoint(helloid): @@ -49,88 +40,60 @@ def hello_endpoint(helloid): self.client = Client(self.app, BaseResponse) def test_simple(self): + expected_attrs = { + "component": "http", + "http.method": "GET", + "http.host": "localhost", + "http.url": "http://localhost/hello/123", + "http.route": "/hello/", + "http.status_code": 200, + "http.status_text": "OK", + } resp = self.client.get("/hello/123") self.assertEqual(200, resp.status_code) self.assertEqual([b"Hello: 123"], list(resp.response)) - - self.start_span.assert_called_with( - "hello_endpoint", - trace_api.INVALID_SPAN_CONTEXT, - kind=trace_api.SpanKind.SERVER, - start_time=mock.ANY, - ) - - # TODO: Change this test to use the SDK, as mocking becomes painful - - self.assertEqual( - self.span_attrs, - { - "component": "http", - "http.method": "GET", - "http.host": "localhost", - "http.url": "http://localhost/hello/123", - "http.route": "/hello/", - "http.status_code": 200, - "http.status_text": "OK", - }, - ) + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 1) + self.assertEqual(span_list[0].name, "hello_endpoint") + self.assertEqual(span_list[0].kind, trace_api.SpanKind.SERVER) + self.assertEqual(span_list[0].attributes, expected_attrs) def test_404(self): + expected_attrs = { + "component": "http", + "http.method": "POST", + "http.host": "localhost", + "http.url": "http://localhost/bye", + "http.status_code": 404, + "http.status_text": "NOT FOUND", + } resp = self.client.post("/bye") self.assertEqual(404, resp.status_code) resp.close() - - self.start_span.assert_called_with( - "/bye", - trace_api.INVALID_SPAN_CONTEXT, - kind=trace_api.SpanKind.SERVER, - start_time=mock.ANY, - ) - - # Nope, this uses Tracer.use_span(end_on_exit) - # self.assertEqual(1, self.span.end.call_count) - # TODO: Change this test to use the SDK, as mocking becomes painful - - self.assertEqual( - self.span_attrs, - { - "component": "http", - "http.method": "POST", - "http.host": "localhost", - "http.url": "http://localhost/bye", - "http.status_code": 404, - "http.status_text": "NOT FOUND", - }, - ) + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 1) + self.assertEqual(span_list[0].name, "/bye") + self.assertEqual(span_list[0].kind, trace_api.SpanKind.SERVER) + self.assertEqual(span_list[0].attributes, expected_attrs) def test_internal_error(self): + expected_attrs = { + "component": "http", + "http.method": "GET", + "http.host": "localhost", + "http.url": "http://localhost/hello/500", + "http.route": "/hello/", + "http.status_code": 500, + "http.status_text": "INTERNAL SERVER ERROR", + } resp = self.client.get("/hello/500") self.assertEqual(500, resp.status_code) resp.close() - - self.start_span.assert_called_with( - "hello_endpoint", - trace_api.INVALID_SPAN_CONTEXT, - kind=trace_api.SpanKind.SERVER, - start_time=mock.ANY, - ) - - # Nope, this uses Tracer.use_span(end_on_exit) - # self.assertEqual(1, self.span.end.call_count) - # TODO: Change this test to use the SDK, as mocking becomes painful - - self.assertEqual( - self.span_attrs, - { - "component": "http", - "http.method": "GET", - "http.host": "localhost", - "http.url": "http://localhost/hello/500", - "http.route": "/hello/", - "http.status_code": 500, - "http.status_text": "INTERNAL SERVER ERROR", - }, - ) + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 1) + self.assertEqual(span_list[0].name, "hello_endpoint") + self.assertEqual(span_list[0].kind, trace_api.SpanKind.SERVER) + self.assertEqual(span_list[0].attributes, expected_attrs) if __name__ == "__main__": diff --git a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py index fba6a8cda2d..ee5a5a8b46f 100644 --- a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py +++ b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py @@ -1,23 +1,26 @@ import io import unittest -import unittest.mock as mock import wsgiref.util as wsgiref_util from opentelemetry import trace as trace_api +from opentelemetry.sdk.trace import Tracer, export +from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter, +) class WsgiTestBase(unittest.TestCase): + @classmethod + def setUpClass(cls): + trace_api.set_preferred_tracer_implementation(lambda T: Tracer()) + def setUp(self): tracer = trace_api.tracer() - self.span = mock.create_autospec(trace_api.Span, spec_set=True) - self.start_span_patcher = mock.patch.object( - tracer, - "start_span", - autospec=True, - spec_set=True, - return_value=self.span, - ) - self.start_span = self.start_span_patcher.start() + + self.memory_exporter = InMemorySpanExporter() + span_processor = export.SimpleExportSpanProcessor(self.memory_exporter) + tracer.add_span_processor(span_processor) + self.write_buffer = io.BytesIO() self.write = self.write_buffer.write @@ -28,9 +31,6 @@ def setUp(self): self.response_headers = None self.exc_info = None - def tearDown(self): - self.start_span_patcher.stop() - def start_response(self, status, response_headers, exc_info=None): self.status = status self.response_headers = response_headers diff --git a/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py b/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py index 97c93880e47..5a652dcf3bd 100644 --- a/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py +++ b/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py @@ -78,10 +78,8 @@ def validate_response(self, response, error=None): while True: try: value = next(response) - self.assertEqual(0, self.span.end.call_count) self.assertEqual(value, b"*") except StopIteration: - self.span.end.assert_called_once_with() break self.assertEqual(self.status, "200 OK") @@ -95,10 +93,10 @@ def validate_response(self, response, error=None): else: self.assertIsNone(self.exc_info) - # Verify that start_span has been called - self.start_span.assert_called_with( - "/", trace_api.INVALID_SPAN_CONTEXT, kind=trace_api.SpanKind.SERVER - ) + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 1) + self.assertEqual(span_list[0].name, "/") + self.assertEqual(span_list[0].kind, trace_api.SpanKind.SERVER) def test_basic_wsgi_call(self): app = otel_wsgi.OpenTelemetryMiddleware(simple_wsgi) diff --git a/tox.ini b/tox.ini index 9d8e679dfa0..b4986eedee9 100644 --- a/tox.ini +++ b/tox.ini @@ -66,6 +66,7 @@ commands_pre = ext: pip install {toxinidir}/opentelemetry-api wsgi,flask: pip install {toxinidir}/ext/opentelemetry-ext-testutil wsgi,flask: pip install {toxinidir}/ext/opentelemetry-ext-wsgi + wsgi,flask: pip install {toxinidir}/opentelemetry-sdk flask: pip install {toxinidir}/ext/opentelemetry-ext-flask[test] pymongo: pip install {toxinidir}/ext/opentelemetry-ext-pymongo http-requests: pip install {toxinidir}/ext/opentelemetry-ext-http-requests From 30d755f0ee69d8bea2a5167c13516db322e56867 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 16 Dec 2019 13:38:52 -0800 Subject: [PATCH 2/7] fixing merge changes, removing BoundedDict Signed-off-by: Alex Boten --- .../tests/test_flask_integration.py | 85 +++++++++---------- .../ext/testutil/wsgitestutil.py | 35 ++------ 2 files changed, 46 insertions(+), 74 deletions(-) diff --git a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py index b32e6cf9350..4b65ab516fc 100644 --- a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py +++ b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py @@ -42,22 +42,19 @@ def hello_endpoint(helloid): self.client = Client(self.app, BaseResponse) def test_simple(self): - expected_attrs = BoundedDict.from_map( - MAX_NUM_ATTRIBUTES, - { - "component": "http", - "http.method": "GET", - "http.server_name": "localhost", - "http.scheme": "http", - "host.port": 80, - "http.host": "localhost", - "http.target": "/hello/123", - "http.flavor": "1.1", - "http.route": "/hello/", - "http.status_text": "OK", - "http.status_code": 200, - }, - ) + expected_attrs = { + "component": "http", + "http.method": "GET", + "http.server_name": "localhost", + "http.scheme": "http", + "host.port": 80, + "http.host": "localhost", + "http.target": "/hello/123", + "http.flavor": "1.1", + "http.route": "/hello/", + "http.status_text": "OK", + "http.status_code": 200, + } resp = self.client.get("/hello/123") self.assertEqual(200, resp.status_code) self.assertEqual([b"Hello: 123"], list(resp.response)) @@ -68,21 +65,18 @@ def test_simple(self): self.assertEqual(span_list[0].attributes, expected_attrs) def test_404(self): - expected_attrs = BoundedDict.from_map( - MAX_NUM_ATTRIBUTES, - { - "component": "http", - "http.method": "POST", - "http.server_name": "localhost", - "http.scheme": "http", - "host.port": 80, - "http.host": "localhost", - "http.target": "/bye", - "http.flavor": "1.1", - "http.status_text": "NOT FOUND", - "http.status_code": 404, - }, - ) + expected_attrs = { + "component": "http", + "http.method": "POST", + "http.server_name": "localhost", + "http.scheme": "http", + "host.port": 80, + "http.host": "localhost", + "http.target": "/bye", + "http.flavor": "1.1", + "http.status_text": "NOT FOUND", + "http.status_code": 404, + } resp = self.client.post("/bye") self.assertEqual(404, resp.status_code) resp.close() @@ -93,22 +87,19 @@ def test_404(self): self.assertEqual(span_list[0].attributes, expected_attrs) def test_internal_error(self): - expected_attrs = BoundedDict.from_map( - MAX_NUM_ATTRIBUTES, - { - "component": "http", - "http.method": "GET", - "http.server_name": "localhost", - "http.scheme": "http", - "host.port": 80, - "http.host": "localhost", - "http.target": "/hello/500", - "http.flavor": "1.1", - "http.route": "/hello/", - "http.status_text": "INTERNAL SERVER ERROR", - "http.status_code": 500, - }, - ) + expected_attrs = { + "component": "http", + "http.method": "GET", + "http.server_name": "localhost", + "http.scheme": "http", + "host.port": 80, + "http.host": "localhost", + "http.target": "/hello/500", + "http.flavor": "1.1", + "http.route": "/hello/", + "http.status_text": "INTERNAL SERVER ERROR", + "http.status_code": 500, + } resp = self.client.get("/hello/500") self.assertEqual(500, resp.status_code) resp.close() diff --git a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py index e26917ed005..cb2cb64aab1 100644 --- a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py +++ b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py @@ -3,7 +3,7 @@ import wsgiref.util as wsgiref_util from opentelemetry import trace as trace_api -from opentelemetry.sdk.trace import Tracer, export +from opentelemetry.sdk.trace import TracerSource, export from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( InMemorySpanExporter, ) @@ -12,32 +12,17 @@ class WsgiTestBase(unittest.TestCase): @classmethod def setUpClass(cls): - trace_api.set_preferred_tracer_implementation(lambda T: Tracer()) + trace_api.set_preferred_tracer_source_implementation( + lambda T: TracerSource() + ) def setUp(self): - self.span = mock.create_autospec(trace_api.Span, spec_set=True) - tracer = trace_api.Tracer() + tracer_source = trace_api.tracer_source() + self.memory_exporter = InMemorySpanExporter() span_processor = export.SimpleExportSpanProcessor(self.memory_exporter) - tracer.add_span_processor(span_processor) - - self.get_tracer_patcher = mock.patch.object( - trace_api.TracerSource, - "get_tracer", - autospec=True, - spec_set=True, - return_value=tracer, - ) - self.get_tracer_patcher.start() - - self.start_span_patcher = mock.patch.object( - tracer, - "start_span", - autospec=True, - spec_set=True, - return_value=self.span, - ) - self.start_span = self.start_span_patcher.start() + tracer_source.add_span_processor(span_processor) + self.write_buffer = io.BytesIO() self.write = self.write_buffer.write @@ -48,10 +33,6 @@ def setUp(self): self.response_headers = None self.exc_info = None - def tearDown(self): - self.get_tracer_patcher.stop() - self.start_span_patcher.stop() - def start_response(self, status, response_headers, exc_info=None): self.status = status self.response_headers = response_headers From cdc0336bc6d10c039cd35951a383fe4a78fde242 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 16 Dec 2019 13:41:18 -0800 Subject: [PATCH 3/7] couple more BoundedDict references --- .../tests/test_flask_integration.py | 2 -- .../tests/test_wsgi_middleware.py | 29 ++++++++----------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py index 4b65ab516fc..af99e6052f7 100644 --- a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py +++ b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py @@ -21,8 +21,6 @@ import opentelemetry.ext.flask as otel_flask from opentelemetry import trace as trace_api from opentelemetry.ext.testutil.wsgitestutil import WsgiTestBase -from opentelemetry.sdk.trace import MAX_NUM_ATTRIBUTES -from opentelemetry.sdk.util import BoundedDict class TestFlaskIntegration(WsgiTestBase): diff --git a/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py b/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py index 3625f14d037..1912dd0079f 100644 --- a/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py +++ b/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py @@ -21,8 +21,6 @@ import opentelemetry.ext.wsgi as otel_wsgi from opentelemetry import trace as trace_api from opentelemetry.ext.testutil.wsgitestutil import WsgiTestBase -from opentelemetry.sdk.trace import MAX_NUM_ATTRIBUTES -from opentelemetry.sdk.util import BoundedDict class Response: @@ -101,21 +99,18 @@ def validate_response(self, response, error=None): self.assertEqual(span_list[0].kind, trace_api.SpanKind.SERVER) self.assertEqual( span_list[0].attributes, - BoundedDict.from_map( - MAX_NUM_ATTRIBUTES, - { - "component": "http", - "http.method": "GET", - "http.server_name": "127.0.0.1", - "http.scheme": "http", - "host.port": 80, - "http.host": "127.0.0.1", - "http.flavor": "1.0", - "http.url": "http://127.0.0.1/", - "http.status_text": "OK", - "http.status_code": 200, - }, - ), + { + "component": "http", + "http.method": "GET", + "http.server_name": "127.0.0.1", + "http.scheme": "http", + "host.port": 80, + "http.host": "127.0.0.1", + "http.flavor": "1.0", + "http.url": "http://127.0.0.1/", + "http.status_text": "OK", + "http.status_code": 200, + }, ) def test_basic_wsgi_call(self): From f328909dbbc8479242137afb991df779b4dd78ef Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Fri, 20 Dec 2019 09:36:18 -0800 Subject: [PATCH 4/7] reload trace on teardown Signed-off-by: Alex Boten --- .../src/opentelemetry/ext/testutil/wsgitestutil.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py index cb2cb64aab1..752e3e78045 100644 --- a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py +++ b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py @@ -1,6 +1,7 @@ import io import unittest import wsgiref.util as wsgiref_util +from importlib import reload from opentelemetry import trace as trace_api from opentelemetry.sdk.trace import TracerSource, export @@ -16,6 +17,10 @@ def setUpClass(cls): lambda T: TracerSource() ) + @classmethod + def tearDownClass(cls): + reload(trace_api) + def setUp(self): tracer_source = trace_api.tracer_source() From 3bfa984f0e945a61f8bce06ee867b80a943d3f16 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Fri, 20 Dec 2019 09:55:50 -0800 Subject: [PATCH 5/7] refactoring test Signed-off-by: Alex Boten --- .../tests/test_flask_integration.py | 79 ++++++++++--------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py index af99e6052f7..09e62b7ba19 100644 --- a/ext/opentelemetry-ext-flask/tests/test_flask_integration.py +++ b/ext/opentelemetry-ext-flask/tests/test_flask_integration.py @@ -23,6 +23,24 @@ from opentelemetry.ext.testutil.wsgitestutil import WsgiTestBase +def expected_attributes(override_attributes): + default_attributes = { + "component": "http", + "http.method": "GET", + "http.server_name": "localhost", + "http.scheme": "http", + "host.port": 80, + "http.host": "localhost", + "http.target": "/", + "http.flavor": "1.1", + "http.status_text": "OK", + "http.status_code": 200, + } + for key, val in override_attributes.items(): + default_attributes[key] = val + return default_attributes + + class TestFlaskIntegration(WsgiTestBase): def setUp(self): super().setUp() @@ -40,19 +58,12 @@ def hello_endpoint(helloid): self.client = Client(self.app, BaseResponse) def test_simple(self): - expected_attrs = { - "component": "http", - "http.method": "GET", - "http.server_name": "localhost", - "http.scheme": "http", - "host.port": 80, - "http.host": "localhost", - "http.target": "/hello/123", - "http.flavor": "1.1", - "http.route": "/hello/", - "http.status_text": "OK", - "http.status_code": 200, - } + expected_attrs = expected_attributes( + { + "http.target": "/hello/123", + "http.route": "/hello/", + } + ) resp = self.client.get("/hello/123") self.assertEqual(200, resp.status_code) self.assertEqual([b"Hello: 123"], list(resp.response)) @@ -63,18 +74,15 @@ def test_simple(self): self.assertEqual(span_list[0].attributes, expected_attrs) def test_404(self): - expected_attrs = { - "component": "http", - "http.method": "POST", - "http.server_name": "localhost", - "http.scheme": "http", - "host.port": 80, - "http.host": "localhost", - "http.target": "/bye", - "http.flavor": "1.1", - "http.status_text": "NOT FOUND", - "http.status_code": 404, - } + expected_attrs = expected_attributes( + { + "http.method": "POST", + "http.target": "/bye", + "http.status_text": "NOT FOUND", + "http.status_code": 404, + } + ) + resp = self.client.post("/bye") self.assertEqual(404, resp.status_code) resp.close() @@ -85,19 +93,14 @@ def test_404(self): self.assertEqual(span_list[0].attributes, expected_attrs) def test_internal_error(self): - expected_attrs = { - "component": "http", - "http.method": "GET", - "http.server_name": "localhost", - "http.scheme": "http", - "host.port": 80, - "http.host": "localhost", - "http.target": "/hello/500", - "http.flavor": "1.1", - "http.route": "/hello/", - "http.status_text": "INTERNAL SERVER ERROR", - "http.status_code": 500, - } + expected_attrs = expected_attributes( + { + "http.target": "/hello/500", + "http.route": "/hello/", + "http.status_text": "INTERNAL SERVER ERROR", + "http.status_code": 500, + } + ) resp = self.client.get("/hello/500") self.assertEqual(500, resp.status_code) resp.close() From 58c7c031793464b7e455c59cfc25b5749e166403 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Fri, 20 Dec 2019 11:39:19 -0800 Subject: [PATCH 6/7] use a single in-memory exporter Signed-off-by: Alex Boten --- .../src/opentelemetry/ext/testutil/wsgitestutil.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py index 752e3e78045..c89335c2cf2 100644 --- a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py +++ b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py @@ -9,24 +9,29 @@ InMemorySpanExporter, ) +_MEMORY_EXPORTER = None + class WsgiTestBase(unittest.TestCase): @classmethod def setUpClass(cls): + global _MEMORY_EXPORTER trace_api.set_preferred_tracer_source_implementation( lambda T: TracerSource() ) + tracer_source = trace_api.tracer_source() + _MEMORY_EXPORTER = InMemorySpanExporter() + span_processor = export.SimpleExportSpanProcessor(_MEMORY_EXPORTER) + tracer_source.add_span_processor(span_processor) @classmethod def tearDownClass(cls): reload(trace_api) def setUp(self): - tracer_source = trace_api.tracer_source() - self.memory_exporter = InMemorySpanExporter() - span_processor = export.SimpleExportSpanProcessor(self.memory_exporter) - tracer_source.add_span_processor(span_processor) + self.memory_exporter = _MEMORY_EXPORTER + self.memory_exporter.clear() self.write_buffer = io.BytesIO() self.write = self.write_buffer.write From 7f03b248970c7020c94ff1e061c173c574c52941 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Fri, 20 Dec 2019 13:38:01 -0800 Subject: [PATCH 7/7] ignore global statement for this test Signed-off-by: Alex Boten --- .../src/opentelemetry/ext/testutil/wsgitestutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py index c89335c2cf2..5f99d08df04 100644 --- a/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py +++ b/ext/opentelemetry-ext-testutil/src/opentelemetry/ext/testutil/wsgitestutil.py @@ -15,7 +15,7 @@ class WsgiTestBase(unittest.TestCase): @classmethod def setUpClass(cls): - global _MEMORY_EXPORTER + global _MEMORY_EXPORTER # pylint:disable=global-statement trace_api.set_preferred_tracer_source_implementation( lambda T: TracerSource() )