Skip to content

Commit e5cdad0

Browse files
tconley1428Sushisource
authored andcommitted
test: share OTEL tracer reset fixture
1 parent a51eb41 commit e5cdad0

5 files changed

Lines changed: 46 additions & 24 deletions

File tree

tests/conftest.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import sys
55
from collections.abc import AsyncGenerator, Iterator
66

7+
import opentelemetry.trace
78
import pytest
89
import pytest_asyncio
10+
from opentelemetry.util._once import Once
911

1012
from temporalio.client import Client
1113
from temporalio.testing import WorkflowEnvironment
@@ -196,3 +198,13 @@ def pytest_cmdline_main(config): # type: ignore[reportMissingParameterType, rep
196198
@pytest.fixture
197199
def continue_as_new_suggest_history_count() -> int:
198200
return CONTINUE_AS_NEW_SUGGEST_HISTORY_COUNT
201+
202+
203+
@pytest.fixture
204+
def reset_otel_tracer_provider():
205+
"""Reset global OpenTelemetry tracer provider state around tests."""
206+
opentelemetry.trace._TRACER_PROVIDER_SET_ONCE = Once()
207+
opentelemetry.trace._TRACER_PROVIDER = None
208+
yield
209+
opentelemetry.trace._TRACER_PROVIDER_SET_ONCE = Once()
210+
opentelemetry.trace._TRACER_PROVIDER = None

tests/contrib/google_adk_agents/test_google_adk_agents.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,10 @@ async def test_mcp_agent(client: Client, use_local_model: bool):
501501

502502

503503
@pytest.mark.asyncio
504-
async def test_single_agent_telemetry(client: Client):
504+
async def test_single_agent_telemetry(
505+
client: Client,
506+
reset_otel_tracer_provider, # type: ignore[reportUnusedParameter]
507+
):
505508
exporter = InMemorySpanExporter()
506509
provider = create_tracer_provider()
507510
provider.add_span_processor(SimpleSpanProcessor(exporter))

tests/contrib/openai_agents/test_openai_tracing.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -265,19 +265,16 @@ def print_otel_spans(spans: tuple[ReadableSpan, ...]):
265265
def set_test_tracer_provider() -> InMemorySpanExporter:
266266
exporter = InMemorySpanExporter()
267267

268-
# Reset global so tests don't conflict
269-
from opentelemetry.util._once import Once
270-
271-
opentelemetry.trace._TRACER_PROVIDER_SET_ONCE = Once()
272-
opentelemetry.trace._TRACER_PROVIDER = None
273-
274268
provider = create_tracer_provider()
275269
provider.add_span_processor(SimpleSpanProcessor(exporter))
276270
opentelemetry.trace.set_tracer_provider(provider)
277271
return exporter
278272

279273

280-
async def test_external_trace_to_workflow_spans(client: Client):
274+
async def test_external_trace_to_workflow_spans(
275+
client: Client,
276+
reset_otel_tracer_provider: Any, # type: ignore[reportUnusedParameter]
277+
):
281278
"""Test: External trace -> workflow spans (with worker restart)."""
282279
exporter = set_test_tracer_provider()
283280
workflow_id = None
@@ -364,7 +361,10 @@ async def ready() -> bool:
364361
), f"All spans should have unique IDs, got: {span_ids}"
365362

366363

367-
async def test_external_trace_and_span_to_workflow_spans(client: Client):
364+
async def test_external_trace_and_span_to_workflow_spans(
365+
client: Client,
366+
reset_otel_tracer_provider: Any, # type: ignore[reportUnusedParameter]
367+
):
368368
"""Test: External trace + span -> workflow spans (with worker restart)."""
369369
exporter = set_test_tracer_provider()
370370
workflow_id = None
@@ -461,7 +461,10 @@ async def ready() -> bool:
461461
), f"All spans should have unique IDs, got: {span_ids}"
462462

463463

464-
async def test_workflow_only_trace_to_spans(client: Client):
464+
async def test_workflow_only_trace_to_spans(
465+
client: Client,
466+
reset_otel_tracer_provider: Any, # type: ignore[reportUnusedParameter]
467+
):
465468
"""Test: Workflow-only trace -> spans (with worker restart)."""
466469
exporter = set_test_tracer_provider()
467470
workflow_id = None
@@ -551,7 +554,10 @@ async def run(self) -> str:
551554
return "done"
552555

553556

554-
async def test_custom_span_without_trace_context(client: Client):
557+
async def test_custom_span_without_trace_context(
558+
client: Client,
559+
reset_otel_tracer_provider: Any, # type: ignore[reportUnusedParameter]
560+
):
555561
"""Test that custom_span() without a trace context emits no spans.
556562
557563
This validates our hypothesis about why the main test fails:
@@ -591,7 +597,10 @@ async def test_custom_span_without_trace_context(client: Client):
591597
), f"Expected no spans without trace context, but found: {[s.name for s in spans]}"
592598

593599

594-
async def test_otel_tracing_in_runner(client: Client):
600+
async def test_otel_tracing_in_runner(
601+
client: Client,
602+
reset_otel_tracer_provider: Any, # type: ignore[reportUnusedParameter]
603+
):
595604
"""Test the tracing when executing an actual OpenAI Runner."""
596605
exporter = set_test_tracer_provider()
597606

@@ -750,7 +759,10 @@ def proceed(self) -> None:
750759
self._proceed = True
751760

752761

753-
async def test_sdk_trace_to_otel_span_parenting(client: Client):
762+
async def test_sdk_trace_to_otel_span_parenting(
763+
client: Client,
764+
reset_otel_tracer_provider: Any, # type: ignore[reportUnusedParameter]
765+
):
754766
"""Test that OTEL spans started in workflow are properly parented to client SDK trace."""
755767
exporter = set_test_tracer_provider()
756768
workflow_id = None

tests/contrib/opentelemetry/test_opentelemetry_plugin.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from opentelemetry.trace import (
1414
get_tracer,
1515
)
16-
from opentelemetry.util._once import Once
1716

1817
import temporalio.contrib.opentelemetry.workflow
1918
from temporalio import activity, nexus, workflow
@@ -30,16 +29,6 @@
3029
logger = logging.getLogger(__name__)
3130

3231

33-
@pytest.fixture
34-
def reset_otel_tracer_provider():
35-
"""Reset OpenTelemetry tracer provider state to allow multiple test runs."""
36-
opentelemetry.trace._TRACER_PROVIDER_SET_ONCE = Once()
37-
opentelemetry.trace._TRACER_PROVIDER = None
38-
yield
39-
opentelemetry.trace._TRACER_PROVIDER_SET_ONCE = Once()
40-
opentelemetry.trace._TRACER_PROVIDER = None
41-
42-
4332
@activity.defn
4433
async def simple_no_context_activity() -> str:
4534
with get_tracer(__name__).start_as_current_span("Activity"):

uv.lock

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)