use crate::{TelemetryConfig, TelemetryError};
use cadence::{BufferedUdpMetricSink, QueuingMetricSink, StatsdClient};
use std::net::UdpSocket;
pub fn init_metrics(config: &TelemetryConfig) -> Result<(), TelemetryError> {
let tags_info = if config.global_tags.is_empty() {
String::new()
} else {
format!(
" with global tags: [{}]",
config
.global_tags
.iter()
.map(|(k, v)| format!("{}:{}", k, v))
.collect::<Vec<_>>()
.join(", ")
)
};
eprintln!(
"📊 Initializing metrics: {}:{} with prefix '{}'{}",
config.statsd_host, config.statsd_port, config.metrics_prefix, tags_info
);
let socket = UdpSocket::bind("0.0.0.0:0").map_err(TelemetryError::SocketBind)?;
let buffered =
BufferedUdpMetricSink::from((&config.statsd_host[..], config.statsd_port), socket)
.map_err(TelemetryError::SinkCreation)?;
let queued = QueuingMetricSink::from(buffered);
let mut builder = StatsdClient::builder(&config.metrics_prefix, queued);
for (key, value) in &config.global_tags {
builder = builder.with_tag(key, value);
}
let client = builder.build();
cadence_macros::set_global_default(client);
eprintln!("✅ Metrics initialized successfully");
Ok(())
}