Both OTel plugins abandoned recording spans without ending them when a
durable execution returned a non-terminal status, violating the OTel
requirement that every created span be ended. The execution plugin
dropped open operation spans on PENDING/RETRY, and both plugins dropped
the execution-scoped Workflow span on non-terminal invocations.
Replace the eager recording Workflow span with a non-recording
deterministic placeholder held during the invocation. The placeholder
still carries the deterministic trace and span IDs, so it parents and
links operation spans, keeps the Workflow current for auto-instrumented
spans, and serves log correlation - without leaving a recording span to
abandon. The recording Workflow span is created and ended exactly once,
only on a terminal status, anchored at the execution start time.
The execution plugin now also ends any operation spans still open at
invocation end, matching the invocation plugin. Cross-invocation
correlation is unchanged: an operation that resumes later still gets its
authoritative span from on_operation_end.
Closes #642
Issue #, if available:
#642
Description of changes:
Both OTel plugins abandoned recording spans without ending them when a durable execution returned a non-terminal status, violating the OTel requirement that every created span be ended. The execution plugin dropped open operation spans on PENDING/RETRY, and both plugins dropped the execution-scoped Workflow span on non-terminal invocations.
Replace the eager recording Workflow span with a non-recording deterministic placeholder held during the invocation. The placeholder still carries the deterministic trace and span IDs, so it parents and links operation spans, keeps the Workflow current for auto-instrumented spans, and serves log correlation - without leaving a recording span to abandon. The recording Workflow span is created and ended exactly once, only on a terminal status, anchored at the execution start time.
The execution plugin now also ends any operation spans still open at invocation end, matching the invocation plugin. Cross-invocation correlation is unchanged: an operation that resumes later still gets its authoritative span from on_operation_end.
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.