Compare commits
2 Commits
b2f0716a3b
...
a144fd2912
| Author | SHA1 | Date | |
|---|---|---|---|
| a144fd2912 | |||
| fc4aeebfca |
+1
-1
@@ -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"
|
||||||
|
|||||||
@@ -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=(',', ':'))}"
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user