Skip to content

Commit d01159f

Browse files
committed
Don't set startActivity as the parent context
1 parent 4fe685a commit d01159f

File tree

2 files changed

+31
-45
lines changed

2 files changed

+31
-45
lines changed

temporalio/contrib/openai_agents/_trace_interceptor.py

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -371,77 +371,60 @@ async def signal_child_workflow(
371371
self, input: temporalio.worker.SignalChildWorkflowInput
372372
) -> None:
373373
trace = get_trace_provider().get_current_trace()
374+
set_header_from_context(input, temporalio.workflow.payload_converter())
374375
if trace:
375376
with custom_span(
376377
name="temporal:signalChildWorkflow",
377378
data={"workflowId": input.child_workflow_id},
378379
):
379-
set_header_from_context(input, temporalio.workflow.payload_converter())
380380
await self.next.signal_child_workflow(input)
381-
else:
382-
set_header_from_context(input, temporalio.workflow.payload_converter())
383-
await self.next.signal_child_workflow(input)
381+
await self.next.signal_child_workflow(input)
384382

385383
async def signal_external_workflow(
386384
self, input: temporalio.worker.SignalExternalWorkflowInput
387385
) -> None:
388386
trace = get_trace_provider().get_current_trace()
387+
set_header_from_context(input, temporalio.workflow.payload_converter())
389388
if trace:
390389
with custom_span(
391390
name="temporal:signalExternalWorkflow",
392391
data={"workflowId": input.workflow_id},
393392
):
394-
set_header_from_context(input, temporalio.workflow.payload_converter())
395393
await self.next.signal_external_workflow(input)
396-
else:
397-
set_header_from_context(input, temporalio.workflow.payload_converter())
398-
await self.next.signal_external_workflow(input)
394+
await self.next.signal_external_workflow(input)
399395

400396
def start_activity(
401397
self, input: temporalio.worker.StartActivityInput
402398
) -> temporalio.workflow.ActivityHandle:
403399
trace = get_trace_provider().get_current_trace()
404-
span: Optional[Span] = None
400+
set_header_from_context(input, temporalio.workflow.payload_converter())
405401
if trace:
406-
span = custom_span(
402+
with custom_span(
407403
name="temporal:startActivity", data={"activity": input.activity}
408-
)
409-
span.start(mark_as_current=True)
410-
411-
set_header_from_context(input, temporalio.workflow.payload_converter())
412-
handle = self.next.start_activity(input)
413-
if span:
414-
handle.add_done_callback(lambda _: span.finish()) # type: ignore
415-
return handle
404+
):
405+
return self.next.start_activity(input)
406+
return self.next.start_activity(input)
416407

417408
async def start_child_workflow(
418409
self, input: temporalio.worker.StartChildWorkflowInput
419410
) -> temporalio.workflow.ChildWorkflowHandle:
420411
trace = get_trace_provider().get_current_trace()
421-
span: Optional[Span] = None
412+
set_header_from_context(input, temporalio.workflow.payload_converter())
422413
if trace:
423-
span = custom_span(
414+
with custom_span(
424415
name="temporal:startChildWorkflow", data={"workflow": input.workflow}
425-
)
426-
span.start(mark_as_current=True)
427-
set_header_from_context(input, temporalio.workflow.payload_converter())
428-
handle = await self.next.start_child_workflow(input)
429-
if span:
430-
handle.add_done_callback(lambda _: span.finish()) # type: ignore
431-
return handle
416+
):
417+
return await self.next.start_child_workflow(input)
418+
return await self.next.start_child_workflow(input)
432419

433420
def start_local_activity(
434421
self, input: temporalio.worker.StartLocalActivityInput
435422
) -> temporalio.workflow.ActivityHandle:
436423
trace = get_trace_provider().get_current_trace()
437-
span: Optional[Span] = None
424+
set_header_from_context(input, temporalio.workflow.payload_converter())
438425
if trace:
439-
span = custom_span(
426+
with custom_span(
440427
name="temporal:startLocalActivity", data={"activity": input.activity}
441-
)
442-
span.start(mark_as_current=True)
443-
set_header_from_context(input, temporalio.workflow.payload_converter())
444-
handle = self.next.start_local_activity(input)
445-
if span:
446-
handle.add_done_callback(lambda _: span.finish()) # type: ignore
447-
return handle
428+
):
429+
return self.next.start_local_activity(input)
430+
return self.next.start_local_activity(input)

tests/contrib/openai_agents/test_openai_tracing.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,22 @@ def paired_span(a: tuple[Span[Any], bool], b: tuple[Span[Any], bool]) -> None:
8181
# Initial planner spans - There are only 3 because we don't make an actual model call
8282
paired_span(processor.span_events[0], processor.span_events[5])
8383
assert processor.span_events[0][0].span_data.export().get("name") == "PlannerAgent"
84+
print("Planner span:", processor.span_events[0][0].span_id)
8485

85-
paired_span(processor.span_events[1], processor.span_events[4])
86+
# startActivity happens before executeActivity
87+
paired_span(processor.span_events[1], processor.span_events[2])
8688
assert (
8789
processor.span_events[1][0].span_data.export().get("name")
8890
== "temporal:startActivity"
8991
)
92+
print("StartActivity span:", processor.span_events[1][0].span_id)
9093

91-
paired_span(processor.span_events[2], processor.span_events[3])
94+
paired_span(processor.span_events[3], processor.span_events[4])
9295
assert (
93-
processor.span_events[2][0].span_data.export().get("name")
96+
processor.span_events[3][0].span_data.export().get("name")
9497
== "temporal:executeActivity"
9598
)
99+
print("Execute Span parent:", processor.span_events[3][0].parent_id)
96100

97101
for span, start in processor.span_events[6:-6]:
98102
span_data = span.span_data.export()
@@ -113,28 +117,27 @@ def paired_span(a: tuple[Span[Any], bool], b: tuple[Span[Any], bool]) -> None:
113117
len(parents) == 2 and parents[0].span_data.export()["type"] == "agent"
114118
)
115119

116-
# Execute is parented to start
120+
# Execute is parented to the agent as well
117121
if span_data.get("name") == "temporal:executeActivity":
118122
parents = [
119123
s for (s, _) in processor.span_events if s.span_id == span.parent_id
120124
]
121125
assert (
122-
len(parents) == 2
123-
and parents[0].span_data.export()["name"] == "temporal:startActivity"
126+
len(parents) == 2 and parents[0].span_data.export()["type"] == "agent"
124127
)
125128

126129
# Final writer spans - There are only 3 because we don't make an actual model call
127130
paired_span(processor.span_events[-6], processor.span_events[-1])
128131
assert processor.span_events[-6][0].span_data.export().get("name") == "WriterAgent"
129132

130-
paired_span(processor.span_events[-5], processor.span_events[-2])
133+
paired_span(processor.span_events[-5], processor.span_events[-4])
131134
assert (
132135
processor.span_events[-5][0].span_data.export().get("name")
133136
== "temporal:startActivity"
134137
)
135138

136-
paired_span(processor.span_events[-4], processor.span_events[-3])
139+
paired_span(processor.span_events[-3], processor.span_events[-2])
137140
assert (
138-
processor.span_events[-4][0].span_data.export().get("name")
141+
processor.span_events[-3][0].span_data.export().get("name")
139142
== "temporal:executeActivity"
140143
)

0 commit comments

Comments
 (0)