Skip to content

Commit c0a5be5

Browse files
authored
ext/wsgi: Set span status on wsgi errors (open-telemetry#864)
1 parent a8a0ed4 commit c0a5be5

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

ext/opentelemetry-ext-wsgi/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
- Set span status on wsgi errors
6+
([#864](https://github.com/open-telemetry/opentelemetry-python/pull/864))
7+
58
## 0.4a0
69

710
Released 2020-02-21

ext/opentelemetry-ext-wsgi/src/opentelemetry/ext/wsgi/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
1514
"""
1615
This library provides a WSGI middleware that can be used on any WSGI framework
1716
(such as Django / Flask) to track requests timing through OpenTelemetry.
@@ -211,8 +210,8 @@ def __call__(self, environ, start_response):
211210
return _end_span_after_iterating(
212211
iterable, span, self.tracer, token
213212
)
214-
except: # noqa
215-
# TODO Set span status (cf. https://github.com/open-telemetry/opentelemetry-python/issues/292)
213+
except Exception as ex:
214+
span.set_status(Status(StatusCanonicalCode.INTERNAL, str(ex)))
216215
span.end()
217216
context.detach(token)
218217
raise

ext/opentelemetry-ext-wsgi/tests/test_wsgi_middleware.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import opentelemetry.ext.wsgi as otel_wsgi
2222
from opentelemetry import trace as trace_api
2323
from opentelemetry.test.wsgitestutil import WsgiTestBase
24+
from opentelemetry.trace.status import StatusCanonicalCode
2425

2526

2627
class Response:
@@ -73,6 +74,11 @@ def error_wsgi(environ, start_response):
7374
return [b"*"]
7475

7576

77+
def error_wsgi_unhandled(environ, start_response):
78+
assert isinstance(environ, dict)
79+
raise ValueError
80+
81+
7682
class TestWsgiApplication(WsgiTestBase):
7783
def validate_response(
7884
self, response, error=None, span_name="HTTP GET", http_method="GET"
@@ -148,6 +154,15 @@ def test_wsgi_exc_info(self):
148154
response = app(self.environ, self.start_response)
149155
self.validate_response(response, error=ValueError)
150156

157+
def test_wsgi_internal_error(self):
158+
app = otel_wsgi.OpenTelemetryMiddleware(error_wsgi_unhandled)
159+
self.assertRaises(ValueError, app, self.environ, self.start_response)
160+
span_list = self.memory_exporter.get_finished_spans()
161+
self.assertEqual(len(span_list), 1)
162+
self.assertEqual(
163+
span_list[0].status.canonical_code, StatusCanonicalCode.INTERNAL,
164+
)
165+
151166
def test_override_span_name(self):
152167
"""Test that span_names can be overwritten by our callback function."""
153168
span_name = "Dymaxion"

0 commit comments

Comments
 (0)