d_engine/config/
monitoring.rs

1//! Monitoring configuration settings for the application.
2//!
3//! This module defines configuration parameters related to system monitoring,
4//! particularly for Prometheus metrics collection.
5use serde::Deserialize;
6use serde::Serialize;
7
8use crate::Error;
9use crate::Result;
10
11/// Configuration structure for monitoring features
12#[derive(Debug, Serialize, Deserialize, Clone)]
13pub struct MonitoringConfig {
14    /// Enables Prometheus metrics endpoint when set to true
15    /// Default value: false (via default_prometheus_enabled)
16    #[serde(default = "default_prometheus_enabled")]
17    pub prometheus_enabled: bool,
18
19    /// TCP port number for Prometheus metrics endpoint
20    /// Default value: 8080 (via default_prometheus_port)
21    #[serde(default = "default_prometheus_port")]
22    pub prometheus_port: u16,
23}
24impl Default for MonitoringConfig {
25    fn default() -> Self {
26        Self {
27            prometheus_enabled: default_prometheus_enabled(),
28            prometheus_port: default_prometheus_port(),
29        }
30    }
31}
32impl MonitoringConfig {
33    /// Validates monitoring configuration
34    /// # Errors
35    /// Returns `Error::InvalidConfig` when:
36    /// - Prometheus is enabled with invalid port
37    /// - Port conflicts with well-known services
38    pub fn validate(&self) -> Result<()> {
39        if self.prometheus_enabled {
40            // Validate port range
41            if self.prometheus_port == 0 {
42                return Err(Error::InvalidConfig("prometheus_port cannot be 0 when enabled".into()));
43            }
44
45            // Check privileged ports (requires root)
46            if self.prometheus_port < 1024 {
47                return Err(Error::InvalidConfig(format!(
48                    "prometheus_port {} is a privileged port (requires root)",
49                    self.prometheus_port
50                )));
51            }
52
53            // Verify port availability (runtime check)
54            #[cfg(not(test))]
55            {
56                use std::net::TcpListener;
57                if let Err(e) = TcpListener::bind(("0.0.0.0", self.prometheus_port)) {
58                    return Err(Error::InvalidConfig(format!(
59                        "prometheus_port {} unavailable: {}",
60                        self.prometheus_port, e
61                    )));
62                }
63            }
64        } else {
65            // Warn about unused port configuration
66            #[cfg(debug_assertions)]
67            if self.prometheus_port != default_prometheus_port() {
68                log::warn!(
69                    "prometheus_port configured to {} but monitoring is disabled",
70                    self.prometheus_port
71                );
72            }
73        }
74
75        Ok(())
76    }
77}
78fn default_prometheus_enabled() -> bool {
79    false
80}
81
82fn default_prometheus_port() -> u16 {
83    8080
84}