Summary
The Java OTel plugins intentionally drop references to recording spans without ending them when a durable execution returns a non-terminal status.
Affected behavior:
ExecutionOtelPlugin clears open operation and attempt spans during invocation cleanup without ending them.
- Both
ExecutionOtelPlugin and InvocationOtelPlugin drop the execution-scoped Workflow span on PENDING or RETRYING.
OpenTelemetry spans are only complete and eligible for processing/export after Span.end() is called.
Evidence
otel-plugin/src/main/java/software/amazon/lambda/durable/otel/ExecutionOtelPlugin.java
onInvocationEnd clears operationSpans and attemptSpans without ending the spans.
- The non-terminal workflow path clears
workflowSpan without ending it.
otel-plugin/src/main/java/software/amazon/lambda/durable/otel/InvocationOtelPlugin.java
- The non-terminal workflow path clears
workflowSpan without ending it.
ExecutionOtelPluginTest.nonTerminalInvocation_doesNotExportWorkflowSpan codifies the unended workflow behavior.
ExecutionOtelPluginTest.operationNotCompleted_notEndedAtInvocationEnd explicitly requires an open operation span not to be ended.
InvocationOtelPluginTest.workflowSpan_notExportedOnNonTerminal codifies the same workflow behavior.
OpenTelemetry requirement
The Trace API defines End as the operation that completes a span and makes it ready for delivery through the configured span processor:
https://opentelemetry.io/docs/specs/otel/trace/api/#end
Impact
- Span processors can observe span starts without corresponding ends.
- Processor state or references may remain live across warm Lambda invocations.
- Re-created deterministic spans can produce repeated starts for the same logical span ID.
- The behavior prevents a strict OpenTelemetry compliance claim.
Acceptance criteria
- Every recording span created by either Java OTel plugin is ended exactly once.
- Non-terminal workflow and suspended-operation behavior does not rely on abandoning a recording span.
- Cross-invocation workflow and operation correlation remains intact.
- Tests retain span references and assert that they are no longer recording after invocation cleanup.
- Tests cover
PENDING, RETRYING, terminal success, and terminal failure for both plugin variants.
Related cross-SDK issue: aws/aws-durable-execution-sdk-python#642
Summary
The Java OTel plugins intentionally drop references to recording spans without ending them when a durable execution returns a non-terminal status.
Affected behavior:
ExecutionOtelPluginclears open operation and attempt spans during invocation cleanup without ending them.ExecutionOtelPluginandInvocationOtelPlugindrop the execution-scopedWorkflowspan onPENDINGorRETRYING.OpenTelemetry spans are only complete and eligible for processing/export after
Span.end()is called.Evidence
otel-plugin/src/main/java/software/amazon/lambda/durable/otel/ExecutionOtelPlugin.javaonInvocationEndclearsoperationSpansandattemptSpanswithout ending the spans.workflowSpanwithout ending it.otel-plugin/src/main/java/software/amazon/lambda/durable/otel/InvocationOtelPlugin.javaworkflowSpanwithout ending it.ExecutionOtelPluginTest.nonTerminalInvocation_doesNotExportWorkflowSpancodifies the unended workflow behavior.ExecutionOtelPluginTest.operationNotCompleted_notEndedAtInvocationEndexplicitly requires an open operation span not to be ended.InvocationOtelPluginTest.workflowSpan_notExportedOnNonTerminalcodifies the same workflow behavior.OpenTelemetry requirement
The Trace API defines
Endas the operation that completes a span and makes it ready for delivery through the configured span processor:https://opentelemetry.io/docs/specs/otel/trace/api/#end
Impact
Acceptance criteria
PENDING,RETRYING, terminal success, and terminal failure for both plugin variants.Related cross-SDK issue: aws/aws-durable-execution-sdk-python#642