diff --git a/.changelog/5294.added b/.changelog/5294.added new file mode 100644 index 0000000000..cb0141c6e4 --- /dev/null +++ b/.changelog/5294.added @@ -0,0 +1 @@ +`opentelemetry-sdk`: add `force_flush` method to `LogRecordExporter` ABC diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py index 31d4b9667c..b852a51b69 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py @@ -119,6 +119,21 @@ def shutdown(self): Called when the SDK is shut down. """ + @abc.abstractmethod + def force_flush(self, timeout_millis: float = 10_000) -> bool: + """Hint to ensure that the export of any ``ReadableLogRecord`` objects + the exporter has received prior to the call to ``force_flush`` SHOULD be + completed as soon as possible, preferably before returning from this method. + + Args: + timeout_millis: The maximum amount of time to wait for the flush to + complete, in milliseconds. + + Returns: + ``True`` if the flush completed successfully within the timeout, + ``False`` otherwise. + """ + @deprecated( "Use LogRecordExporter. Since logs are not stable yet this WILL be removed in future releases." @@ -154,6 +169,9 @@ def export(self, batch: Sequence[ReadableLogRecord]): def shutdown(self): pass + def force_flush(self, timeout_millis: float = 10_000) -> bool: + return True + @deprecated( "Use ConsoleLogRecordExporter. Since logs are not stable yet this WILL be removed in future releases." diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py index 1f79374545..3b55a2531d 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py @@ -46,6 +46,9 @@ def export( def shutdown(self) -> None: self._stopped = True + def force_flush(self, timeout_millis: float = 10_000) -> bool: + return True + @deprecated( "Use InMemoryLogRecordExporter. Since logs are not stable yet this WILL be removed in future releases." diff --git a/opentelemetry-sdk/tests/logs/test_export.py b/opentelemetry-sdk/tests/logs/test_export.py index 06af6ef03a..cc242470a5 100644 --- a/opentelemetry-sdk/tests/logs/test_export.py +++ b/opentelemetry-sdk/tests/logs/test_export.py @@ -70,6 +70,9 @@ class Exporter(LogRecordExporter): def shutdown(self): pass + def force_flush(self, timeout_millis: float = 10_000) -> bool: + return True + def export(self, batch: Sequence[ReadableLogRecord]): logger = logging.getLogger("any logger..") logger.warning("Something happened.") @@ -929,3 +932,13 @@ def formatter(record): # pylint: disable=unused-argument exporter.export([EMPTY_LOG]) mock_stdout.write.assert_called_once_with(mock_record_str) + + def test_force_flush(self): + exporter = ConsoleLogRecordExporter() + self.assertTrue(exporter.force_flush()) + + +class TestInMemoryLogRecordExporter(unittest.TestCase): + def test_force_flush(self): + exporter = InMemoryLogRecordExporter() + self.assertTrue(exporter.force_flush()) diff --git a/opentelemetry-sdk/tests/test_configurator.py b/opentelemetry-sdk/tests/test_configurator.py index 67c82f4485..1926ead6f2 100644 --- a/opentelemetry-sdk/tests/test_configurator.py +++ b/opentelemetry-sdk/tests/test_configurator.py @@ -252,6 +252,9 @@ def export(self, batch): def shutdown(self): pass + def force_flush(self, timeout_millis: float = 10_000) -> bool: + return True + class CustomSampler(Sampler): def __init__(self) -> None: