oxur_cli/config/
metrics.rs1use serde::{Deserialize, Serialize};
6
7pub const DEFAULT_METRICS_ADDR: &str = "127.0.0.1:9100";
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
27#[serde(default)]
28pub struct MetricsConfig {
29 pub enabled: bool,
34
35 pub exporter_address: String,
40
41 pub client_metrics: bool,
46
47 pub server_metrics: bool,
52}
53
54impl Default for MetricsConfig {
55 fn default() -> Self {
56 Self {
57 enabled: false,
58 exporter_address: DEFAULT_METRICS_ADDR.to_string(),
59 client_metrics: true,
60 server_metrics: true,
61 }
62 }
63}
64
65impl MetricsConfig {
66 pub fn builder() -> MetricsConfigBuilder {
68 MetricsConfigBuilder::new()
69 }
70
71 pub fn merge(&mut self, other: MetricsConfig) {
75 if other.enabled {
77 self.enabled = other.enabled;
78 }
79 if other.exporter_address != DEFAULT_METRICS_ADDR {
80 self.exporter_address = other.exporter_address;
81 }
82 self.client_metrics = other.client_metrics;
84 self.server_metrics = other.server_metrics;
85 }
86}
87
88#[derive(Debug, Clone, Default)]
90pub struct MetricsConfigBuilder {
91 config: MetricsConfig,
92}
93
94impl MetricsConfigBuilder {
95 pub fn new() -> Self {
97 Self { config: MetricsConfig::default() }
98 }
99
100 pub fn enabled(mut self, enabled: bool) -> Self {
102 self.config.enabled = enabled;
103 self
104 }
105
106 pub fn exporter_address(mut self, addr: impl Into<String>) -> Self {
108 self.config.exporter_address = addr.into();
109 self
110 }
111
112 pub fn client_metrics(mut self, enabled: bool) -> Self {
114 self.config.client_metrics = enabled;
115 self
116 }
117
118 pub fn server_metrics(mut self, enabled: bool) -> Self {
120 self.config.server_metrics = enabled;
121 self
122 }
123
124 pub fn build(self) -> MetricsConfig {
126 self.config
127 }
128}
129
130#[cfg(test)]
131mod tests {
132 use super::*;
133
134 #[test]
135 fn test_metrics_config_default() {
136 let config = MetricsConfig::default();
137 assert!(!config.enabled);
138 assert_eq!(config.exporter_address, "127.0.0.1:9100");
139 assert!(config.client_metrics);
140 assert!(config.server_metrics);
141 }
142
143 #[test]
144 fn test_metrics_config_builder() {
145 let config = MetricsConfig::builder()
146 .enabled(true)
147 .exporter_address("0.0.0.0:9200")
148 .client_metrics(true)
149 .server_metrics(false)
150 .build();
151
152 assert!(config.enabled);
153 assert_eq!(config.exporter_address, "0.0.0.0:9200");
154 assert!(config.client_metrics);
155 assert!(!config.server_metrics);
156 }
157
158 #[test]
159 fn test_serde_roundtrip() {
160 let config =
161 MetricsConfig::builder().enabled(true).exporter_address("localhost:9100").build();
162
163 let toml = toml::to_string(&config).unwrap();
164 let parsed: MetricsConfig = toml::from_str(&toml).unwrap();
165
166 assert_eq!(config.enabled, parsed.enabled);
167 assert_eq!(config.exporter_address, parsed.exporter_address);
168 }
169}