Skip to content

Commit d988a89

Browse files
Send activity failure details as envelopes
1 parent a2fc703 commit d988a89

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

src/durable_workflow/client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,8 @@ async def fail_activity_task(
915915
failure_type: str | None = None,
916916
stack_trace: str | None = None,
917917
non_retryable: bool = False,
918+
details: Any | None = None,
919+
codec: str = serializer.AVRO_CODEC,
918920
) -> Any:
919921
failure: dict[str, Any] = {"message": message}
920922
if failure_type is not None:
@@ -923,6 +925,8 @@ async def fail_activity_task(
923925
failure["stack_trace"] = stack_trace
924926
if non_retryable:
925927
failure["non_retryable"] = True
928+
if details is not None:
929+
failure["details"] = serializer.envelope(details, codec=codec)
926930
body: dict[str, Any] = {
927931
"activity_attempt_id": activity_attempt_id,
928932
"lease_owner": lease_owner,

tests/test_client.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,24 @@ async def test_body_shape(self, client: Client) -> None:
300300
assert body["failure"]["message"] == "activity error"
301301
assert body["failure"]["non_retryable"] is True
302302

303+
@pytest.mark.asyncio
304+
async def test_details_are_sent_as_payload_envelope(self, client: Client) -> None:
305+
resp = _mock_response(200, {"task_id": "t1", "outcome": "failed"})
306+
with patch.object(client._http, "request", new_callable=AsyncMock, return_value=resp) as mock:
307+
await client.fail_activity_task(
308+
task_id="t1",
309+
activity_attempt_id="a1",
310+
lease_owner="w1",
311+
message="activity error",
312+
details={"retry_after": 30},
313+
codec=serializer.JSON_CODEC,
314+
)
315+
body = mock.call_args.kwargs.get("json") or mock.call_args[1].get("json")
316+
envelope = body["failure"]["details"]
317+
318+
assert envelope["codec"] == serializer.JSON_CODEC
319+
assert serializer.decode_envelope(envelope) == {"retry_after": 30}
320+
303321

304322
class TestHeartbeatActivityTask:
305323
@pytest.mark.asyncio

0 commit comments

Comments
 (0)