Compare commits

...

2 Commits

Author SHA1 Message Date
alex a144fd2912 Апдейт версии 2026-04-30 08:05:51 +03:00
alex fc4aeebfca Добавил форматирование вывода логов 2026-04-30 08:05:33 +03:00
3 changed files with 49 additions and 3 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "plba" name = "plba"
version = "0.3.3" version = "0.3.4"
description = "Platform runtime for business applications" description = "Platform runtime for business applications"
readme = "README.md" readme = "README.md"
requires-python = ">=3.11" requires-python = ">=3.11"
+8
View File
@@ -147,7 +147,15 @@ class HttpControlAppFactory:
] ]
lines.extend(self._child_id_lines(trace_view.child_ids)) lines.extend(self._child_id_lines(trace_view.child_ids))
lines.append("--------------------------------------------------") lines.append("--------------------------------------------------")
previous_step: str | None = None
for record in trace_view.records: for record in trace_view.records:
current_step = str(record.step or "")
if previous_step is None:
lines.append(f"step: {current_step}")
elif current_step != previous_step:
lines.append("--------------------------------------------------")
lines.append(f"step: {current_step}")
previous_step = current_step
line = record.message line = record.message
if request.include_attrs_json: if request.include_attrs_json:
line = f"{line}, {json.dumps(record.attrs_json, ensure_ascii=False, separators=(',', ':'))}" line = f"{line}, {json.dumps(record.attrs_json, ensure_ascii=False, separators=(',', ':'))}"
+40 -2
View File
@@ -19,14 +19,16 @@ def _trace_record(
row_id: int, row_id: int,
level: str, level: str,
message: str, message: str,
step: str = "process",
status: str = "failed",
attrs_json: object | None = None, attrs_json: object | None = None,
) -> TraceLogRecord: ) -> TraceLogRecord:
return TraceLogRecord( return TraceLogRecord(
id=row_id, id=row_id,
trace_id="trace-1", trace_id="trace-1",
event_time=datetime(2026, 4, 28, 10, 11, 12, tzinfo=timezone.utc), event_time=datetime(2026, 4, 28, 10, 11, 12, tzinfo=timezone.utc),
step="process", step=step,
status="failed", status=status,
level=level, # type: ignore[arg-type] level=level, # type: ignore[arg-type]
message=message, message=message,
attrs_json=attrs_json if attrs_json is not None else {}, attrs_json=attrs_json if attrs_json is not None else {},
@@ -73,6 +75,7 @@ def test_trace_endpoint_returns_text_with_default_levels() -> None:
" - child-1\n" " - child-1\n"
" - child-2\n" " - child-2\n"
"--------------------------------------------------\n" "--------------------------------------------------\n"
"step: process\n"
"first error\n" "first error\n"
"second warning" "second warning"
) )
@@ -102,10 +105,45 @@ def test_trace_endpoint_appends_attrs_json_in_text_mode() -> None:
"parent_id: \n" "parent_id: \n"
"child_ids:\n" "child_ids:\n"
"--------------------------------------------------\n" "--------------------------------------------------\n"
"step: process\n"
'failure, {"attempt":2,"source":"crm"}' 'failure, {"attempt":2,"source":"crm"}'
) )
def test_trace_endpoint_separates_messages_by_step_in_text_mode() -> None:
async def trace_provider(_trace_id: str, _request: TraceQueryRequest) -> TraceLogView:
return TraceLogView(
trace_id="trace-1",
parent_id=None,
child_ids=(),
records=(
_trace_record(row_id=1, level="INFO", message="load first", step="load_stocks"),
_trace_record(row_id=2, level="INFO", message="load second", step="load_stocks"),
_trace_record(row_id=3, level="INFO", message="filter first", step="filter_stocks"),
),
)
client = _build_client(trace_provider)
try:
response = client.get("/traces/trace-1")
finally:
client.close()
assert response.status_code == 200
assert response.text == (
"trace_id: trace-1\n"
"parent_id: \n"
"child_ids:\n"
"--------------------------------------------------\n"
"step: load_stocks\n"
"load first\n"
"load second\n"
"--------------------------------------------------\n"
"step: filter_stocks\n"
"filter first"
)
def test_trace_endpoint_returns_json_payload() -> None: def test_trace_endpoint_returns_json_payload() -> None:
async def trace_provider(_trace_id: str, _request: TraceQueryRequest) -> TraceLogView: async def trace_provider(_trace_id: str, _request: TraceQueryRequest) -> TraceLogView:
return TraceLogView( return TraceLogView(