use super::TelemetryConfig;
use crate::errors::ConfigurationError;
fn require_rate(field: &str, value: f64) -> Result<(), ConfigurationError> {
if !value.is_finite() || !(0.0..=1.0).contains(&value) {
return Err(ConfigurationError::new(format!(
"{field} must be in [0, 1], got {value}"
)));
}
Ok(())
}
fn require_non_negative(field: &str, value: f64) -> Result<(), ConfigurationError> {
if !value.is_finite() || value < 0.0 {
return Err(ConfigurationError::new(format!(
"{field} must be >= 0, got {value}"
)));
}
Ok(())
}
fn require_retries(field: &str, value: usize) -> Result<(), ConfigurationError> {
if value > super::MAX_EXPORTER_RETRIES {
return Err(ConfigurationError::new(format!(
"{field} must be at most {}, got {value}",
super::MAX_EXPORTER_RETRIES
)));
}
Ok(())
}
impl TelemetryConfig {
pub(crate) fn validate(&self) -> Result<(), ConfigurationError> {
require_rate("PROVIDE_SAMPLING_LOGS_RATE", self.sampling.logs_rate)?;
require_rate("PROVIDE_SAMPLING_TRACES_RATE", self.sampling.traces_rate)?;
require_rate("PROVIDE_SAMPLING_METRICS_RATE", self.sampling.metrics_rate)?;
require_rate("PROVIDE_TRACE_SAMPLE_RATE", self.tracing.sample_rate)?;
require_non_negative(
"PROVIDE_EXPORTER_LOGS_BACKOFF_SECONDS",
self.exporter.logs_backoff_seconds,
)?;
require_non_negative(
"PROVIDE_EXPORTER_TRACES_BACKOFF_SECONDS",
self.exporter.traces_backoff_seconds,
)?;
require_non_negative(
"PROVIDE_EXPORTER_METRICS_BACKOFF_SECONDS",
self.exporter.metrics_backoff_seconds,
)?;
require_non_negative(
"PROVIDE_EXPORTER_LOGS_TIMEOUT_SECONDS",
self.exporter.logs_timeout_seconds,
)?;
require_non_negative(
"PROVIDE_EXPORTER_TRACES_TIMEOUT_SECONDS",
self.exporter.traces_timeout_seconds,
)?;
require_non_negative(
"PROVIDE_EXPORTER_METRICS_TIMEOUT_SECONDS",
self.exporter.metrics_timeout_seconds,
)?;
require_non_negative(
"PROVIDE_EXPORTER_LOGS_SHUTDOWN_TIMEOUT_SECONDS",
self.exporter.logs_shutdown_timeout_seconds,
)?;
require_retries("PROVIDE_EXPORTER_LOGS_RETRIES", self.exporter.logs_retries)?;
require_retries(
"PROVIDE_EXPORTER_TRACES_RETRIES",
self.exporter.traces_retries,
)?;
require_retries(
"PROVIDE_EXPORTER_METRICS_RETRIES",
self.exporter.metrics_retries,
)?;
Ok(())
}
}
#[cfg(test)]
#[path = "validate_tests.rs"]
mod validate_tests;