d_engine/config/
monitoring.rs1use serde::Deserialize;
6use serde::Serialize;
7
8use crate::Error;
9use crate::Result;
10
11#[derive(Debug, Serialize, Deserialize, Clone)]
13pub struct MonitoringConfig {
14 #[serde(default = "default_prometheus_enabled")]
17 pub prometheus_enabled: bool,
18
19 #[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 pub fn validate(&self) -> Result<()> {
39 if self.prometheus_enabled {
40 if self.prometheus_port == 0 {
42 return Err(Error::InvalidConfig("prometheus_port cannot be 0 when enabled".into()));
43 }
44
45 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 #[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 #[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}