Skip to content

Commit 7f0246c

Browse files
authored
Add force flush before exit (#24)
* Add force flush * Remove xdist method from test cov * Updates following PR * Restore accidentally deleted doc line!
1 parent 08b58c1 commit 7f0246c

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/pytest_opentelemetry/instrumentation.py

+16
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ def get_trace_parent(cls, config: Config) -> Optional[Context]:
4949

5050
return None
5151

52+
@classmethod
53+
def try_force_flush(cls) -> bool:
54+
provider = trace.get_tracer_provider()
55+
56+
# Not all providers (e.g. ProxyTraceProvider) implement force flush
57+
if hasattr(provider, 'force_flush'):
58+
provider.force_flush()
59+
return True
60+
else:
61+
return False
62+
5263
def pytest_configure(self, config: Config) -> None:
5364
self.trace_parent = self.get_trace_parent(config)
5465

@@ -75,7 +86,9 @@ def pytest_sessionfinish(self, session: Session) -> None:
7586
self.session_span.set_status(
7687
StatusCode.ERROR if self.has_error else StatusCode.OK
7788
)
89+
7890
self.session_span.end()
91+
self.try_force_flush()
7992

8093
@pytest.hookimpl(hookwrapper=True)
8194
def pytest_runtest_protocol(self, item: Item) -> Generator[None, None, None]:
@@ -159,3 +172,6 @@ def pytest_configure(self, config: Config) -> None:
159172
def pytest_configure_node(self, node: WorkerController) -> None: # pragma: no cover
160173
with trace.use_span(self.session_span, end_on_exit=False):
161174
propagate.inject(node.workerinput)
175+
176+
def pytest_xdist_node_collection_finished(node, ids): # pragma: no cover
177+
super().try_force_flush()

tests/test_sessions.py

+20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
from contextlib import contextmanager
33
from typing import Dict, Generator, Optional
4+
from unittest.mock import Mock, patch
45

56
from _pytest.pytester import Pytester
67
from opentelemetry import trace
@@ -184,3 +185,22 @@ def test_two():
184185
'00-1234567890abcdef1234567890abcdef-fedcba0987654321-01',
185186
)
186187
result.assert_outcomes(passed=2)
188+
189+
190+
@patch.object(trace, 'get_tracer_provider')
191+
def test_force_flush_with_supported_provider(mock_get_tracer_provider):
192+
provider = Mock()
193+
provider.force_flush = Mock(return_value=None)
194+
mock_get_tracer_provider.return_value = provider
195+
196+
for plugin in OpenTelemetryPlugin, XdistOpenTelemetryPlugin:
197+
assert plugin.try_force_flush() is True
198+
199+
200+
@patch.object(trace, 'get_tracer_provider')
201+
def test_force_flush_with_unsupported_provider(mock_get_tracer_provider):
202+
provider = Mock(spec=trace.ProxyTracerProvider)
203+
mock_get_tracer_provider.return_value = provider
204+
205+
for plugin in OpenTelemetryPlugin, XdistOpenTelemetryPlugin:
206+
assert plugin.try_force_flush() is False

0 commit comments

Comments
 (0)