diff --git a/ext/opentelemetry-ext-wsgi/CHANGELOG.md b/ext/opentelemetry-ext-wsgi/CHANGELOG.md index a82a5de7c8c..da9df382f46 100644 --- a/ext/opentelemetry-ext-wsgi/CHANGELOG.md +++ b/ext/opentelemetry-ext-wsgi/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +- Set span status on wsgi errors + ([#864](https://github.com/open-telemetry/opentelemetry-python/pull/864)) + ## 0.4a0 Released 2020-02-21 diff --git a/ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py b/ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py index 9968a0c1c83..709de24edf2 100644 --- a/ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py +++ b/ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - """ This library provides a WSGI middleware that can be used on any WSGI framework (such as Django / Flask) to track requests timing through OpenTelemetry. @@ -211,8 +210,8 @@ def __call__(self, environ, start_response): return _end_span_after_iterating( iterable, span, self.tracer, token ) - except: # noqa - # TODO Set span status (cf. https://github.com/open-telemetry/opentelemetry-python/issues/292) + except Exception as ex: + span.set_status(Status(StatusCanonicalCode.INTERNAL, str(ex))) span.end() context.detach(token) raise diff --git a/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py b/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py index 0d018b68414..2a2d518513f 100644 --- a/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py +++ b/ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py @@ -21,6 +21,7 @@ import opentelemetry.ext.wsgi as otel_wsgi from opentelemetry import trace as trace_api from opentelemetry.test.wsgitestutil import WsgiTestBase +from opentelemetry.trace.status import StatusCanonicalCode class Response: @@ -73,6 +74,11 @@ def error_wsgi(environ, start_response): return [b"*"] +def error_wsgi_unhandled(environ, start_response): + assert isinstance(environ, dict) + raise ValueError + + class TestWsgiApplication(WsgiTestBase): def validate_response( self, response, error=None, span_name="HTTP GET", http_method="GET" @@ -148,6 +154,15 @@ def test_wsgi_exc_info(self): response = app(self.environ, self.start_response) self.validate_response(response, error=ValueError) + def test_wsgi_internal_error(self): + app = otel_wsgi.OpenTelemetryMiddleware(error_wsgi_unhandled) + self.assertRaises(ValueError, app, self.environ, self.start_response) + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 1) + self.assertEqual( + span_list[0].status.canonical_code, StatusCanonicalCode.INTERNAL, + ) + def test_override_span_name(self): """Test that span_names can be overwritten by our callback function.""" span_name = "Dymaxion"