Skip to content

Commit b1d4cf5

Browse files
authored
fix: Log internal error body if present (#340)
1 parent 6a09446 commit b1d4cf5

File tree

7 files changed

+93
-5
lines changed

7 files changed

+93
-5
lines changed

src/firebolt/async_db/cursor.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
if TYPE_CHECKING:
5454
from firebolt.async_db.connection import Connection
5555

56-
from firebolt.utils.util import Timer
56+
from firebolt.utils.util import Timer, _print_error_body
5757

5858
logger = logging.getLogger(__name__)
5959

@@ -121,6 +121,7 @@ async def _raise_if_error(self, resp: Response) -> None:
121121
f"Firebolt engine {self.connection.engine_url} "
122122
"needs to be running to run queries against it."
123123
)
124+
_print_error_body(resp)
124125
resp.raise_for_status()
125126

126127
async def _validate_set_parameter(self, parameter: SetParameter) -> None:

src/firebolt/db/cursor.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
ProgrammingError,
4646
)
4747
from firebolt.utils.urls import DATABASES_URL, ENGINES_URL
48+
from firebolt.utils.util import _print_error_body
4849

4950
if TYPE_CHECKING:
5051
from firebolt.db.connection import Connection
@@ -107,6 +108,7 @@ def _raise_if_error(self, resp: Response) -> None:
107108
f"Firebolt engine {self.connection.engine_url} "
108109
"needs to be running to run queries against it." # pragma: no mutate # noqa: E501
109110
)
111+
_print_error_body(resp)
110112
resp.raise_for_status()
111113

112114
@abstractmethod

src/firebolt/utils/util.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,19 @@ def validate_engine_name_and_url_v1(
147147
)
148148

149149

150+
def _print_error_body(resp: Response) -> None:
151+
"""log error body if it exists, since it's not always logged by default"""
152+
try:
153+
if (
154+
codes.is_error(resp.status_code)
155+
and "Content-Length" in resp.headers
156+
and int(resp.headers["Content-Length"]) > 0
157+
):
158+
logger.error(f"Something went wrong: {resp.read().decode('utf-8')}")
159+
except Exception:
160+
pass
161+
162+
150163
class Timer:
151164
def __init__(self, message: str = ""):
152165
self._message = message

tests/unit/async_db/V1/test_cursor.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from unittest.mock import patch
33

44
from httpx import HTTPStatusError, StreamError, codes
5-
from pytest import raises
5+
from pytest import LogCaptureFixture, raises
66
from pytest_httpx import HTTPXMock
77

88
from firebolt.async_db import Cursor
@@ -857,3 +857,24 @@ async def test_server_side_header_database(
857857
httpx_mock.add_callback(query_callback_with_headers, url=query_url_updated)
858858
await cursor.execute("select 1")
859859
assert cursor.database == db_name_updated
860+
861+
862+
async def test_cursor_unknown_error_body_logging(
863+
httpx_mock: HTTPXMock,
864+
auth_callback: Callable,
865+
auth_url: str,
866+
cursor: Cursor,
867+
caplog: LogCaptureFixture,
868+
query_url: str,
869+
):
870+
httpx_mock.add_callback(auth_callback, url=auth_url)
871+
actual_error_body = "Your query was incorrect"
872+
httpx_mock.add_callback(
873+
lambda *args, **kwargs: Response(
874+
status_code=codes.NOT_IMPLEMENTED, content=actual_error_body
875+
),
876+
url=query_url,
877+
)
878+
with raises(HTTPStatusError):
879+
await cursor.execute("select 1")
880+
assert actual_error_body in caplog.text

tests/unit/async_db/V2/test_cursor.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from unittest.mock import patch
33

44
from httpx import HTTPStatusError, StreamError, codes
5-
from pytest import raises
5+
from pytest import LogCaptureFixture, raises
66
from pytest_httpx import HTTPXMock
77

88
from firebolt.async_db import Cursor
@@ -878,3 +878,18 @@ async def test_server_side_header_database(
878878
httpx_mock.add_callback(query_callback_with_headers, url=query_url_updated)
879879
await cursor.execute("select 1")
880880
assert cursor.database == db_name_updated
881+
882+
883+
async def test_cursor_unknown_error_body_logging(
884+
httpx_mock: HTTPXMock, cursor: Cursor, caplog: LogCaptureFixture, query_url: str
885+
):
886+
actual_error_body = "Your query was incorrect"
887+
httpx_mock.add_callback(
888+
lambda *args, **kwargs: Response(
889+
status_code=codes.NOT_IMPLEMENTED, content=actual_error_body
890+
),
891+
url=query_url,
892+
)
893+
with raises(HTTPStatusError):
894+
await cursor.execute("select 1")
895+
assert actual_error_body in caplog.text

tests/unit/db/V1/test_cursor.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from unittest.mock import patch
33

44
from httpx import HTTPStatusError, StreamError, codes
5-
from pytest import raises
5+
from pytest import LogCaptureFixture, raises
66
from pytest_httpx import HTTPXMock
77

88
from firebolt.db import Cursor
@@ -716,3 +716,24 @@ def test_server_side_header_database(
716716
httpx_mock.add_callback(query_callback_with_headers, url=query_url_updated)
717717
cursor.execute("select 1")
718718
assert cursor.database == db_name_updated
719+
720+
721+
def test_cursor_unknown_error_body_logging(
722+
httpx_mock: HTTPXMock,
723+
auth_callback: Callable,
724+
auth_url: str,
725+
cursor: Cursor,
726+
caplog: LogCaptureFixture,
727+
query_url: str,
728+
):
729+
httpx_mock.add_callback(auth_callback, url=auth_url)
730+
actual_error_body = "Your query was incorrect"
731+
httpx_mock.add_callback(
732+
lambda *args, **kwargs: Response(
733+
status_code=codes.NOT_IMPLEMENTED, content=actual_error_body
734+
),
735+
url=query_url,
736+
)
737+
with raises(HTTPStatusError):
738+
cursor.execute("select 1")
739+
assert actual_error_body in caplog.text

tests/unit/db/V2/test_cursor.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from unittest.mock import patch
33

44
from httpx import HTTPStatusError, StreamError, codes
5-
from pytest import raises
5+
from pytest import LogCaptureFixture, raises
66
from pytest_httpx import HTTPXMock
77

88
from firebolt.db import Cursor
@@ -783,3 +783,18 @@ def test_server_side_header_database(
783783
httpx_mock.add_callback(query_callback_with_headers, url=query_url_updated)
784784
cursor.execute("select 1")
785785
assert cursor.database == db_name_updated
786+
787+
788+
def test_cursor_unknown_error_body_logging(
789+
httpx_mock: HTTPXMock, cursor: Cursor, caplog: LogCaptureFixture, query_url: str
790+
):
791+
actual_error_body = "Your query was incorrect"
792+
httpx_mock.add_callback(
793+
lambda *args, **kwargs: Response(
794+
status_code=codes.NOT_IMPLEMENTED, content=actual_error_body
795+
),
796+
url=query_url,
797+
)
798+
with raises(HTTPStatusError):
799+
cursor.execute("select 1")
800+
assert actual_error_body in caplog.text

0 commit comments

Comments
 (0)