use serde::{Deserialize, Serialize};
pub const DEFAULT_METRICS_ADDR: &str = "127.0.0.1:9100";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct MetricsConfig {
pub enabled: bool,
pub exporter_address: String,
pub client_metrics: bool,
pub server_metrics: bool,
}
impl Default for MetricsConfig {
fn default() -> Self {
Self {
enabled: false,
exporter_address: DEFAULT_METRICS_ADDR.to_string(),
client_metrics: true,
server_metrics: true,
}
}
}
impl MetricsConfig {
pub fn builder() -> MetricsConfigBuilder {
MetricsConfigBuilder::new()
}
pub fn merge(&mut self, other: MetricsConfig) {
if other.enabled {
self.enabled = other.enabled;
}
if other.exporter_address != DEFAULT_METRICS_ADDR {
self.exporter_address = other.exporter_address;
}
self.client_metrics = other.client_metrics;
self.server_metrics = other.server_metrics;
}
}
#[derive(Debug, Clone, Default)]
pub struct MetricsConfigBuilder {
config: MetricsConfig,
}
impl MetricsConfigBuilder {
pub fn new() -> Self {
Self { config: MetricsConfig::default() }
}
pub fn enabled(mut self, enabled: bool) -> Self {
self.config.enabled = enabled;
self
}
pub fn exporter_address(mut self, addr: impl Into<String>) -> Self {
self.config.exporter_address = addr.into();
self
}
pub fn client_metrics(mut self, enabled: bool) -> Self {
self.config.client_metrics = enabled;
self
}
pub fn server_metrics(mut self, enabled: bool) -> Self {
self.config.server_metrics = enabled;
self
}
pub fn build(self) -> MetricsConfig {
self.config
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metrics_config_default() {
let config = MetricsConfig::default();
assert!(!config.enabled);
assert_eq!(config.exporter_address, "127.0.0.1:9100");
assert!(config.client_metrics);
assert!(config.server_metrics);
}
#[test]
fn test_metrics_config_builder() {
let config = MetricsConfig::builder()
.enabled(true)
.exporter_address("0.0.0.0:9200")
.client_metrics(true)
.server_metrics(false)
.build();
assert!(config.enabled);
assert_eq!(config.exporter_address, "0.0.0.0:9200");
assert!(config.client_metrics);
assert!(!config.server_metrics);
}
#[test]
fn test_serde_roundtrip() {
let config =
MetricsConfig::builder().enabled(true).exporter_address("localhost:9100").build();
let toml = toml::to_string(&config).unwrap();
let parsed: MetricsConfig = toml::from_str(&toml).unwrap();
assert_eq!(config.enabled, parsed.enabled);
assert_eq!(config.exporter_address, parsed.exporter_address);
}
}