diff --git a/.changelog/5693.fixed b/.changelog/5693.fixed new file mode 100644 index 00000000000..dce6d63839a --- /dev/null +++ b/.changelog/5693.fixed @@ -0,0 +1 @@ +`opentelemetry-sdk`: add validation for export_timeout_millis <= 0 in BatchSpanProcessor, BatchLogRecordProcessor, and PeriodicExportingMetricReader 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 d6ff7717eff..2d9738d8822 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py @@ -283,7 +283,7 @@ def __init__( if export_timeout_millis is None: export_timeout_millis = BatchLogRecordProcessor._default_export_timeout_millis() - BatchLogRecordProcessor._validate_arguments(max_queue_size, schedule_delay_millis, max_export_batch_size) + BatchLogRecordProcessor._validate_arguments(max_queue_size, schedule_delay_millis, max_export_batch_size, export_timeout_millis) # Initializes BatchProcessor self._batch_processor = BatchProcessor( exporter, @@ -378,7 +378,7 @@ 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): if max_queue_size <= 0: raise ValueError("max_queue_size must be a positive integer.") @@ -388,5 +388,8 @@ def _validate_arguments(max_queue_size, schedule_delay_millis, max_export_batch_ if max_export_batch_size <= 0: raise ValueError("max_export_batch_size must be a positive integer.") + if export_timeout_millis <= 0: + raise ValueError("export_timeout_millis must be positive.") + if max_export_batch_size > max_queue_size: raise ValueError("max_export_batch_size must be less than or equal to max_queue_size.") diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py index cb1040537d3..399280e39e1 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py @@ -460,7 +460,17 @@ def __init__( self._shutdown_event = Event() self._shutdown_once = Once() self._daemon_thread = None - if self._export_interval_millis > 0 and self._export_interval_millis < math.inf: + if self._export_interval_millis <= 0: + raise ValueError( + f"interval value {self._export_interval_millis} is invalid \ + and needs to be larger than zero." + ) + if self._export_timeout_millis <= 0: + raise ValueError( + f"timeout value {self._export_timeout_millis} is invalid \ + and needs to be larger than zero." + ) + if self._export_interval_millis < math.inf: self._daemon_thread = Thread( name="OtelPeriodicExportingMetricReader", target=self._ticker, @@ -475,11 +485,6 @@ def _after_in_child() -> None: at_fork() os.register_at_fork(after_in_child=_after_in_child) - elif self._export_interval_millis <= 0: - raise ValueError( - f"interval value {self._export_interval_millis} is invalid \ - and needs to be larger than zero." - ) def _at_fork_reinit(self): self._daemon_thread = Thread( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py index 525334173d8..c14959991c8 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -180,7 +180,7 @@ 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 +274,7 @@ 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): if max_queue_size <= 0: raise ValueError("max_queue_size must be a positive integer.") @@ -284,6 +284,9 @@ def _validate_arguments(max_queue_size, schedule_delay_millis, max_export_batch_ if max_export_batch_size <= 0: raise ValueError("max_export_batch_size must be a positive integer.") + if export_timeout_millis <= 0: + raise ValueError("export_timeout_millis must be positive.") + if max_export_batch_size > max_queue_size: raise ValueError("max_export_batch_size must be less than or equal to max_queue_size.")