Skip to content

Commit 9d14265

Browse files
Fix Tornado errors mapping to 500 (#1048)
1 parent e9f83e1 commit 9d14265

File tree

4 files changed

+47
-4
lines changed

4 files changed

+47
-4
lines changed

Diff for: CHANGELOG.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v1.10.0-0.29b0...HEAD)
99

1010
### Fixed
11-
11+
- `opentelemetry-instrumentation-tornado` Fix Tornado errors mapping to 500
12+
([#1048])(https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1048)
1213
- `opentelemetry-instrumentation-urllib` make span attributes available to sampler
1314
([1014](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1014))
1415
- `opentelemetry-instrumentation-flask` Fix non-recording span bug

Diff for: instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/__init__.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -420,14 +420,15 @@ def _finish_span(tracer, handler, error=None):
420420
status_code = error.status_code
421421
if not ctx and status_code == 404:
422422
ctx = _start_span(tracer, handler, _time_ns())
423-
if status_code != 404:
423+
else:
424+
status_code = 500
425+
reason = None
426+
if status_code >= 500:
424427
finish_args = (
425428
type(error),
426429
error,
427430
getattr(error, "__traceback__", None),
428431
)
429-
status_code = 500
430-
reason = None
431432

432433
if not ctx:
433434
return

Diff for: instrumentation/opentelemetry-instrumentation-tornado/tests/test_instrumentation.py

+35
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,41 @@ def test_404(self):
317317
},
318318
)
319319

320+
def test_http_error(self):
321+
response = self.fetch("/raise_403")
322+
self.assertEqual(response.code, 403)
323+
324+
spans = self.sorted_spans(self.memory_exporter.get_finished_spans())
325+
self.assertEqual(len(spans), 2)
326+
server, client = spans
327+
328+
self.assertEqual(server.name, "RaiseHTTPErrorHandler.get")
329+
self.assertEqual(server.kind, SpanKind.SERVER)
330+
self.assertSpanHasAttributes(
331+
server,
332+
{
333+
SpanAttributes.HTTP_METHOD: "GET",
334+
SpanAttributes.HTTP_SCHEME: "http",
335+
SpanAttributes.HTTP_HOST: "127.0.0.1:"
336+
+ str(self.get_http_port()),
337+
SpanAttributes.HTTP_TARGET: "/raise_403",
338+
SpanAttributes.HTTP_CLIENT_IP: "127.0.0.1",
339+
SpanAttributes.HTTP_STATUS_CODE: 403,
340+
"tornado.handler": "tests.tornado_test_app.RaiseHTTPErrorHandler",
341+
},
342+
)
343+
344+
self.assertEqual(client.name, "GET")
345+
self.assertEqual(client.kind, SpanKind.CLIENT)
346+
self.assertSpanHasAttributes(
347+
client,
348+
{
349+
SpanAttributes.HTTP_URL: self.get_url("/raise_403"),
350+
SpanAttributes.HTTP_METHOD: "GET",
351+
SpanAttributes.HTTP_STATUS_CODE: 403,
352+
},
353+
)
354+
320355
def test_dynamic_handler(self):
321356
response = self.fetch("/dyna")
322357
self.assertEqual(response.code, 404)

Diff for: instrumentation/opentelemetry-instrumentation-tornado/tests/tornado_test_app.py

+6
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ def get(self):
105105
self.set_status(200)
106106

107107

108+
class RaiseHTTPErrorHandler(tornado.web.RequestHandler):
109+
def get(self):
110+
raise tornado.web.HTTPError(403)
111+
112+
108113
def make_app(tracer):
109114
app = tornado.web.Application(
110115
[
@@ -116,6 +121,7 @@ def make_app(tracer):
116121
(r"/healthz", HealthCheckHandler),
117122
(r"/ping", HealthCheckHandler),
118123
(r"/test_custom_response_headers", CustomResponseHeaderHandler),
124+
(r"/raise_403", RaiseHTTPErrorHandler),
119125
]
120126
)
121127
app.tracer = tracer

0 commit comments

Comments
 (0)