From 9b5daa0fef64b39a297ddd79a7d8ded6523aab39 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Thu, 10 Sep 2026 11:29:25 +0530 Subject: [PATCH] fix(sdk): add validation for export_timeout_millis <= 0 in BatchSpanProcessor --- .changelog/5648.fixed | 1 + .../opentelemetry/sdk/trace/export/__init__.py | 17 +++++++++++++++-- .../tests/trace/export/test_export.py | 10 ++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 .changelog/5648.fixed diff --git a/.changelog/5648.fixed b/.changelog/5648.fixed new file mode 100644 index 00000000000..085e6f1b66e --- /dev/null +++ b/.changelog/5648.fixed @@ -0,0 +1 @@ +`opentelemetry-sdk`: add validation for export_timeout_millis <= 0 in BatchSpanProcessor diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py index 525334173d8..07fe96c0dfc 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -180,7 +180,12 @@ def __init__( if export_timeout_millis is None: export_timeout_millis = BatchSpanProcessor._default_export_timeout_millis() - BatchSpanProcessor._validate_arguments(max_queue_size, schedule_delay_millis, max_export_batch_size) + BatchSpanProcessor._validate_arguments( + max_queue_size, + schedule_delay_millis, + max_export_batch_size, + export_timeout_millis, + ) self._batch_processor = BatchProcessor( span_exporter, @@ -274,7 +279,12 @@ def _default_export_timeout_millis(): return _DEFAULT_EXPORT_TIMEOUT_MILLIS @staticmethod - def _validate_arguments(max_queue_size, schedule_delay_millis, max_export_batch_size): + def _validate_arguments( + max_queue_size, + schedule_delay_millis, + max_export_batch_size, + export_timeout_millis=None, + ): if max_queue_size <= 0: raise ValueError("max_queue_size must be a positive integer.") @@ -287,6 +297,9 @@ def _validate_arguments(max_queue_size, schedule_delay_millis, max_export_batch_ if max_export_batch_size > max_queue_size: raise ValueError("max_export_batch_size must be less than or equal to max_queue_size.") + if export_timeout_millis is not None and export_timeout_millis <= 0: + raise ValueError("export_timeout_millis must be positive.") + class ConsoleSpanExporter(SpanExporter): """Implementation of :class:`SpanExporter` that prints spans to the diff --git a/opentelemetry-sdk/tests/trace/export/test_export.py b/opentelemetry-sdk/tests/trace/export/test_export.py index dc5ab0f5cc0..16655afe9b2 100644 --- a/opentelemetry-sdk/tests/trace/export/test_export.py +++ b/opentelemetry-sdk/tests/trace/export/test_export.py @@ -241,6 +241,16 @@ def test_args_env_var(self): self.assertEqual(batch_span_processor._batch_processor._export_timeout_millis, 4) batch_span_processor.shutdown() + def test_invalid_export_timeout_millis(self): + with self.assertRaises(ValueError): + export.BatchSpanProcessor( + MySpanExporter(destination=[]), export_timeout_millis=0 + ) + with self.assertRaises(ValueError): + export.BatchSpanProcessor( + MySpanExporter(destination=[]), export_timeout_millis=-500 + ) + def test_args_env_var_defaults(self): batch_span_processor = export.BatchSpanProcessor(MySpanExporter(destination=[]))