Skip to content

Commit

Permalink
Add "lines" and "verbose" query parameters for advanced logs (#5287)
Browse files Browse the repository at this point in the history
Since headers are clumsy considering the Core proxy between the frontend
and Supervisor, add a way to adjust number of lines and verbose log
format using query parameters as well. If both query parameters and
headers are supplied, prefer the former, as it's more prominent when
reading through the request logs.
  • Loading branch information
sairon authored Sep 4, 2024
1 parent 6c1203e commit 05e0c7c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 2 deletions.
8 changes: 6 additions & 2 deletions supervisor/api/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,14 @@ async def advanced_logs_handler(
"supported for now."
)

if request.headers[ACCEPT] == CONTENT_TYPE_X_LOG:
if "verbose" in request.query or request.headers[ACCEPT] == CONTENT_TYPE_X_LOG:
log_formatter = LogFormatter.VERBOSE

if RANGE in request.headers:
if "lines" in request.query:
lines = request.query.get("lines", DEFAULT_RANGE)
# entries=cursor[[:num_skip]:num_entries]
range_header = f"entries=:-{lines}:"
elif RANGE in request.headers:
range_header = request.headers.get(RANGE)
else:
range_header = f"entries=:-{DEFAULT_RANGE}:"
Expand Down
45 changes: 45 additions & 0 deletions tests/api/test_host.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,51 @@ async def test_advanced_logs(
)


async def test_advaced_logs_query_parameters(
api_client: TestClient,
coresys: CoreSys,
journald_logs: MagicMock,
journal_logs_reader: MagicMock,
):
"""Test advanced logging API entries controlled by query parameters."""
# Check lines query parameter
await api_client.get("/host/logs?lines=53")
journald_logs.assert_called_once_with(
params={"SYSLOG_IDENTIFIER": coresys.host.logs.default_identifiers},
range_header="entries=:-53:",
accept=LogFormat.JOURNAL,
)

journald_logs.reset_mock()

# Check verbose logs formatter via query parameter
await api_client.get("/host/logs?verbose")
journald_logs.assert_called_once_with(
params={"SYSLOG_IDENTIFIER": coresys.host.logs.default_identifiers},
range_header=DEFAULT_RANGE,
accept=LogFormat.JOURNAL,
)
journal_logs_reader.assert_called_with(ANY, LogFormatter.VERBOSE)

journal_logs_reader.reset_mock()
journald_logs.reset_mock()

# Query parameters should take precedence over headers
await api_client.get(
"/host/logs?lines=53&verbose",
headers={
"Range": "entries=:-19:10",
"Accept": "text/plain",
},
)
journald_logs.assert_called_once_with(
params={"SYSLOG_IDENTIFIER": coresys.host.logs.default_identifiers},
range_header="entries=:-53:",
accept=LogFormat.JOURNAL,
)
journal_logs_reader.assert_called_with(ANY, LogFormatter.VERBOSE)


async def test_advanced_logs_boot_id_offset(
api_client: TestClient, coresys: CoreSys, journald_logs: MagicMock
):
Expand Down

0 comments on commit 05e0c7c

Please sign in to comment.