Fix UnboundLocalError local variable 'start' referenced before assignment (#1889)

Co-authored-by: Pablo Collins <pablo.collins@gmail.com>
This commit is contained in:
Thomas LÉVEIL
2023-08-07 15:17:20 +02:00
committed by GitHub
parent 7603a1fc69
commit 1beab8238b
3 changed files with 40 additions and 1 deletions

View File

@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Fixed
- `opentelemetry-instrumentation-asgi` Fix UnboundLocalError local variable 'start' referenced before assignment
([#1889](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1889))
## Version 1.19.0/0.40b0 (2023-07-13)
- `opentelemetry-instrumentation-asgi` Add `http.server.request.size` metric
([#1867](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1867))

View File

@ -538,6 +538,7 @@ class OpenTelemetryMiddleware:
receive: An awaitable callable yielding dictionaries
send: An awaitable callable taking a single dictionary as argument.
"""
start = default_timer()
if scope["type"] not in ("http", "websocket"):
return await self.app(scope, receive, send)
@ -591,7 +592,6 @@ class OpenTelemetryMiddleware:
send,
duration_attrs,
)
start = default_timer()
await self.app(scope, otel_receive, otel_send)
finally:

View File

@ -14,6 +14,7 @@
# pylint: disable=too-many-lines
import asyncio
import sys
import unittest
from timeit import default_timer
@ -796,5 +797,38 @@ class TestWrappedApplication(AsgiTestBase):
)
class TestAsgiApplicationRaisingError(AsgiTestBase):
def tearDown(self):
pass
@mock.patch(
"opentelemetry.instrumentation.asgi.collect_custom_request_headers_attributes",
side_effect=ValueError("whatever"),
)
def test_asgi_issue_1883(
self, mock_collect_custom_request_headers_attributes
):
"""
Test that exception UnboundLocalError local variable 'start' referenced before assignment is not raised
See https://github.com/open-telemetry/opentelemetry-python-contrib/issues/1883
"""
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
self.send_default_request()
try:
asyncio.get_event_loop().run_until_complete(
self.communicator.stop()
)
except ValueError as exc_info:
self.assertEqual(exc_info.args[0], "whatever")
except Exception as exc_info: # pylint: disable=W0703
self.fail(
"expecting ValueError('whatever'), received instead: "
+ str(exc_info)
)
else:
self.fail("expecting ValueError('whatever')")
if __name__ == "__main__":
unittest.main()