temporalio / temporalio/sdk-python

[Feature Request] Loss of stack trace information

Open
#807 3 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
Python
Stars
1.2k
Forks
241
Avg merge
3d 21h
Merged PRs (30d)
55

Description

Is your feature request related to a problem? Please describe.
  • I would like to include full stack trace information in Sentry - see screenshot below where only ChildWorkflowError has a stack trace and both ActivityError and ApplicationError are missing it.
  • I understand the exceptions are passed through the distributed system using the Failure Protobuf message which has a stack_trace field which could be used to populate the Sentry stack trace. This works for getting the stack trace of the ApplicationError in the activity. However, it's impossible to get the stack trace for the ActivityError in the TestChildWorkflow because the failure is just copied from the original failure here: https://github.com/temporalio/sdk-python/blob/bf747f1170e603b1e1adbd77c673fa83f0c99e7d/temporalio/converter.py#L826-L829
Image

This is the workflow and activity code I'm using to test this:

@activity.defn(...)
async def test_activity() -> None:
    raise TestException("Test error")


@workflow.defn
class TestChildWorkflow:
    @workflow.run
    async def run(self) -> None:
        # execute_default_activity is our wrapper around workflow.execute_activity
        await execute_default_activity(
            test_activity,
            retry_policy=RetryPolicy(maximum_attempts=1),
        ),


@workflow.defn
class TestParentWorkflow:
    @workflow.run
    async def run(self) -> None:
        # child workflow fails parent workflow
        await workflow.execute_child_workflow(
            TestChildWorkflow.run,
            id=f"test-child-workflow-{int(workflow.time())}",
            task_queue=get_temporal_tasks_queue_name(),
        )
Describe the solution you'd like
  • Ability to get the stack trace for every error in the chain. I am happy to contribute this code but I am not sure if there is a strong reason for why it is done this way and whether it can be changed.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in temporalio/converter.py around lines 826-829, where the failure is copied, and reproduce the issue with the TestParentWorkflow, TestChildWorkflow, and test_activity entry points. Trace how the Failure Protobuf stack_trace moves through the ActivityError and ChildWorkflowError chain. Done means Sentry can access stack trace information for every error in the chain without losing the original activity trace.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
distributed-systems, observability
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.